0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Terraform][google provider]IAMまとめ

Posted at

前提

  • GCPのIAMの概要を理解していること。
    ポリシー、バインディング、ロール、プリンシパルなどの用語の意味を知っていないと、TerraformのIAM系 resourceの仕様を理解できない(参考: [GCP]IAM概要まとめ)

  • google provider v5.36.0時点の話。

概要

GCPのリソースごとに、google_<リソース名>_iam_xxx というTerraformでのresourceの仕様が定義されている。
xxxの部分は、以下の3つのいずれかの文字列が当てはまる。

  • policy
  • binding
  • member

resource

google_<リソース名>_iam_policy

対象リソースのポリシー設定(= 全てのバインディング設定)を、ガチッと正確に記述するときに使う。
対象リソースに紐づけるポリシーの設定を google_iam_policy data source で定義(binding.role, binding.membersの組み合わせ)して、google_<リソース名>_iam_policy resource の policy_data で参照する形で記述する。

resource "google_<リソース名>_iam_policy" "sample" {
    ...
    policy_data = data.google_iam_policy.<ポリシー名>
}
 
 
data "google_iam_policy" "<ポリシー名>" {
    # バインディング設定1
    binding {
        # ロール
        role = "roles/..."
 
        # ロールを与えるメンバー
        members = [
           ...
        ]
    }
 
    ...
 
    # バインディング設定N
    binding {
        # ロール
        role = "roles/..."
 
        # ロールを与えるメンバー
        members = [
            ...
        ]
    }
}

注意点

権威的であり、Terraform外で対象リソースに対してポリシーが設定されていた場合にterraform applyすると、Terraformで記述したポリシー設定に完全に置き換わってしまう。

google_<リソース名>_iam_binding

対象リソースの1つのバインディング設定(1ロール: Nプリンシパル)をガチッと正確に記述するときに使う。
google_<リソース名>_iam_binding resource に role, membersを定義する形で記述する。

resource "google_<リソース名>_iam_binding" "sample" {
    ...
 
    # ロール
    role = "roles/..."
 
    # ロールを与えるメンバー
    members = [
        ...
    ]
}

注意点

権威的であり、Terraform外で対象リソースに対してポリシーが設定されていた場合にterraform applyすると、そのポリシー内のいずれかのバインディング設定に含まれるロールがTerraformで記述したbindingのロールと被った場合、元々のバインディング設定はTerraformで定義したものに完全に置き換わってしまう。

google_<リソース名>_iam_member

対象リソースを操作する1プリンシパルのバインディング設定を記述するときに使う。
google_<リソース名>_iam_member resource に role, memberを定義する形で記述する。
要するにiam_bindingと似たような形の記述(違いはmembersmemberか)方法になる。

resource "google_<リソース名>_iam_member" "sample" {
    ...
 
    # ロール
    role = "roles/..."
 
    # ロールを与えるメンバー
    member = ...
}

被権威的であり対象のプリンシパルにロールを追加する方向だけに作用する。
すなわち、Terraform外で対象リソースにポリシーが設定されていた場合にterraform applyしても、既存のポリシーに含まれている各プリンシパルのアクセス権限が剥奪されてしまうことはない。

所感: policy, binding, memberのどれを使うか

3つの内 google_<リソース名>_iam_policy と google_<リソース名>_iam_binding は、権威的である。
すなわち、すでに設定されているバインディングをTerraformの設定どおりに修正してしまい、意図しないアクセス権の剥奪が起こり得る。

で述べられているが、明確な意図やメリットがない限りは google_<リソース名>_iam_memberを使って設定するのが無難そうである。

また、これに関連して https://cloud.google.com/docs/terraform/best-practices-for-terraform?hl=ja#iam に

Google Cloud によって自動的に管理されるロールが削除されたり、一部のサービスの機能が停止する可能性があります。
これを防ぐには、google_*_iam_member リソースを直接使用するか、Google の IAM モジュールを使用することをおすすめします。

とある。しかし、Google の IAM モジュールは、スター数が186と極めて少ない(2024/07/16時点)。
さらに、一部のGCPサービスしか対応していない。
このモジュールを使うのは、現時点ではあまり得策ではなさそうである。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?