Я использую Terraform для автоматизации многих операций с GCP, потому что щелкать мышью - это плохо. У меня есть проект «общих служб», который я пытаюсь использовать для управления другими проектами. Я пытаюсь настроить новую среду в другом проекте, и мне нужна учетная запись службы в проекте общих служб для управления ресурсами. (Я не хочу вручную создавать новую учетную запись службы для каждого проекта)
Я пытаюсь создать учетную запись службы в новом проекте, используя учетную запись службы общих служб. У учетной записи общих служб есть разрешения на уровне организации, но я пытался добавить разрешения на уровне проекта, чтобы решить эту проблему.
Вот результат gcloud projects get-iam-policy newproject
(нерелевантная информация удалена, переименована):
bindings:
- members:
- serviceAccount:terraform@shared-services-####.iam.gserviceaccount.com
role: roles/editor
- members:
- serviceAccount:terraform@shared-services-####.iam.gserviceaccount.com
role: roles/iam.serviceAccountAdmin
- members:
- serviceAccount:terraform@shared-services-####.iam.gserviceaccount.com
role: roles/iam.serviceAccountKeyAdmin
- members:
- serviceAccount:terraform@shared-services-####.iam.gserviceaccount.com
role: roles/resourcemanager.projectIamAdmin
etag: BwWGI28ti_w=
version: 1
Вот результат, который я получаю при попытке запустить тестовую команду:
> gcloud iam service-accounts get-iam-policy new-service-account@newproject.iam.gserviceaccount.com --project=newproject --impersonate-service-account=terraform@shared-services-####.iam.gserviceaccount.com
WARNING: This command is using service account impersonation. All API calls will be executed as [terraform@shared-services-####.iam.gserviceaccount.com].
ERROR: (gcloud.iam.service-accounts.get-iam-policy) PERMISSION_DENIED: The caller does not have permission
В ссылка на разрешения утверждает, что roles/iam.serviceAccountAdmin
предоставляет это разрешение.
Вот результат, который дает мне Terraform (я знаю, что это другая операция):
Error 403: Permission iam.serviceAccounts.get is required to perform this operation on service account projects/-/serviceAccounts/new-service-account@newproject.iam.gserviceaccount.com., forbidden
Я создал новую учетную запись службы вручную для этого конкретного случая, потому что я еще не настроил остальную часть инфраструктуры (которая создала бы учетную запись как часть его процесса). Я хотел убедиться, что это сработало.
Любые идеи? Насколько я могу судить, я предоставил необходимые мне разрешения. Помогите?
Изменить: О, я проверил пробуя API, и я получаю 403 в качестве учетной записи пользователя, у которой должен быть администратор организации:
{
"error": {
"code": 403,
"message": "Permission iam.serviceAccounts.get is required to perform this operation on service account projects/-/serviceAccounts/new-service-account@newproject.iam.gserviceaccount.com.",
"status": "PERMISSION_DENIED"
}
}
Я полностью запутался
Вы, наверное, использовали google_project_iam_policy
ресурс неправильно и перезаписал конфигурацию политики IAM по умолчанию для проекта с неправильной политикой (не спрашивайте, откуда я это знаю ...)
google_project_iam_policy
это очень опасный ресурс в Terraform, и в документации недостаточно подчеркивается, насколько он опасен. Проблема в том, что установка IAM-политики заменяет ваш проект весь Конфигурация IAM с определенной вами политикой IAM. Все автоматически созданные разрешения учетной записи службы по умолчанию удаляются, если вы специально не включили их в определение политики.
Исправить свой проект можно, но непросто. Вам необходимо найти все учетные записи служб, которые нужны вашему проекту, и добавить правильные разрешения. Вывод ошибок из TF_LOG=TRACE terraform apply
может направить вас. Политика IAM проекта по умолчанию должна выглядеть примерно так, как приведенная ниже политика, хотя она будет отличаться в зависимости от того, какие API вы включили и какие функции Google Cloud используются. (политика очищена с помощью xxxxx, заменяющего идентификатор проекта)
bindings:
- members:
- serviceAccount:service-xxxxxxxxxxx@compute-system.iam.gserviceaccount.com
role: roles/compute.serviceAgent
- members:
- serviceAccount:xxxxxxxxxxx-compute@developer.gserviceaccount.com
- serviceAccount:xxxxxxxxxxx@cloudservices.gserviceaccount.com
- serviceAccount:terraform-service-account@your-terraform-project.iam.gserviceaccount.com
role: roles/editor
- members:
- user:owner@example.com
role: roles/owner
- members:
- serviceAccount:terraform-service-account@your-terraform-project.iam.gserviceaccount.com
role: roles/servicenetworking.networksAdmin
- members:
- serviceAccount:service-xxxxxxxxxxx@service-networking.iam.gserviceaccount.com
role: roles/servicenetworking.serviceAgent
etag: BwWc0THMaHA=
version: 1
Если вы получаете эту ошибку, запустите gcloud projects get-iam-policy your-project-name
и посмотрите, чего не хватает. По всей вероятности, изменение политики уничтожило вашу роль владельца и роли для учетных записей служб по умолчанию (тех, которые содержат идентификатор вашего проекта в имени).
Резюме: если вы используете Terraform для управления IAM в Google Cloud Platform, вам, как правило, НЕ следует использовать ресурс google_project_iam_policy
, если вы не являетесь экспертом в рукописные правила Google IAM. Если вам необходимо его использовать, прежде чем начать, запустите gcloud projects get-iam-policy your-project-name
и сохраните результаты, чтобы вы могли увидеть, как выглядела ваша политика IAM до того, как вы ее нарушили.