首页 > 解决方案 > 如何从 Google Cloud Functions NodeJS 连接到 Google Cloud Storage

问题描述

我有以下代码示例,它接收 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 没有存储空间。 objects.create 访问 blog/e33f9c9d-65f0-4a7f-8332-29846f770e6d."}],"message":"directed-galaxy-221521@appspot.gserviceaccount.com 没有 storage.objects.create 访问 blog/e33f9c9d -65f0-4a7f-8332-29846f770e6d。”}

标签: node.jsgoogle-cloud-storagegoogle-cloud-functions

解决方案


云功能(CF)由特定的服务帐户(在您的情况下directed-galaxy-221521@appspot.gserviceaccount.com)执行。从运行时服务帐户

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

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


推荐阅读