背景
権限を付与する google_project_iam_member
のリソースの role
が配列を持てないので、複数の role を一度に設定することができません。
したがって、複数の role
をあるアカウントに付与するためにはツラツラ書く必要があって、少し辛いところがあります。
- 参考
- https://www.terraform.io/docs/providers/google/r/google_project_iam.html#google_project_iam_member-1
old_serviceaccount.tf
# create account
resource "google_service_account" "sample_app_user" {
account_id = "app-mgr"
display_name = "app-mgr"
}
# add role1
resource "google_project_iam_member" "sample_app_user_1" {
role = "roles/cloudsql.client"
member = "serviceAccount:${google_service_account.sample_app_user.email}"
}
# add role2
resource "google_project_iam_member" "sample_app_user_2" {
role = "roles/storage.objectViewer"
member = "serviceAccount:${google_service_account.sample_app_user.email}"
}
# add role3
resource "google_project_iam_member" "sample_app_user_3" {
role = "roles/bigquery.user"
member = "serviceAccount:${google_service_account.sample_app_user.email}"
}
# add roleN(このペースで追加するのは辛い..)
# ...
対応
Terraformの count
機能を導入することで上手く構造化が可能です。
count
に別途変数で切った配列長を設定し、 count.index
で配列アクセスすることで動的に展開して実行してくれます。
role
を編集したいときは、 sample_app_roles
の値を編集すればOK。
new_serviceaccount.tf
# create account(ここは変化せず)
resource "google_service_account" "sample_app_user" {
account_id = "app-mgr"
display_name = "app-mgr"
}
# add roles(countとリストアクセスを活用)
resource "google_project_iam_member" "sample_app_user" {
count = "${length(var.sample_app_roles)}"
role = "${element(var.sample_app_roles, count.index)}"
member = "serviceAccount:${google_service_account.sample_app_user.email}"
}
# 別途変数化
variable "sample_app_roles" {
default = [
"roles/cloudsql.client",
"roles/storage.objectViewer",
"roles/bigquery.user",
"..."
]
}
variableを別ファイルで管理すれば、メンテナンス性やレビュー上もお得にできそうです。
まとめ
- Terraformのcount機能は強力