🔐

TerraformでGoogle Cloudのサービスアカウントを作成し、必要なIAMロールを一括で付与する方法

に公開

こんにちは、今回は Terraform を使って Google Cloud のサービスアカウントを作成し、複数の IAM ロールを一括で付与する方法 を紹介します。

クラウドリソースの自動化を進める中で、Terraform のサービスアカウントに必要な権限を付与する構成は定番の一つ。この記事では、GCPでのサービスアカウント作成から、複数のロール付与までをシンプルなコードで解説します。

🧱 前提条件

  • GCP プロジェクトが作成済み
  • Terraform がローカルにインストール済み
  • gcloud auth application-default login などで認証済み
  • Terraform に適切な初期設定(provider)がされている

📁 ディレクトリ構成例

.
├── main.tf
├── variables.tf
├── terraform.tfvars

✍️ main.tf(サービスアカウント作成+ロール付与)

provider "google" {
  project = var.project
  region  = "asia-northeast1"
}

resource "google_service_account" "terraform" {
  account_id   = "terraform"
  display_name = "Terraform用サービスアカウント"
}

# 必要なロール一覧(複数指定)
locals {
  roles = [
    "roles/artifactregistry.admin",
    "roles/cloudbuild.builds.editor",
    "roles/run.admin",
    "roles/storage.admin",
    "roles/iam.serviceAccountUser",
    "roles/iam.serviceAccountCreator",
    "roles/pubsub.admin",
    "roles/secretmanager.secretAccessor",
    "roles/serviceusage.serviceUsageAdmin",
    "roles/workflows.admin",
  ]
}

resource "google_project_iam_member" "terraform_roles" {
  for_each = toset(local.roles)

  project = var.project
  role    = each.value
  member  = "serviceAccount:${google_service_account.terraform.email}"
}

📄 variables.tf

variable "project" {
  type        = string
  description = "GCPのプロジェクトID"
}

🧩 terraform.tfvars

project = "your-project-id"

your-project-id の部分は自身のプロジェクトIDに置き換えてください。


🚀 デプロイ手順

terraform init
terraform plan
terraform apply

apply の途中で Do you want to perform these actions? と表示されるので、yes を入力して実行します。


✅ 補足ポイント

  • google_project_iam_member リソースで for_each を使うことで、複数ロールの一括付与を簡潔に記述できます。
  • roles/cloudbuild.viewer のような一部のロールは、プロジェクトレベルでは使えないためエラーになります(→公式ドキュメントで確認)。
  • サービスアカウントは GCP コンソールから手動作成せず、Terraform で管理するのがおすすめです。

📚 参考


Terraform でのインフラ管理は柔軟で強力です。サービスアカウントやロール管理も IaC(Infrastructure as Code)で統一しておくことで、チーム開発や再現性の高い構成が実現できます!

ぜひ自分のプロジェクトでも試してみてください🔧

Discussion