The*_*ege 3 google-cloud-platform terraform
我正在使用 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
Run Code Online (Sandbox Code Playgroud)
这是我尝试运行测试命令时得到的输出:
> 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
Run Code Online (Sandbox Code Playgroud)
权限参考声明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
Run Code Online (Sandbox Code Playgroud)
我确实针对这个特定情况手动创建了新的服务帐户,因为我还没有设置基础设施的其余部分(这将创建帐户作为其过程的一部分)。我想确保这有效。
有任何想法吗?据我所知,我已经授予了它告诉我我需要的权限。帮助?
编辑:哦,我尝试了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"
}
}
Run Code Online (Sandbox Code Playgroud)
我彻底困惑了
您可能google_project_iam_policy
错误地使用了资源,并使用错误的策略覆盖了项目的默认 IAM 策略配置(不要问我是怎么知道的......)
google_project_iam_policy
是Terraform 中非常危险的资源,文档没有充分强调它的危险程度。问题在于,设置 IAM 策略会将项目的整个IAM 配置替换为您定义的 IAM 策略。所有默认的、自动创建的服务帐户权限都会被清除,除非您专门将它们包含在策略定义中。
修复您的项目是可能的,但并不容易。您需要找到您的项目需要的所有服务帐户,并添加正确的权限。错误输出TF_LOG=TRACE terraform apply
可以指导您。默认项目 IAM 政策应类似于以下政策,但它会根据您启用的 API 以及正在使用的 Google Cloud 功能而有所不同。(政策已清理,用 xxxxx 替换项目 ID)
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
Run Code Online (Sandbox Code Playgroud)
如果您收到此错误,请运行gcloud projects get-iam-policy your-project-name
并查看缺少什么。策略更改很可能消除了您的所有者角色以及默认服务帐户的角色(名称中包含您的项目 ID 的角色)。
摘要:如果您使用 Terraform 来管理 Google Cloud Platform 中的 IAM,通常不应使用资源,除非您是手写 Google IAM 策略的google_project_iam_policy
专家。如果您必须使用它,请在开始之前运行并保存结果,以便您可以查看 IAM 策略在破坏之前的情况。gcloud projects get-iam-policy your-project-name
归档时间: |
|
查看次数: |
12852 次 |
最近记录: |