Terraform GCP 将 IAM 角色分配给服务帐户

Posted

技术标签:

【中文标题】Terraform GCP 将 IAM 角色分配给服务帐户【英文标题】:Terraform GCP Assign IAM roles to service account 【发布时间】:2021-06-06 21:29:35 【问题描述】:

我正在使用以下

resource "google_service_account" "store_user" 
  account_id   = "store-user"
  display_name = "Storage User"


resource "google_project_iam_binding" "store_user" 
  project = var.project_id
  role    = "roles/storage.admin"
  members = [
    "serviceAccount:$google_service_account.store_user.email"
  ]

效果很好,因为它会创建 SA 并为其分配存储管理员角色。伟大的。 但我需要给这个 SA 大约 4 个角色。我尝试了各种方法,包括使用带有重复绑定/角色块的数据块,如下所示:

data "google_iam_policy" "store_user_roles" 
  binding 
    role = "roles/storage.admin"
    members = [
      "serviceAccount:$google_service_account.store_user.email",
    ]
  
  binding 
    role = "roles/pubsub.admin"
    members = [
      "serviceAccount:$google_service_account.store_user.email",
    ]
  

奇怪的是,它运行了,但 SA 没有获得角色/权限。我已经尝试了在这里和那里找到的各种其他示例,但没有成功。有人可以帮我推动正确的方向吗?

// 更新。以下确实对我有用:

resource "google_project_iam_binding" "storage-iam" 
    project = var.project_id
    role = "roles/storage.admin"
    members = [
        "serviceAccount:$google_service_account.store_user.email",
    ]

resource "google_project_iam_binding" "pubsub-iam" 
    project = var.project_id
    role = "roles/pubsub.admin"
    members = [
        "serviceAccount:$google_service_account.store_user.email",
    ]

【问题讨论】:

【参考方案1】:

另一种选择是使用循环。

变量.tf

variable "rolesList" 
type =list(string)
default = ["roles/storage.admin","roles/pubsub.admin"]

服务帐户.tf

resource "google_service_account" "store_user" 
account_id   = "store-user"
display_name = "Storage User"


resource "google_project_iam_binding" "store_user" 
project = var.project_id
count = length(var.rolesList)
role =  var.rolesList[count.index]
members = [
  "serviceAccount:$google_service_account.store_user.email"
]

请注意,使用循环时,terraform 会使用状态文件中的值维护索引映射。简单来说,如果您仅仅因为我们不想要该角色而从列表中删除第一个元素,那么 terraform 将从索引 2(旧列表的)中删除所有元素,然后将它们应用回来。

另外,我更喜欢使用google_project_iam_member 而不是google_project_iam_binding,因为当使用google_project_iam_binding 时,如果在terraform 之外创建了具有相同角色的任何用户/SA,而不是members 的一部分将被删除GCP。

【讨论】:

谢谢。在我的情况下,您提供的绑定块是关键,我没有使用循环,但是两个不同的块每个都有一个角色就可以了。【参考方案2】:

我认为这是通过这个资源实现的:

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_service_account_iam

所以用你的代码,减去数据源,改变口味:

resource "google_service_account_iam_binding" "storage-iam" 
  service_account_id = google_service_account.store_user.name
  role               = "roles/storage.admin"

  members = [
    "serviceAccount:$google_service_account.store_user.email",
  ]


resource "google_service_account_iam_binding" "pubsub-iam" 
  service_account_id = google_service_account.store_user.name
  role               = "roles/pubsub.admin"

  members = [
    "serviceAccount:$google_service_account.store_user.email",
  ]

【讨论】:

非常感谢。就我而言,虽然这段代码运行正常,但它实际上并没有应用角色(只有第一个)。我已经更新了问题以显示最终有效的方法。

以上是关于Terraform GCP 将 IAM 角色分配给服务帐户的主要内容,如果未能解决你的问题,请参考以下文章

GCP 为每个项目和 Terraform 预定义 IAM 角色

使用 Terraform 创建 GCP 自定义 IAM 角色

分配 GCP 函数服务帐号角色以使用 Terraform 与 Firebase 互动

terraform 中的任务执行 IAM 角色

如何将 IAM 角色分配给用户或组

使用 terraform 创建 IAM 角色并将其附加到 EC2