如何从Google Cloud Functions NodeJS连接到Google Cloud Storage

5

我有以下代码示例,它接收一个缓冲图像和它的MIME类型,然后将其上传到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","reason":"forbidden","message":"directed-galaxy-221521@appspot.gserviceaccount.com无法访问blog/e33f9c9d-65f0-4a7f-8332-29846f770e6d,没有storage.objects.create权限。"}],"message":"directed-galaxy-221521@appspot.gserviceaccount.com无法访问blog/e33f9c9d-65f0-4a7f-8332-29846f770e6d,没有storage.objects.create权限。"}

2个回答

5
一个云函数(CF)是由特定的服务帐户(在您的情况下为directed-galaxy-221521@appspot.gserviceaccount.com)执行的。来自运行时服务帐户

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

由于访问您的存储桶/文件时出现403错误,这意味着它们不是公开可访问的,因此您需要根据您选择和配置的访问控制选项为上述服务帐户授予必要的访问权限(至少包括错误消息中提到的storage.objects.create)。请注意保留HTML标记。

很抱歉如果我表达不够清楚。我知道我没有权限。我想知道如何给我的gc函数访问权限。我尝试去IAM并给予该账户管理员权限,但仍然无法工作。 - Miguel Coder
您需要为其分配适当的存储权限,并赋予其一个角色。您提到的管理员访问权限(具体是哪个?)是否符合此要求? - Dan Cornilescu
是的,在IAM中,我给了 directed-galaxy-221521@appspot.gserviceaccount.com 服务账户 Storage Admin 角色。当我选择它时,它显示该账户对存储资源拥有完全控制权。在启用服务时,我没有选择 ACL 选项。 - Miguel Coder

3

显然谷歌云存在一些故障。出于某种原因,我无法在没有已创建的存储桶时向存储桶写入内容。我将bucketName更改为一个已经存在的存储桶,结果收到了200响应。谷歌云应该发送404响应,而不是403。403会产生误导,因为1.我的服务确实有创建存储桶的权限,2.存储桶从未存在过。这意味着404 Not Found是适当的响应。希望这能帮助到某些人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接