メインコンテンツまでスキップ

Terraform CI/CD Service Principal セットアップガイド

このドキュメントでは、GitHub Actions から Terraform を実行するための Service Principal をterraform/shared/で作成する方法を説明します。

概要

terraform/modules/shared/azure-terraform-ci.tf で Terraform CI/CD 実行用の Service Principal が作成されます。

作成されるリソース:

  • Azure AD Application (terraform-ci-app)
  • Service Principal (terraform-ci-sp)
  • OIDC Federated Credentials (GitHub Actions 用)
  • 必要な権限のロール割り当て

必要な権限

Service Principal には以下の権限が付与されます:

  1. Storage Blob Data Contributor - Terraform State Storage Account へのアクセス
  2. Contributor - サブスクリプションレベル(すべてのリソースの作成・管理)
  3. Key Vault Secrets User - Key Vault からのシークレット読み取り

セットアップ手順

1. Terraform の実行

cd terraform/environments/shared

# 初期化(初回のみ、またはプロバイダー更新時)
terraform init

# 変更内容の確認
terraform plan

# 適用
terraform apply

2. 出力値の確認

適用後、以下のコマンドで Service Principal の情報を取得:

# Client ID (GitHub SecretsのTERRAFORM_AZURE_CLIENT_ID)
terraform output -json shared_infrastructure | jq -r '.terraform_ci_service_principal_id'

# Tenant ID (GitHub SecretsのTERRAFORM_AZURE_TENANT_ID)
terraform output -json shared_infrastructure | jq -r '.azure_tenant_id'

# Subscription ID (GitHub SecretsのTERRAFORM_AZURE_SUBSCRIPTION_ID)
terraform output -json shared_infrastructure | jq -r '.azure_subscription_id'

3. GitHub Secrets への設定

取得した値を GitHub Secrets に設定:

# Client ID
CLIENT_ID=$(terraform output -json shared_infrastructure | jq -r '.terraform_ci_service_principal_id')
gh secret set TERRAFORM_AZURE_CLIENT_ID --repo GenerativeX/infra --body "$CLIENT_ID"

# Tenant ID
TENANT_ID=$(terraform output -json shared_infrastructure | jq -r '.azure_tenant_id')
gh secret set TERRAFORM_AZURE_TENANT_ID --repo GenerativeX/infra --body "$TENANT_ID"

# Subscription ID
SUBSCRIPTION_ID=$(terraform output -json shared_infrastructure | jq -r '.azure_subscription_id')
gh secret set TERRAFORM_AZURE_SUBSCRIPTION_ID --repo GenerativeX/infra --body "$SUBSCRIPTION_ID"

または、手動で GitHub の Settings → Secrets and variables → Actions から設定してください。

OIDC 認証

Service Principal はOIDC 認証を使用するように設定されています。これにより:

  • パスワード不要: AZURE_CLIENT_SECRETは不要
  • より安全: シークレットの管理が不要
  • 自動更新: GitHub Actions が自動的にトークンを取得

OIDC Federated Credentials

以下のリポジトリとブランチ/PR で使用可能:

  • GenerativeX/infra リポジトリ
  • main ブランチへの push
  • Pull Request

トラブルシューティング

Service Principal が作成されない

  1. Azure AD への書き込み権限があるか確認
  2. terraform planでエラーがないか確認
  3. Azure AD プロバイダーが正しく初期化されているか確認

OIDC 認証が失敗する

  1. Federated Credentials が正しく作成されているか確認
  2. GitHub リポジトリ名が正しいか確認(GenerativeX/infra
  3. GitHub Actions ワークフローでazure/login@v2アクションを使用しているか確認

権限エラーが発生する

  1. ロール割り当てが正しく適用されているか確認
  2. Storage Account へのアクセス権限を確認
  3. サブスクリプションレベルの Contributor 権限を確認

更新方法

Service Principal のパスワードを更新する場合:

cd terraform/environments/shared
terraform apply

パスワードは自動的に生成され、terraform_ci_service_principal_secretとして出力されます(OIDC 使用時は不要)。

セキュリティ考慮事項

  1. 最小権限の原則: 必要最小限の権限のみを付与
  2. OIDC 推奨: パスワードベースの認証ではなく OIDC を使用
  3. 定期的な監査: Service Principal の使用状況を定期的に確認
  4. 権限の見直し: 必要に応じて権限を縮小

関連ドキュメント