Я пишу программу, которая говорит с Cloud Spanner на диалекте Postgres. Мое приложение представляет собой сервер gin, и я использую pgadapter для подключения, как указано в этом документе.
Мое приложение отлично работает локально. Но когда я развертываю его в облаке, я получаю следующий журнал.
Ошибка в основном возникает из-за функции StartPGAdapterWithCredentials
.
func StartPGAdapter(ctx context.Context, project, instance string) (port int, cleanup func(), err error) {
credentials, err := google.FindDefaultCredentials(ctx)
fmt.Println("credentials " + (credentials.ProjectID) + "json " + utils.ToString(credentials.JSON) + "ts " + utils.ToString(credentials.TokenSource))
if err != nil {
return 0, func() {}, err
}
return StartPGAdapterWithCredentials(ctx, project, instance, credentials)
}
func StartPGAdapterWithCredentials(ctx context.Context, project, instance string, credentials *google.Credentials) (port int, cleanup func(), err error) {
if credentials == nil {
return 0, func() {}, fmt.Errorf("credentials cannot be nil")
}
if credentials.JSON == nil || len(credentials.JSON) == 0 {
return 0, func() {}, fmt.Errorf("only JSON based credentials are supported")
}
credentialsFile, err := os.CreateTemp(os.TempDir(), "pgadapter-credentials")
if err != nil {
return 0, func() {}, err
}
В моей локальной системе установлен GOOGLE_APPLICATION_CREDENTIALS
и, следовательно, он может получить учетные данные. Однако это не работает в облаке.
Как заставить его работать в облаке?
Дополнительная информация: следуйте примеру, представленному здесь.
Привет @Matteo, спасибо за комментарий. Но, как упоминалось в вопросе, код отлично работает при локальной настройке. Он не работает в облаке. Я не устанавливаю там никаких GOOGLE_APPLICATION_CREDENTIALS. Я предполагаю, что это должно быть получено с известного сервера файлов или метаданных или чего-то еще...
Как запустить PGAdapter? В вашем контейнере? Можете показать эту часть?
Я следую этому примеру github.com/GoogleCloudPlatform/pgadapter/blob/…
Сервер метаданных Cloud Run не возвращает учетные данные JSON. Он возвращает токен OAuth. Я не знаком с этой библиотекой, но для кода требуются учетные данные JSON (файл JSON учетной записи службы).
Я вызываю эту функцию (FindDefaultCredentials) pkg.go.dev/golang.org/x/oauth2/google#FindDefaultCredentials. Вы говорите, что для работы требуется файл JSON учетной записи службы? Как мне тогда развернуть это в облаке? Я думаю, у приложений должен быть способ получить доступ к служебной учетной записи, связанной с ревизией...
Cloud Run не предоставляет доступ к учетным данным JSON базовой учетной записи службы. Cloud Run предоставляет токены OAuth и OIDC. Код, который вы используете, требует учетных данных JSON.
Похоже, вы пытаетесь запустить PGAdapter во встроенном контейнере в Cloud Run, а затем скопировать учетные данные служебной учетной записи из вашей среды во встроенный контейнер PGAdapter. Проблема в том, что Cloud Run не предоставляет доступ к базовому файлу учетной записи службы. Вместо этого вы должны просто позволить библиотекам Google Cloud получить учетные данные среды по умолчанию.
Сложность в вашем примере заключается в том, что вы запускаете PGAdapter во встроенном контейнере, а это означает, что в этой среде нет учетных данных по умолчанию. Рекомендуемый способ запуска PGAdapter в Cloud Run — включить его в основной контейнер. Это позволит PGAdapter просто получить учетные данные по умолчанию, предоставленные Cloud Run. Это означает, что вы не должны указывать аргумент -c /path/to/credentials.json
при запуске PGAdapter.
Есть (по крайней мере) два способа включить PGAdapter в ваш основной контейнер:
.jar
в свой образ Docker и запустите PGAdapter в своем контейнере. См. [этот пример], чтобы узнать, как запустить PGAdapter непосредственно из файлов .jar
. Это также требует, чтобы вы добавили Java JRE в свой образ Docker.ENTRYPOINT
базового изображения.См. Образец запуска PGAdapter Cloud для Go для обширного (запускаемого) примера для последнего варианта.
Убедитесь, что
GOOGLE_APPLICATION_CREDENTIALS
указывает на действительный файл json, который содержит учетные данные учетной записи службы. Смотрите также github.com/GoogleCloudPlatform/golang-samples/blob/…