Сервисные аккаунты с ролями в нескольких проектах в GCP с Terraform

Вопрос или проблема

У меня есть несколько проектов в GCP. Я создал сервисный аккаунт в Project_BA, а затем назначил необходимые роли как в Project_BA, так и в Project_Res этому сервисному аккаунту. Однако, когда я проверял в консоли, никакие роли не были назначены этому сервисному аккаунту в Project_Res. Вот моя настройка terraform:

resource "google_service_account" "service_account" {
  project = var.project_ba
  account_id = replace(var.name, "_", "-")
  description = "Аккаунт для запуска функции загрузки"
}
# Создать пользовательскую роль в project_res
resource "google_project_iam_custom_role" "custom_role" {
  project = var.project_res
  role_id = "ba_custom_roles"
  title = "Пользовательские роли"
  permissions = [
    "roles/secretmanager.secretAccessor",
    "roles/secretmanager.viewer"
  ]
}

# Назначить пользовательскую роль сервисному аккаунту в project_ba
resource "google_project_iam_binding" "project_res_custom_role_binding" {
  project = var.project_res
  role = "projects/${var.project_res}/roles/${google_project_iam_custom_role.custom_role.role_id}"
  members = [
    "serviceAccount:${google_service_account.service_account.email}"
  ]
}

resource "google_project_iam_member" "project_ba_storage_admin" {
  project = var.project_ba
  role = "roles/storage.admin"
  member = "serviceAccount:${google_service_account.service_account.email}"
}

resource "google_project_iam_member" "project_ba_bigquery_data_editor" {
  project = var.project_ba
  role = "roles/bigquery.dataEditor"
  member = "serviceAccount:${google_service_account.service_account.email}"
}

resource "google_project_iam_member" "project_ba_composer_admin" {
  project = var.project_ba
  role = "roles/composer.admin"
  member = "serviceAccount:${google_service_account.service_account.email}"
}

Ответ или решение

Управление учетными записями сервисов с ролями в нескольких проектах Google Cloud Platform с использованием Terraform

Ваша ситуация, касающаяся управления учетными записями сервисов в нескольких проектах GCP с использованием Terraform, является типичной задачей для облачной инфраструктуры. Давайте разберем вашу конфигурацию и выявим, где могут быть препятствия на пути к корректной настройке ролей.

Проблема с назначением ролей

Вы создали учетную запись сервиса в проекте Project_BA и назначили ей роли как в этом проекте, так и в Project_Res. Однако вы столкнулись с тем, что роли, назначенные в Project_Res, не отображаются в консоли. Возможные причины и шаги для их устранения могут быть следующими:

1. Проверка правильности конфигурации

Ваш код Terraform выглядит следующим образом:

resource "google_service_account" "service_account" {
  project     = var.project_ba
  account_id  = replace(var.name, "_", "-")
  description = "Account to run the ingest function"
}

# Создание кастомной роли в Project_Res
resource "google_project_iam_custom_role" "custom_role" {
  project     = var.project_res
  role_id     = "ba_custom_roles"
  title       = "Custom Roles"
  permissions = [
    "roles/secretmanager.secretAccessor",
    "roles/secretmanager.viewer"
  ]
}

# Назначение кастомной роли учетной записи сервиса в Project_Res
resource "google_project_iam_binding" "project_res_custom_role_binding" {
  project = var.project_res
  role    = "projects/${var.project_res}/roles/${google_project_iam_custom_role.custom_role.role_id}"
  members = [
    "serviceAccount:${google_service_account.service_account.email}"
  ]
}

resource "google_project_iam_member" "project_ba_storage_admin" {
  project = var.project_ba
  role    = "roles/storage.admin"
  member  = "serviceAccount:${google_service_account.service_account.email}"
}

resource "google_project_iam_member" "project_ba_bigquery_data_editor" {
  project = var.project_ba
  role    = "roles/bigquery.dataEditor"
  member  = "serviceAccount:${google_service_account.service_account.email}"
}

resource "google_project_iam_member" "project_ba_composer_admin" {
  project = var.project_ba
  role    = "roles/composer.admin"
  member  = "serviceAccount:${google_service_account.service_account.email}"
}

2. Проверка переменных

Убедитесь, что переменные var.project_ba и var.project_res правильно определены и ссылаются на верные проекты. Ошибки в имени проекта могут приводить к тому, что политики IAM не применяются.

3. Использование google_project_iam_custom_role

Пожалуйста, проверьте, действительно ли кастомная роль была успешно создана в Project_Res. Вы можете это сделать, выполнив команду gcloud:

gcloud iam roles describe projects/{var.project_res}/roles/ba_custom_roles

Если она отсутствует, возможно, проблема заключается в неправильном определении при создании.

4. Применение конфигурации

После внесения изменений запустите следующие команды для обновления вашей инфраструктуры:

terraform init
terraform plan
terraform apply

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

5. Проверка IAM в консоли GCP

Перейдите в консоль IAM вашего проекта Project_Res и убедитесь, что учетная запись сервиса отображается среди членов с назначенной кастомной ролью. Иногда могут возникать задержки в обновлении интерфейса, так что дайте системе немного времени.

Заключение

Управление ролями сервисных аккаунтов в нескольких проектах GCP может быть сложным, но при правильной настройке с использованием Terraform это становится более управляемым процессом. Используя предлагаемую выше стратегию, вы должны быть в состоянии успешно назначить роли вашему сервисному аккаунту в разных проектах.

Если у вас остались вопросы или если проблема не была решена, рекомендуется обратиться к более детальной документации GCP или к сообществу Terraform для получения помощи.

Оцените материал
Добавить комментарий

Капча загружается...