我正在使用 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 [email protected] --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/[email protected]., forbidden
我确实为这个特定案例手动创建了新的服务帐户,因为我尚未设置其余的基础设施(这将作为其流程的一部分创建帐户)。我想确保这能正常工作。
有什么想法吗?据我所知,我已经授予了它告诉我需要的权限。帮忙吗?
编辑:哦,我查看过了尝试 API,我的用户帐户显示 403,而我的用户帐户应该有组织管理员:
{
"error": {
"code": 403,
"message": "Permission iam.serviceAccounts.get is required to perform this operation on service account projects/-/serviceAccounts/[email protected].",
"status": "PERMISSION_DENIED"
}
}
我彻底糊涂了
答案1
你可能使用了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:[email protected]
role: roles/compute.serviceAgent
- members:
- serviceAccount:[email protected]
- serviceAccount:[email protected]
- serviceAccount:terraform-service-account@your-terraform-project.iam.gserviceaccount.com
role: roles/editor
- members:
- user:[email protected]
role: roles/owner
- members:
- serviceAccount:terraform-service-account@your-terraform-project.iam.gserviceaccount.com
role: roles/servicenetworking.networksAdmin
- members:
- serviceAccount:[email protected]
role: roles/servicenetworking.serviceAgent
etag: BwWc0THMaHA=
version: 1
如果您收到此错误,请运行gcloud projects get-iam-policy your-project-name
并查看缺少的内容。很有可能,策略更改会抹去您的所有者角色以及默认服务帐户(名称中包含您的项目 ID 的帐户)的角色。
概括:如果你使用 Terraform 来管理 Google Cloud Platform 中的 IAM,你通常不应该使用资源google_project_iam_policy
,除非你是这方面的专家手写 Google IAM 政策如果必须使用它,那么在开始之前,请运行gcloud projects get-iam-policy your-project-name
并保存结果,以便您可以在破坏它之前看到您的 IAM 策略是什么样的。
答案2
同意之前的回答,只是请注意,您可以在 IAM -> 查看资源中查看已删除的所有角色。到达那里后,检查您意外删除的项目,单击“活动”,然后逐一进行更改,直到找到超级破坏性的更改。应该更容易通过那里并重新添加更改。