我在 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。
使用
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)
}