簡體   English   中英

Terraform GCP 將 IAM 角色分配給服務帳戶

[英]Terraform GCP Assign IAM roles to service account

我正在使用以下

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}",
    ]
}

另一種選擇是使用循環。 這是一些使用count循環的示例代碼。

變量.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}"
]
}

請注意,當使用count循環時,Terraform 使用 state 文件中的值維護索引的 map。 簡單來說,如果您僅僅因為我們不想要該角色而從列表中刪除第一個元素,那么 Terraform 將從索引 2(舊列表的)中刪除所有元素,然后將它們應用回來。

此外,我更喜歡使用google_project_iam_member而不是google_project_iam_binding ,因為當使用google_project_iam_binding時,如果有任何用戶或 SAs 在 Terraform 綁定到同一角色之外創建,GCP 將在未來運行時將其刪除(TF 應用)。

我認為這是通過以下資源實現的:

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}",
  ]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM