У нас есть приложение Golang, работающее в Google App Engine, которое считывает ключ подписи с использованием 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
- это context.Context мы создаем, используя appengine.NewContext()
с входящим объектом http.Request в качестве параметра; file
is google.golang.org/appengine/file
)
Это привело к следующему журналу ошибок:
"2020-06-15 09: 16: 51.809 CEST не удалось создать клиента: dialing: 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()
в метаданных. go (https://github.com/googleapis/google-cloud-go/blob/master/compute/metadata/metadata.go#L117), чтобы вернуть истину, и позволяет нам d ключ подписи из хранилища.
Это ошибка платформы Google Cloud, которую нам нужно исправить, или что-то не так с приведенным выше кодом? Он работал нормально с тех пор, как мы добавили его в 2018 году, и только начал давать сбой при развертывании кода в июне 2020 года, а развертывание, которое сломалось, содержало только изменения в коде клиента JavaScript, бэкэнд golang не был затронут. Мы пытались повторно развернуть его несколько раз, но сообщение об ошибке было на 100% воспроизводимым, пока мы не добавили обходной путь.