【问题标题】:How to connect to Google Cloud Storage from Google Cloud Functions NodeJS如何从 Google Cloud Functions NodeJS 连接到 Google Cloud Storage
【发布时间】:2019-07-11 05:10:02
【问题描述】:

我有以下代码示例,它接收 bufferedImage 及其 mimeType,然后将其上传到 Google Cloud Storage。

一切正常,但由于某种原因,我的 Google Cloud Function 从 Storage API 收到 403 错误。

我必须做什么才能让我的 GC 函数访问 GC 存储?

我在文档中找不到任何可以告诉我如何执行此操作的内容。

const { Storage } = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

// Lists all buckets in the current project
const buckets = storage.getBuckets();

exports.uploadImage = (bucketName, fileName, imageBuffer, mimeType) => {
  return new Promise((resolve, reject) => {

    let bucket = storage.bucket(bucketName);

    let file = bucket.file(fileName);
    file.save(imageBuffer,
        {
            metadata: { contentType: `image/${mimeType}` },
        },
        ((error) => {
            error ? reject(error) : resolve()
        })
    );
  })
}

这是我遇到的错误

{"code":403,"errors":[{"domain":"global","re​​ason":"forbidden","message":"directed-galaxy-221521@appspot.gserviceaccount.com 没有有 storage.objects.create 访问 blog/e33f9c9d-65f0-4a7f-8332-29846f770e6d."}],"message":"directed-galaxy-221521@appspot.gserviceaccount.com 没有 storage.objects.create 访问博客/e33f9c9d-65f0-4a7f-8332-29846f770e6d。"}

【问题讨论】:

    标签: node.js google-cloud-storage google-cloud-functions


    【解决方案1】:

    云功能 (CF) 由特定服务帐户(在您的情况下为 directed-galaxy-221521@appspot.gserviceaccount.com)执行。来自Runtime service account

    在函数执行期间,Cloud Functions 使用服务帐号 PROJECT_ID@appspot.gserviceaccount.com 作为身份。

    由于您在访问存储桶/文件时遇到 403 错误,这意味着它们不可公开访问,因此您需要为上述服务帐户提供必要的访问权限(至少 storage.objects.create,错误消息中提到的)根据您为存储选择和配置的Access Control Option

    【讨论】:

    • 如果我不够清楚,我很抱歉。我知道我没有访问权限。我想知道如何让我的 gc 函数访问。我尝试去 IAM 并授予帐户管理员访问权限,但仍然无效。
    • 您需要给它一个role 和适当的storage permission。您提到的管理员权限(具体是哪一个?)是否满足此要求?
    • 是的,在 IAM 中,我为 directed-galaxy-221521@appspot.gserviceaccount.com 服务帐户分配了 Storage Admin 角色。当我选择它时,它表示它可以完全控制存储资源。我在启用服务时没有选择ACL 选项。
    【解决方案2】:

    显然,Google Cloud 存在一些问题。出于某种原因,我不允许写入存储桶,除非它已经创建。我将bucketName 更改为已经存在的存储桶,我收到了 200 响应。 Google Cloud 应该发送 404 响应而不是 403。403 具有误导性,因为 1. 我的服务确实具有存储桶创建权限,并且 2. 存储桶从一开始就不存在。这意味着404 Not Found 将是适当的响应。我希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-08-18
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      相关资源
      最近更新 更多