🦅

google_project_iam_binding は注意して使った方がよさそう

2020/10/13に公開

Terraform の Google Provider の google_project_iam_binding は注意して使った方がよさそう。
Google: google_project_iam - Terraform by HashiCorp

google_project_iam_binding の使用例

例えば「編集者」ロールを ptiringo@example.com に与える場合、google_project_iam_binding を用いて書くと以下のようになる。

iam.tf
resource "google_project_iam_binding" "editor" {
  role = "roles/editor" // 編集者
  members = [
    "user:ptiringo@example.com"
  ]
}

この設定でも問題なくロールを付与することができるのだが、google_project_iam_binding の気を付けないといけないところは、指定されたメンバーに "のみ" このロールが付与されるように振る舞うというところ。つまり指定されたメンバー以外に当該のロールを保持しているアカウントがあれば、そのアカウントからロールが剥奪される動きをとる。

google_project_iam_binding を使用する場合の注意点

具体的に問題となりうるのは、Google 管理のサービスアカウントのロールの剥奪を行ってしまう場合だ。

例えば、内部の Google プロセスを実行する Google API サービス エージェント (project-number@cloudservices.gserviceaccount.com) には「編集者」ロールが自動的に付与されるが、Terraform で上記の設定を行なってしまうと、Terraform 実行時にこのロールを剥奪してしまう(さらにこの動きは Terraform の出力結果には表示されない)。

警告: Google API サービス エージェントに付与されているロールは変更しないでください。また、取り消しも行わないでください。これらのロールを変更または取り消すと、一部の Google Cloud サービスが使用できなくなります。
https://cloud.google.com/iam/docs/service-accounts?hl=ja#google-managed

Google のドキュメントには上記の記載があり、実際に各所に問題が発生することになる。

回避方法としての google_project_iam_member

こういった場合、google_project_iam_member を使うのが無難だろう。

iam.tf
resource "google_project_iam_member" "editor" {
  role   = "roles/editor" // 編集者
  member = "user:ptiringo@example.com"
}

google_project_iam_member でもアカウントにロールを付与することができる。こちらは指定されたメンバーに当該のロールを付与し、それ以外に当該のロールを保有するアカウントに対しては影響を与えない動きをとる。

Discussion