GCP Cloud Run:为云存储生成 V4 签名 URL 时“缺少必需的 GoogleAccessID”

问题描述 投票:0回答:1

我在 Google Cloud Run 上部署了一个 Go 应用程序,需要为 Google Cloud Storage 中的对象生成 V4 签名 URL。在本地,我正在使用 Go Storage 客户端并调用:

signedURL, err := storage.SignedURL(bucketName, objectPath, &storage.SignedURLOptions{
    Scheme:  storage.SigningSchemeV4,
    Method:  "GET",
    Expires: time.Now().Add(15 * time.Minute),
})

一切都已编译,但在 Cloud Run 上,我在日志中看到错误:

failed to generate signed URL: storage: missing required GoogleAccessID

我还使用本地服务帐户凭据 JSON 文件在本地运行相同的操作,该文件目前适用于将图像上传到云存储。该服务帐户已分配给我的 Cloud Run 服务(我可以在 gcloud run servicesdescribe 和控制台中看到它),并且我已将 Roles/iam.serviceAccountTokenCreator 授予项目级别的同一服务帐户。此外,还启用了 IAM 凭证 API。

我在这里遗漏了什么吗? enter image description here

go google-cloud-platform google-cloud-storage
1个回答
0
投票

使用

storage
包的
SignedURL
功能需要您提供服务帐户的电子邮件 (
GoogleAccessID
)。

如果您应该依赖应用程序默认凭据,则此功能需要额外的工作。

一般来说,最好创建一个

storage
客户端,然后在 SignedURL
 上使用 
Bucket
 方法。

package main

import (
    "context"
    "time"

    "cloud.google.com/go/storage"
)

func main() {
    ctx := context.Background()
    client, err := storage.NewClient(ctx)
    if err != nil {
        panic(err)
    }

    name := "..."
    object := "..."

    opts := &storage.SignedURLOptions{
        Scheme:  storage.SigningSchemeV4,
        Method:  "GET",
        Expires: time.Now().Add(15 * time.Minute),
    }
    signedURL, err := client.Bucket(name).SignedURL(object, opts)
    if err != nil {
        panic(err)
    }

    println(signedURL)
}
© www.soinside.com 2019 - 2024. All rights reserved.