loader image

[terraform]ロールでよく使う処理

特定のサービスにのみロールを割り当てる(リソース)

google_{サービス名}_iam_memberでつけれる
例としてfunctions(2世代)にロールを割り当てる

resource "google_cloudfunctions2_function_iam_member" "member" {
  project = google_cloudfunctions2_function.function.project
  location = google_cloudfunctions2_function.function.location
  cloud_function = google_cloudfunctions2_function.function.name
  role = "ここに割り当てたいロールを記載"
  member = "ここにロールを割り当てるGSA等を記載"
}

特定のサービスにのみロールを割り当てる(データソース)

例として 特定のGCS にロールを割り当てる方法

# まずはデータセットを作る
data "google_iam_policy" "policy" {
  binding {
    role = "ここに割り当てたいロールを記載"
    members = [
      "serviceAccount:ここにロールを割り当てるGSA等を記載,
    ]
  }
}

# GCSを作る
resource "google_storage_bucket" "bucket1" {
  name          = "bucket1"
  location      = "asia-northeast1"
  force_destroy = true
  project       = var.project
}

# 作った GCS にデータセットを割り当てる
resource "google_storage_bucket_iam_policy" "bucket1" {
  bucket      = google_storage_bucket.bucke1.name
  policy_data = data.google_iam_policy.policy.policy_data
}

google_storage_bucket_iam_policy ではbucket1の上記で指定したロール以外は全て剥奪される

PJ単位でフォルダを分けてるが共通部分をmoduleに切り出す構成

構成

terraform-repo
├── module
│   └── 共通module.tf
│   └── variable.tf
├── production
│   └── main.tf
└── staging
     └── main.tf

共通module.tf

# 実際にロールをbindingする処理
resource "google_project_iam_binding" "binding" {
  project  = var.project
  # map(list(string))でもらってるので一旦for_eachしてroleとmembersに渡す
  for_each = var.bindings
  role     = each.key
  members  = each.value
}

variable.tf

# main.tfで定義したロールを共通module.tfで使えるようにする処理
variable "project" {
  type        = string
  description = "プロジェクト"
}

variable "bindings" {
  type        = map(list(string))
  description = "IAMの定義(ロール名がkey, 紐付けるアカウントのリストがvalue)"
}

main.tf

locals {
  bindings1 = {
    "ここに付与したいロールを記載" = setunion(
      "ここに追加したいGSA等を記載",
    )
}

module "任意のモジュール名" {
  source   = "../module/"
  project  = "PJ名を記載"
  bindings =  bindings1
}

コメント

タイトルとURLをコピーしました