如何在Terraform中正确创建具有角色的GCP服务帐户 [英] How to properly create gcp service-account with roles in terraform

查看:32
本文介绍了如何在Terraform中正确创建具有角色的GCP服务帐户的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下是我用来创建服务帐户并将角色绑定到该帐户的Terform代码:

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中执行此操作?

这当然可以通过gcp UI或gcloud cli完成,而不会出现任何问题或影响其他SA。

推荐答案

来自Terraformdocs,";GOOGLE_PROJECT_IAM_BINDING&qot;isAuthoritative. Sets the IAM policy for the project and replaces any existing policy already attached。这意味着它将完全替换其内部给定角色的成员。

要只将角色添加到新服务帐户,而不编辑该角色中的其他所有人,您应该使用资源";Google_PROJECT_IAM_MEMBER&QOT;:

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以更好地了解此行为。

这篇关于如何在Terraform中正确创建具有角色的GCP服务帐户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆