ОТВЕТ:
В основном, решение настраивает конфигурации ONCE, а затем перед запуском bq установите переменную CLOUDSDK_ACTIVE_CONFIG_NAME в нужную вам конфигурацию.НЕ используйте gcloud в процессах ETL, чтобы не касаться каталога конфигурации.
Запустите это ОДИН РАЗ вручную на сервере:
gcloud config configurations create GCP_PROJECT_CONFIG_NAME
gcloud config set project GCP_PROJECT
gcloud auth activate-service-account --key-file=key.json --project=GCP_PROJECT
gcloud config configurations activate GCP_PROJECT_CONFIG_NAME
И затем перед выполнением bq экспортируйте эту переменную:
export CLOUDSDK_ACTIVE_CONFIG_NAME=GCP_PROJECT_CONFIG
bq query 'select "this will work!"'
ОРИГИНАЛЬНЫЙ ВОПРОС:
Я использую bq
команду CLI в процессах ETL и хотел бы проходить аутентификацию без использования gcloud.Я понимаю, что для аутентификации рекомендуется использовать команду gcloud, однако она вызывает проблемы в сценарии, в котором:
- Существует несколько процессов ETL-GCP, работающих под одним и тем же пользователем ОС
- Эти процессы аутентифицируются одновременно с использованием разных учетных записей служб и записи в разные проекты
Конфигурация учетных данных хранится в домашнем каталоге пользователя в ~ / .config / gcloud.gcloud изменяет его при аутентификации (например, устанавливает файл учетной записи проекта и службы).Когда несколько процессов аутентифицируются одновременно, они перезаписывают конфигурации друг друга или просто повреждают файлы.Конечным результатом является то, что мы не можем использовать команду bq, пока не исправим вручную конфигурацию
Я попытался передать параметр bigqueryrc, чтобы указать bq на правый ключ и проект, но bq, похоже, полностью его игнорирует.
export BIGQUERYRC=my_config_path && bq query...
export BIGQUERYRC=my_config_path && bq --bigqueryrc $BIGQUERYRC query ...
Также попытался указать эти параметры внутри команды:
bq --service_account_credential_file $PATH --project_id $PROJECT query ...
Myconfig выглядит следующим образом:
credential_file = path/file.json
project_id = project_id
location = EU
Когда я запускаю выше, команда bq просто принимает значения по умолчанию, установленные gcloud.Ошибка говорит о том, что учетная запись службы не аутентифицирована для запроса проекта - эта учетная запись службы была установлена другим процессом, который выполнялся параллельно / незадолго до моей команды.Я попытался установить несколько конфигураций gcloud, но они, к сожалению, сохраняют состояние в домашнем каталоге пользователя, а не сохраняют состояние для сеанса оболочки.Поэтому, когда я устанавливаю учетную запись службы проекта / идентификатора для своего процесса, она распространяется на все сеансы оболочки, когда мы разделяем состояние.
Есть идеи, как решить эту проблему?
Ссылки: Команда BQ