我们在 Google App Engine 中运行了一个 Golang 应用程序,它使用cloud.google.com/go/storage
. 在尝试部署新更新的版本时,它开始收到错误消息,提示找不到默认凭据,因此无法访问存储。
bucketName, err := file.DefaultBucketName(ctx)
if err != nil {
log.Errorf(ctx, "failed to get default GCS bucket name: %v", err)
return nil, nil, err
}
client, err = storage.NewClient(ctx)
if err != nil {
log.Errorf(ctx, "failed to create client: %v", err)
return nil, nil, err
}
(ctx
是我们使用传入的http.Request对象作为参数创建的context.Context ;是)appengine.NewContext()
file
google.golang.org/appengine/file
这产生了这个错误日志:
“2020-06-15 09:16:51.809 CEST 未能创建客户端:拨号:google:找不到默认凭据。有关更多信息,请参阅https://developers.google.com/accounts/docs/application-default-credentials "
通过 golang 库跟踪错误,我们发现应用程序似乎无法解析在 Google Cloud 平台上运行时应该设置的元数据主机名。
我们已经通过将它添加到app.yaml文件中解决了这个问题,但是这样做感觉不对:
env_variables:
GCE_METADATA_HOST: "169.254.169.254"
testOnGCE()
这会强制metadata.go ( https://github.com/googleapis/google-cloud-go/blob/master/compute/metadata/metadata.go#L117 ) 返回 true,并让我们从存储中读取签名密钥.
这是我们需要解决的 Google Cloud 平台中的错误,还是上面的代码有什么问题?自从我们在 2018 年添加它以来,它一直运行良好,直到 2020 年 6 月部署代码时才开始失败,并且破坏的部署仅包含对客户端 JavaScript 代码的更改,没有触及 golang 后端。我们尝试重新部署它几次,但在我们添加解决方法之前,错误消息是 100% 可重现的。