我们有一个运行在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
是我们使用appengine.NewContext()
创建的 context.Context ,其中传入的 http.Request 对象作为参数; {{1} }是file
)
这会产生以下错误日志:
“ 2020-06-15 09:16:51.809 CEST 无法创建客户端:拨号:google:找不到默认凭据。有关更多信息,请参见https://developers.google.com/accounts/docs/application-default-credentials”
通过golang库跟踪错误,我们发现该应用程序似乎无法解析在元数据主机名上运行时应设置的元数据主机名。
我们已通过将其添加到 app.yaml 文件中来解决此问题,但是必须这样做:
google.golang.org/appengine/file
这会强制 metadata.go (https://github.com/googleapis/google-cloud-go/blob/master/compute/metadata/metadata.go#L117)中的env_variables:
GCE_METADATA_HOST: "169.254.169.254"
返回true,并让我们从存储中读取签名密钥。
这是我们需要解决的Google Cloud平台中的错误,还是上面的代码有什么问题?自从我们在2018年添加它以来,它一直运行良好,直到2020年6月部署代码时才开始失败,并且仅中断了客户端JavaScript代码更改的部署而未触及golang后端。我们尝试了几次重新部署,但是在添加解决方法之前,该错误消息是100%可重现的。