Не удается найти учетные данные по умолчанию в Cloud Run

Я пишу программу, которая говорит с 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 и, следовательно, он может получить учетные данные. Однако это не работает в облаке.

Как заставить его работать в облаке?

Дополнительная информация: следуйте примеру, представленному здесь.

Убедитесь, что GOOGLE_APPLICATION_CREDENTIALS указывает на действительный файл json, который содержит учетные данные учетной записи службы. Смотрите также github.com/GoogleCloudPlatform/golang-samples/blob/…

Matteo 04.04.2023 14:53

Привет @Matteo, спасибо за комментарий. Но, как упоминалось в вопросе, код отлично работает при локальной настройке. Он не работает в облаке. Я не устанавливаю там никаких GOOGLE_APPLICATION_CREDENTIALS. Я предполагаю, что это должно быть получено с известного сервера файлов или метаданных или чего-то еще...

positron 04.04.2023 14:59

Как запустить PGAdapter? В вашем контейнере? Можете показать эту часть?

guillaume blaquiere 04.04.2023 16:03

Я следую этому примеру github.com/GoogleCloudPlatform/pgadapter/blob/…

positron 04.04.2023 20:01

Сервер метаданных Cloud Run не возвращает учетные данные JSON. Он возвращает токен OAuth. Я не знаком с этой библиотекой, но для кода требуются учетные данные JSON (файл JSON учетной записи службы).

John Hanley 04.04.2023 20:49

Я вызываю эту функцию (FindDefaultCredentials) pkg.go.dev/golang.org/x/oauth2/google#FindDefaultCredentials‌​. Вы говорите, что для работы требуется файл JSON учетной записи службы? Как мне тогда развернуть это в облаке? Я думаю, у приложений должен быть способ получить доступ к служебной учетной записи, связанной с ревизией...

positron 04.04.2023 21:11

Cloud Run не предоставляет доступ к учетным данным JSON базовой учетной записи службы. Cloud Run предоставляет токены OAuth и OIDC. Код, который вы используете, требует учетных данных JSON.

John Hanley 04.04.2023 21:25
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
4
7
108
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы пытаетесь запустить PGAdapter во встроенном контейнере в Cloud Run, а затем скопировать учетные данные служебной учетной записи из вашей среды во встроенный контейнер PGAdapter. Проблема в том, что Cloud Run не предоставляет доступ к базовому файлу учетной записи службы. Вместо этого вы должны просто позволить библиотекам Google Cloud получить учетные данные среды по умолчанию.

Сложность в вашем примере заключается в том, что вы запускаете PGAdapter во встроенном контейнере, а это означает, что в этой среде нет учетных данных по умолчанию. Рекомендуемый способ запуска PGAdapter в Cloud Run — включить его в основной контейнер. Это позволит PGAdapter просто получить учетные данные по умолчанию, предоставленные Cloud Run. Это означает, что вы не должны указывать аргумент -c /path/to/credentials.json при запуске PGAdapter.

Есть (по крайней мере) два способа включить PGAdapter в ваш основной контейнер:

  1. Добавьте сборку файла Java .jar в свой образ Docker и запустите PGAdapter в своем контейнере. См. [этот пример], чтобы узнать, как запустить PGAdapter непосредственно из файлов .jar. Это также требует, чтобы вы добавили Java JRE в свой образ Docker.
  2. Пусть ваша сборка Docker расширяет базовый образ Docker PGAdapter. Это автоматически включает все зависимости, необходимые для PGAdapter. Вам придется переопределить ENTRYPOINT базового изображения.

См. Образец запуска PGAdapter Cloud для Go для обширного (запускаемого) примера для последнего варианта.

Другие вопросы по теме