Я пытался заставить олицетворение учетной записи службы работать с моими проектами GCP и столкнулся с проблемой, которую я не совсем понимаю.
У меня есть проект GCP Terraform Admin, где учетная запись службы, которую я олицетворяю проживает. Эта учетная запись службы имеет права администратора для всех других проектов GCP.
Я пытаюсь добиться того, чтобы пользователь GCP развернулся в проектах GCP без использования ключей учетной записи службы, чтобы нам не приходилось беспокоиться о ключи скомпрометированы.
Пользователь GCP в этом случае сам имеет правильные разрешения, применяемые для олицетворения учетной записи службы, однако при выполнении заявки на развертывание ресурса, такого как добавление членства роли IAM в существующую учетную запись службы, которую я не имеют привилегий на выполнение, генерирует ошибку, так как он не пытается развернуться в контексте безопасности учетной записи службы, которая имеет необходимые разрешения.
Прежде всего, я использую windows хост для развертывания, и я инициализирую среду с помощью специального скрипта PowerShell, поскольку я использую удаленное состояние, хранящееся в корзине GCS, скрипт в значительной степени делает это:
$bucket="bck-xxxxx-xxxx-state"
$prefix="dev"
$varfile="terraform.dev-tfvars"
gcloud auth application-default login
terraform init `
-backend-config="bucket=$bucket" `
-backend-config="prefix=$prefix" `
-var-file="$varfile"
Файл main.tf настроен как следует:
provider "google" {
}
terraform {
backend "gcs" {
}
}
data "google_service_account_access_token" "default" {
provider = google
target_service_account = "tfadmin-xxx-xxx@xxx-tfadmin-xxx-xxxx.iam.gserviceaccount.com"
scopes = ["userinfo-email", "cloud-platform"]
lifetime = "300s"
}
data "google_client_openid_userinfo" "me" { }
#output who am authenticated as
output "source-email" {
value = "${data.google_client_openid_userinfo.me.email}"
}
provider "google" {
alias = "impersonated"
access_token = data.google_service_account_access_token.default.access_token
project = "xxxx-tfadmin-xxx-xxxx"
}
data "google_client_openid_userinfo" "thenewme" {
provider = google.impersonated
}
#output the service account I am impersonating
output "target-email" {
value = "${data.google_client_openid_userinfo.thenewme.email}"
}
После запуска в erraform init процесс инициализации возвращает успех.
Запуск плана terraform возвращается успешно, но когда я пытаюсь применить изменения, я получаю следующее:
Error: Batch "iam-project-xxxx-xxxxx-dev-xxxx modifyIamPolicy" for request "Create IAM Members roles/storage.legacyBucketReader serviceAccount:svc-xxxxx-xxxxx-xxxxx-sts@xxxx-xxxx-dev-xxxx.iam.gserviceaccount.com for \"project \\\"xxxx-xxxx-dev-xxxx\\\"\"" returned error: batch request and retry as single request failed - final error: Error applying IAM policy for project "xxxx-xxxxx-dev-xxxx": Error
setting IAM policy for project "xxxx-xxxxx-dev-xxxx": googleapi: Error 403: The caller does not have permission, forbidden. To debug individual requests, try disabling batching: https://www.terraform.io/docs/providers/google/guides/provider_reference.html#enable_batching
Если я пытаюсь запустить приложение, когда нечего добавить, измененный или уничтоженный мой файл main.tf выдает то, что я ожидал от себя в качестве источника электронной почты и учетной записи службы администрирования terraform в качестве цели электронной почты:
Outputs:
source-email = rxxxxx.txxxx@xxxx.co.uk
target-email = xxxx-tfadmin-xxxx-xxx@xxx-tfadmin-xxxx-xxxx.iam.gserviceaccount.com
Так что я предполагаю, что олицетворение не работает должным образом, хотя кажется, что я должен выдавать себя за аккаунт, как и ожидалось.
Любая помощь будет наиболее ценной.