这是我用来创建服务帐户并将其绑定角色的terraform代码:
resource "google_service_account" "sa-name" {
account_id = "sa-name"
display_name = "SA"
}
resource "google_project_iam_binding" "firestore_owner_binding" {
role = "roles/datastore.owner"
members = [
"serviceAccount:sa-name@${var.project}.iam.gserviceaccount.com",
]
depends_on = [google_service_account.sa-name]
}
以上代码非常有效...除了将datastore.owner
从项目中以前分配给该角色的其他任何服务帐户中删除之外,其他代码都很好。我们有多个团队使用的单个项目,并且有由不同团队管理的服务帐户。我的terraform代码中只有我们团队的服务帐户,最终可能破坏其他团队的服务帐户。
还有另一种在Terraform中执行此操作的方法吗?
这当然可以通过GCP UI或gcloud cli来完成,而不会出现任何问题或影响其他SA。
答案 0 :(得分:7)
在地形docs中,“ google_project_iam_binding”为Authoritative. Sets the IAM policy for the project and replaces any existing policy already attached
。这意味着它完全替换了其中给定角色的成员。
要将角色仅添加到新的服务帐户中,而不用对该角色的其他所有人进行编辑,则应使用资源“ google_project_iam_member”:
resource "google_service_account" "sa-name" {
account_id = "sa-name"
display_name = "SA"
}
resource "google_project_iam_member" "firestore_owner_binding" {
project = <your_gcp_project_id_here>
role = "roles/datastore.owner"
member = "serviceAccount:${google_service_account.sa-name.email}"
}
样本中的其他变化:使用服务帐户资源email
生成的属性来删除显式depends_on
。如果这样做,则不需要depends_on
,并且可以避免配置错误而导致的错误。
Terraform可以通过使用另一个资源中的变量来推断依赖性。选中the docs here,以更好地了解这种行为。
答案 1 :(得分:1)
这是Terraform的常见问题。要么全部使用它,要么什么都不做。如果您介于两者之间,则可能会发生意想不到的事情!
如果要使用terraform,则必须将现有的导入到tfstate中。 Here the doc for the bindind,当然,您必须将所有帐户添加到Terraform文件中。否则,绑定将被删除,但是这次,您将在tf plan
中看到该删除。