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
実行フロー
- config.toml からメンバー情報を読み込む
- 処理対象の環境を決定(指定された環境、または全ての有効な環境)
- 各環境のメンバーを計算(グローバル + 環境固有、デデュプリケーション)
- 付与するロールの一覧を表示(環境ごとに分類)
- 確認プロンプトを表示
- 各環境のリソースグループに対してメンバーにロールを付与
確認プロンプトのスキップ
-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 に登録されていません。
解決方法:
- Azure Portal でユーザーが存在することを確認
- メールアドレスのスペルミスを確認
- ユーザーが Azure AD に招待されていることを確認
権限不足
❌ Failed to assign role "Owner" to user@example.com
原因: 実行ユーザーにロール割り当ての権限がありません。
解決方法:
- 自分のアカウントに
OwnerまたはUser Access Administratorロールが付与されていることを確認 - サブスクリプションレベルまたはリソースグループレベルで権限を確認
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 planやterraform applyの実行には影響しません。
関連コマンド
infra tenant show <name>- テナント情報の表示(members フィールドを含む)infra validate <tenant>- config.toml の検証(members フィールドの検証を含む)az role assignment list --resource-group <rg-name>- 現在のロール割り当ての確認