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

Azure RBAC Role Management

config.toml のmembersフィールドを使用してプロジェクトメンバーに Azure RBAC ロールを付与する方法を説明します。

概要

membersフィールドを使用すると、テナントの config.toml ファイルにプロジェクトメンバーを定義し、infra apply-rolesコマンドを使用して Azure RBAC ロールを自動的に付与できます。

この機能はTerraform の外側で管理されます。つまり、Terraform の状態ファイルには影響せず、Azure CLI を使用して直接ロールを付与します。

重要な特徴: すべてのメンバーに自動的にContributorロールが付与されます、Owner ロールは禁止されています(セキュリティ上の理由)、階層的なメンバー管理をサポート(グローバル + 環境固有)

config.toml の設定

階層的なメンバー構成

メンバーは 2 つのレベルで定義できます:グローバルメンバー(すべての環境にアクセス可能)、環境固有メンバー(特定の環境のみにアクセス可能)

# グローバルメンバー(全環境にアクセス)
members = ["admin@example.com", "devops@example.com"]

[environments.dev]
members = ["developer@example.com", "intern@example.com"] # dev環境のみにアクセス

[environments.prd]
members = ["sre@example.com", "manager@example.com"] # prd環境のみにアクセス

メンバーの解決ルール

各環境のメンバーは以下のように解決されます:グローバルメンバーと環境固有メンバーをマージ → 重複するメールアドレスを除外(デデュプリケーション) → すべてのメンバーに Contributor ロールを付与

: 上記の設定の場合、dev 環境は 4 名、prd 環境は 4 名がアクセス可能

フィールドの説明

  • members (トップレベル): グローバルメンバーのメールアドレス配列
  • members (環境レベル): 環境固有メンバーのメールアドレス配列
  • すべてのメールアドレスは Azure AD に登録されている必要があります
  • すべてのメンバーに自動的に Contributor ロールが付与されます

付与されるロール

Contributorロールのみが付与されます:リソースの作成と管理が可能、ロール割り当ての管理は不可、セキュリティ上の理由から Owner ロールは禁止

ロールの付与

基本的な使い方

infra apply-roles <tenant-name> <environment>  # 特定の環境に適用
infra apply-roles <tenant-name> # 全ての有効な環境に適用

例:

# dev環境のみに適用
infra apply-roles my-project dev

# 全環境(dev, prd)に適用
infra apply-roles my-project

実行フロー

  1. config.toml からメンバー情報を読み込む
  2. 処理対象の環境を決定(指定された環境、または全ての有効な環境)
  3. 各環境のメンバーを計算(グローバル + 環境固有、デデュプリケーション)
  4. 付与するロールの一覧を表示(環境ごとに分類)
  5. 確認プロンプトを表示
  6. 各環境のリソースグループに対してメンバーにロールを付与

確認プロンプトのスキップ

-yまたは--yesオプションを使用すると、確認プロンプトをスキップできます:

infra apply-roles my-project --yes

CI/CD パイプラインで使用する場合に便利です。

実行例

特定の環境に適用

$ infra apply-roles my-project dev

🔐 Azure RBACロール付与: my-project
付与するロール: Contributor

環境: dev
グローバルメンバー (2):
• admin@example.com
• devops@example.com
dev環境専用メンバー (2):
• developer@example.com
• intern@example.com
合計: 4名のユニークメンバー

? これらのロールを付与しますか? Yes

処理中: dev...
Resource Group: rg-my-project-dev
Subscription: e3143cb2-4707-4614-bbba-3ddeb66669c2
✅ Assigned role "Contributor" to admin@example.com on resource group rg-my-project-dev
✅ Assigned role "Contributor" to devops@example.com on resource group rg-my-project-dev
✅ Assigned role "Contributor" to developer@example.com on resource group rg-my-project-dev
✅ Assigned role "Contributor" to intern@example.com on resource group rg-my-project-dev
✅ dev: 4個成功, 0個失敗

📊 サマリー:
dev: 4個成功, 0個失敗

合計: 4個成功, 0個失敗

全環境に適用

$ infra apply-roles my-project

🔐 Azure RBACロール付与: my-project
付与するロール: Contributor

環境: dev
グローバルメンバー (2):
• admin@example.com
• devops@example.com
dev環境専用メンバー (2):
• developer@example.com
• intern@example.com
合計: 4名のユニークメンバー

環境: prd
グローバルメンバー (2):
• admin@example.com
• devops@example.com
prd環境専用メンバー (2):
• sre@example.com
• manager@example.com
合計: 4名のユニークメンバー

? これらのロールを付与しますか? Yes

処理中: dev...
Resource Group: rg-my-project-dev
Subscription: e3143cb2-4707-4614-bbba-3ddeb66669c2
✅ dev: 4個成功, 0個失敗

処理中: prd...
Resource Group: rg-my-project-prd
Subscription: e3143cb2-4707-4614-bbba-3ddeb66669c2
✅ prd: 4個成功, 0個失敗

📊 サマリー:
dev: 4個成功, 0個失敗
prd: 4個成功, 0個失敗

合計: 8個成功, 0個失敗

メンバーが定義されていない場合

$ infra apply-roles my-project

⚠️ テナント "my-project" にはメンバーが定義されていません

config.tomlに以下のようにメンバーを追加してください:

# グローバルメンバー(全環境にアクセス)
members = ["admin@example.com", "devops@example.com"]

[environments.dev]
# dev環境のみにアクセス
members = ["developer@example.com"]

既にロールが付与されている場合

既にロールが付与されているメンバーに対しては、スキップされます:

ℹ️  Role "Contributor" already assigned to developer@example.com on resource group rg-my-project-dev

トラブルシューティング

ユーザーが見つからない

❌ User not found: user@example.com

原因: 指定されたメールアドレスが Azure AD に登録されていません。

解決方法:

  1. Azure Portal でユーザーが存在することを確認
  2. メールアドレスのスペルミスを確認
  3. ユーザーが Azure AD に招待されていることを確認

権限不足

❌ Failed to assign role "Owner" to user@example.com

原因: 実行ユーザーにロール割り当ての権限がありません。

解決方法:

  1. 自分のアカウントにOwnerまたはUser Access Administratorロールが付与されていることを確認
  2. サブスクリプションレベルまたはリソースグループレベルで権限を確認

Azure CLI にログインしていない

❌ Azure にログインしていません。"az login" コマンドでログインしてください。

解決方法:

az login

ベストプラクティス

1. 階層的なメンバー管理

  • グローバルメンバー: 全環境にアクセスが必要な管理者や DevOps エンジニア
  • 環境固有メンバー: 特定の環境のみにアクセスが必要な開発者やテスター
# 全環境にアクセス
members = ["admin@example.com", "devops@example.com"]

[environments.dev]
# dev環境のみ
members = ["developer@example.com", "intern@example.com"]

[environments.prd]
# prd環境のみ
members = ["sre@example.com"]

2. 環境ごとの分離

本番環境と開発環境で異なるメンバーを設定することで、セキュリティを向上させます:

  • 開発者は開発環境のみにアクセス
  • SRE チームは本番環境にアクセス
  • 管理者はグローバルメンバーとして全環境にアクセス

3. 定期的な見直し

プロジェクトメンバーの変更に応じて、config.toml を更新し、infra apply-rolesを再実行します。

4. CI/CD での自動化

GitHub Actions などのワークフローに組み込むことで、インフラデプロイ時に自動的にロールを付与できます:

- name: Apply RBAC roles to all environments
run: infra apply-roles ${{ matrix.tenant }} --yes

注意事項

ロールの削除について

infra apply-rolesコマンドはロールの追加のみを行います。config.toml からメンバーを削除しても、Azure 上のロール割り当ては自動的に削除されません。

ロールを削除する場合は、Azure Portal またはaz role assignment deleteコマンドを使用して手動で削除してください:

az role assignment delete \
--assignee user@example.com \
--role Contributor \
--resource-group rg-my-project-dev

スコープについて

ロールはリソースグループレベルで付与されます。つまり、指定された環境のすべてのリソース(Container Apps、Database、Redis など)に対してアクセス権限が付与されます。

環境の自動処理

環境引数を省略すると、全ての有効な環境(enabled = trueまたはenabledフィールドが未設定)に対してロールが付与されます。無効な環境(enabled = false)はスキップされます。

エラーハンドリング

複数環境に適用する場合、1 つの環境でエラーが発生しても他の環境の処理は継続されます。最後にサマリーが表示され、失敗した環境を確認できます。

Terraform との関係

この機能は Terraform の外側で管理されるため、Terraform の状態ファイルには記録されません。terraform planterraform applyの実行には影響しません。

関連コマンド

  • infra tenant show <name> - テナント情報の表示(members フィールドを含む)
  • infra validate <tenant> - config.toml の検証(members フィールドの検証を含む)
  • az role assignment list --resource-group <rg-name> - 現在のロール割り当ての確認

参考資料