如何正确使用Terraform中的角色创建gcp服务帐户

时间:2020-04-02 23:56:43

标签: google-cloud-platform terraform service-accounts terraform-provider-gcp

这是我用来创建服务帐户并将其绑定角色的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。

2 个答案:

答案 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中看到该删除。