前提
-
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と似たような形の記述(違いはmembers
かmember
か)方法になる。
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サービスしか対応していない。
このモジュールを使うのは、現時点ではあまり得策ではなさそうである。
参考