Заблокирован из моего файла состояния терраформирования с 403; Как определить учетную запись, выполняющую инициализацию terraform?

TL;DR: как мне указать учетную запись пользователя/электронную почту для операций терраформирования, таких как terraform init? Как узнать, какая электронная почта используется по умолчанию?

Подробности :

У меня есть удаленное состояние terraform в gcp bucket, к сожалению, я как-то заблокировался; от операций по терраформированию, а не от организации.

Я проверил свой доступ через gcloud и gsutil, используя олицетворение служебной учетной записи, и, похоже, они могут читать/записывать в сегмент состояния через.

gsutil -i "terraform-admin@<project-id>.iam.gserviceaccount.com" cp test-file.txt gs://<state-bucket-id>/terraform.tfstate/test-file.txt

Я также проверил, что роль iam.serviceAccountTokenCreator хорошо связана с учетной записью пользователя, которая должна выдавать себя за учетную запись службы с более высоким уровнем администратора.

Когда я пытаюсь сделать terraform init, я получаю:

│ Error: Failed to get existing workspaces: querying Cloud Storage failed: Get "https://storage.googleapis.com/storage/v1/b/<project-bucket-state-for-workspace>/o?alt=json&delimiter=%2F&pageToken=&prefix=terraform.tfstate%2F&prettyPrint=false&projection=full&versions=false": impersonate: status code 403: {
│   "error": {
│     "code": 403,
│     "message": "The caller does not have permission",
│     "status": "PERMISSION_DENIED"
│   }
│ }

Я также пытался пройти аутентификацию через gcloud auth login в учетной записи администратора, но все равно получаю ту же ошибку. Это должно означать, что terraform не использует правильный аккаунт/электронную почту для выполнения init..

Обновлено: включение журналов на стороне клиента через export TF_LOGS=TRACE

2022-11-21T01:40:23.350+0100 [INFO]  Terraform version: 1.3.4
2022-11-21T01:40:23.351+0100 [DEBUG] using github.com/hashicorp/go-tfe v1.9.0
2022-11-21T01:40:23.351+0100 [DEBUG] using github.com/hashicorp/hcl/v2 v2.14.1
2022-11-21T01:40:23.351+0100 [DEBUG] using github.com/hashicorp/terraform-config-inspect v0.0.0-20210209133302-4fd17a0faac2
2022-11-21T01:40:23.351+0100 [DEBUG] using github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734
2022-11-21T01:40:23.351+0100 [DEBUG] using github.com/zclconf/go-cty v1.12.0
2022-11-21T01:40:23.351+0100 [INFO]  Go runtime version: go1.19.3
2022-11-21T01:40:23.351+0100 [INFO]  CLI args: []string{"terraform", "init"}
2022-11-21T01:40:23.351+0100 [TRACE] Stdout is a terminal of width 156
2022-11-21T01:40:23.351+0100 [TRACE] Stderr is a terminal of width 156
2022-11-21T01:40:23.351+0100 [TRACE] Stdin is a terminal
2022-11-21T01:40:23.351+0100 [DEBUG] Attempting to open CLI config file: /home/<user>/.terraformrc
2022-11-21T01:40:23.351+0100 [DEBUG] File doesn't exist, but doesn't need to. Ignoring.
2022-11-21T01:40:23.351+0100 [DEBUG] ignoring non-existing provider search directory terraform.d/plugins
2022-11-21T01:40:23.351+0100 [DEBUG] ignoring non-existing provider search directory /home/<user>/.terraform.d/plugins
2022-11-21T01:40:23.351+0100 [DEBUG] ignoring non-existing provider search directory /home/<user>/.local/share/terraform/plugins
2022-11-21T01:40:23.351+0100 [DEBUG] ignoring non-existing provider search directory /usr/local/share/terraform/plugins
2022-11-21T01:40:23.351+0100 [DEBUG] ignoring non-existing provider search directory /usr/share/terraform/plugins
2022-11-21T01:40:23.351+0100 [DEBUG] ignoring non-existing provider search directory /var/lib/snapd/desktop/terraform/plugins
2022-11-21T01:40:23.351+0100 [INFO]  CLI command args: []string{"init"}
Initializing modules...
2022-11-21T01:40:23.358+0100 [TRACE] ModuleInstaller: installing child modules for . into .terraform/modules
2022-11-21T01:40:23.363+0100 [DEBUG] Module installer: begin dev-omni-orchestrator-instance
2022-11-21T01:40:23.367+0100 [TRACE] ModuleInstaller: Module installer: dev-omni-orchestrator-instance <nil> already installed in ../modules/omni-orchestrator
2022-11-21T01:40:23.367+0100 [DEBUG] Module installer: begin gcs-infra-genesis-state-buckets
2022-11-21T01:40:23.370+0100 [TRACE] ModuleInstaller: Module installer: gcs-<terraform-project>-state-buckets 3.4.0 already installed in .terraform/modules/gcs-<terraform-project>-state-buckets
2022-11-21T01:40:23.370+0100 [TRACE] modsdir: writing modules manifest to .terraform/modules/modules.json

Initializing the backend...
2022-11-21T01:40:23.382+0100 [TRACE] Meta.Backend: built configuration for "gcs" backend with hash value <V1>
2022-11-21T01:40:23.382+0100 [TRACE] Meta.Backend: backend has not previously been initialized in this working directory
2022-11-21T01:40:23.382+0100 [DEBUG] New state was assigned lineage "<V2>"
2022-11-21T01:40:23.382+0100 [TRACE] Meta.Backend: moving from default local state only to "gcs" backend
2022-11-21T01:40:23.382+0100 [DEBUG] checking for provisioner in "."
2022-11-21T01:40:23.384+0100 [DEBUG] checking for provisioner in "/usr/bin"
2022-11-21T01:40:23.384+0100 [TRACE] backend/local: state manager for workspace "default" will:
 - read initial snapshot from terraform.tfstate
 - write new snapshots to terraform.tfstate
 - create any backup at terraform.tfstate.backup
2022-11-21T01:40:23.384+0100 [TRACE] statemgr.Filesystem: reading initial snapshot from terraform.tfstate
2022-11-21T01:40:23.384+0100 [TRACE] statemgr.Filesystem: snapshot file has nil snapshot, but that's okay
2022-11-21T01:40:23.384+0100 [TRACE] statemgr.Filesystem: read nil snapshot
2022-11-21T01:40:23.384+0100 [TRACE] Meta.Backend: ignoring local "default" workspace because its state is empty
2022-11-21T01:40:23.385+0100 [DEBUG] New state was assigned lineage "<V3>"
╷
│ Error: Failed to get existing workspaces: querying Cloud Storage failed: Get "https://storage.googleapis.com/storage/v1/b/<terraform-project>-terraform-state/o?alt=json&delimiter=%2F&pageToken=&prefix=terraform.tfstate%2F&prettyPrint=false&projection=full&versions=false": impersonate: status code 403: {
│   "error": {
│     "code": 403,
│     "message": "The caller does not have permission",
│     "status": "PERMISSION_DENIED"
│   }
│ }
│

Terraform не хранит данные аутентификации, вы либо предоставите их в конфигурации провайдера в ваших файлах terraform (не очень хорошая идея), либо вы установите их с помощью env vars или передадите их в backend-config. Registry.terraform.io/providers/hashicorp/google/latest/docs‌​/…

Chris Doyle 21.11.2022 01:32

Да, мои бэкенд-конфигурации используют вышеупомянутые terraform-admin@<project-id>.iam.gserviceaccount.com, у кого есть полные права доступа... Я действительно в тупике

Imad 21.11.2022 01:36

@ChrisDoyle есть идеи, как я могу подойти к отладке этого?

Imad 21.11.2022 01:36

Вы можете увеличить ведение журнала terraform, установив переменную, например TF_LOG=DEBUG, которая включит подробное ведение журнала и должна показать вам базовый API и параметры, которые отправляются при аутентификации.

Chris Doyle 21.11.2022 01:38

Боюсь, это не сильно поможет, я выложу логи, так как я анонимизирую некоторые из них.

Imad 21.11.2022 01:41

Вы также должны иметь возможность смотреть со стороны облака. Я не пользователь GCP, но в AWS я бы посмотрел cloudtrail, где я мог бы увидеть все запросы на доступ к API, и посмотреть на те, которые были возвращены с ошибкой 403, чтобы идентифицировать пользователя, вызвавшего API.

Chris Doyle 21.11.2022 01:42

OK I4m, вероятно, делает что-то не так, но нет журналов ни в сервисе logging в gcp для операторов API, ни когда я создаю корзину для хранения журналов операций в корзине ... Руководство, которое я использовал: cloud.google. com/storage/docs/журналы доступа

Imad 21.11.2022 01:59
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
7
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Ответ таков:

gcloud auth application-default login

Убедитесь, что все ваши учетные данные избыточно установлены в соответствии с произвольными, плохо документированными правилами gcloud.

Вот несколько, которые я использовал до сих пор, чтобы ответить для разных целей:

gcloud auth login
gcloud auth application-default login
gcloud auth login --no-browser
gcloud config configurations create <...>

Я уже проверял свой статус аутентификации с помощью gcloud auth list, который указывал на нужную учетную запись, но этого недостаточно. Я редко выражаю разочарование или эмоции в stackoverflow, но это довольно плохо.

Этот пост помог.

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