JavaScriptを有効にしてください

Bicep で Microsoft Entra ID リソースを操作し隊

 ·   5 分で読めます  ·   [Kento GitHub Copilot]

今回は Microsoft Graph Bicep 拡張機能を使って Microsoft Entra ID のリソースを Bicep で操作する方法を検証してみます。
従来の RBAC 割り当てではセキュリティ プリンシパル ID が必要でしたが、Microsoft Graph Bicep 拡張機能を使うことで UserPrincipalName を直接使用できるようになります。

本記事は GitHub Copilot を活用して作成しています。

Microsoft Graph Bicep 拡張機能とは

Microsoft Graph Bicep 拡張機能は、Microsoft Graph API を通じて Microsoft Entra ID(旧 Azure AD)のリソースを Bicep テンプレートで管理できるようにする機能です。

主な特徴

  • Microsoft Entra ID リソースの直接管理: ユーザー、グループ、アプリケーション登録などを Bicep で定義
  • 統合されたデプロイメント: Azure リソースと Microsoft Entra ID リソースを単一のテンプレートで管理

対応しているリソースタイプ

主要なリソースタイプには以下があります:

  • Microsoft.Graph/users - ユーザー
  • Microsoft.Graph/groups - グループ
  • Microsoft.Graph/applications - アプリケーション登録
  • Microsoft.Graph/servicePrincipals - サービス プリンシパル

その他は Microsoft Graph Bicep リソース リファレンスの概要 - Microsoft Graph Bicep v1.0 reference | Microsoft Learn を見てください

従来の課題

セキュリティ プリンシパル ID の取得が必要

従来の Bicep を使った RBAC 割り当てでは、ユーザーやグループにロールを割り当てる際にセキュリティ プリンシパル ID(オブジェクト ID)を事前に調べる必要がありました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 従来の方法:セキュリティ プリンシパル ID が必要
param principalId string // '12345678-1234-1234-1234-123456789012' のような GUID

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(resourceGroup().id, principalId, 'Reader')
  properties: {
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7') // Reader role
    principalId: principalId
    principalType: 'User'
  }
}

この方法の問題点:

  1. 事前調査が必要: Azure Portal や PowerShell、CLI でセキュリティ プリンシパル ID を調べる必要がある
  2. 人的エラーのリスク: GUID の入力ミスが発生しやすい
  3. 可読性の低下: コードを見ただけではどのユーザーか判断できない
  4. メンテナンス性: ユーザーが変更になった場合、新しい GUID を調べ直す必要がある

Microsoft Graph Bicep 拡張機能による解決

UserPrincipalName での参照

Microsoft Graph Bicep 拡張機能を使用すると、UserPrincipalName を使ってユーザーを参照し、そのオブジェクト ID を動的に取得できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// Microsoft Graph Bicep 拡張機能を使用した方法
param userPrincipalName string = 'user@contoso.com'

// Microsoft.Graph/users リソースでユーザー情報を取得
resource graphUser 'Microsoft.Graph/users@v1.0' existing = {
  uniqueName: userPrincipalName
}

// 取得したユーザーのオブジェクト ID を使用してロール割り当て
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(resourceGroup().id, graphUser.id, 'Reader')
  properties: {
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7') // Reader role
    principalId: graphUser.id
    principalType: 'User'
  }
}

この方法の利点:

  1. 直感的: メールアドレス(UserPrincipalName)で指定できる
  2. 可読性: コードを見ただけでどのユーザーか分かる
  3. エラー軽減: GUID を手動で入力する必要がない
  4. 自動化: セキュリティ プリンシパル ID の動的取得

ざっくり手順

1. 前提条件の確認

Microsoft Graph Bicep 拡張機能を使用するには以下の前提条件があります:

  • Bicep CLI v0.4.1008 以降
  • Microsoft Graph への適切なアクセス許可
  • Microsoft Entra ID テナントへの管理者権限

2. Microsoft Graph Bicep 拡張機能の設定

重要: Microsoft Graph Bicep 拡張機能を使用するためには、Bicep ファイルの冒頭で拡張機能を明示的に宣言する必要があります。

拡張機能の宣言

Bicep ファイルの最初の行で以下のように拡張機能を宣言します:

1
extension 'br:mcr.microsoft.com/bicep/extensions/microsoftgraph/v1.0:0.2.0-preview'

拡張機能のバージョンについて

  • 最新のバージョン情報は Microsoft Artifact Registry で確認できます
  • 現在はプレビュー版が利用可能です(0.2.0-preview
  • 本格運用の際は最新の安定版を使用することをお勧めします

注意事項

Microsoft Graph Bicep 拡張機能を使用する際の重要な注意点:

  1. 拡張機能の宣言が必須: extension 宣言がないと Microsoft Graph リソースを使用できません
  2. 適切なアクセス許可: Microsoft Graph API への読み取り権限が必要です
  3. テナント管理者権限: ユーザーやグループの情報にアクセスするには適切な権限が必要です

詳細については、Microsoft Graph Bicep リソースに動的な型を使用する を参照してください。

3. Bicep ファイルの作成

まず、基本的な Bicep ファイルを作成します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
extension 'br:mcr.microsoft.com/bicep/extensions/microsoftgraph/v1.0:0.2.0-preview'
// main.bicep
param userPrincipalName string
param roleDefinitionID string = 'acdd72a7-3385-48ef-bd42-f606fba81ae7' // Reader role definition ID

// Microsoft Graph からユーザー情報を取得
resource targetUser 'Microsoft.Graph/users@v1.0' existing = {
  userPrincipalName: userPrincipalName
}

// リソースグループに Reader ロールを割り当て
var roleAssignmentName = guid(userPrincipalName, roleDefinitionID, resourceGroup().id)
resource readerRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: roleAssignmentName
  properties: {
    roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionID)
    principalId: targetUser.id
  }
}

output assignedUserId string = targetUser.id
output assignedUserName string = targetUser.userPrincipalName
output roleAssignmentId string = readerRoleAssignment.id

4. パラメータファイルの作成

パラメータファイルでユーザーを指定します:

1
2
3
4
5
6
7
8
9
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "userPrincipalName": {
      "value": "user@contoso.com"
    }
  }
}

5. デプロイメントの実行

Azure CLI を使用してデプロイします:

1
2
3
4
5
6
7
8
# リソースグループの作成
az group create --name myResourceGroup --location japaneast

# Bicep テンプレートのデプロイ
az deployment group create \
  --resource-group myResourceGroup \
  --template-file main.bicep \
  --parameters parameters.json

6. 結果の確認

デプロイ後、Azure Portal でロール割り当てを確認できます:

  1. Azure Portal でリソースグループに移動
  2. 「アクセス制御 (IAM)」を選択
  3. 「ロールの割り当て」タブで指定したユーザーに Reader ロールが割り当てられていることを確認
rbac_assignment_verification
ロール割り当ての確認:

従来方法との比較

項目 従来の方法 Microsoft Graph Bicep 拡張機能
ユーザー指定方法 オブジェクト ID (GUID) UserPrincipalName (メールアドレス)
事前調査 必要 不要
可読性 低い 高い
エラー率 高い 低い
メンテナンス性 低い 高い
動的取得 不可 可能

まとめ

Microsoft Graph Bicep 拡張機能を使用することで、以下のメリットが得られます:

  1. 開発効率の向上: セキュリティ プリンシパル ID を事前に調べる手間が不要
  2. コードの可読性向上: UserPrincipalName による直感的な記述
  3. エラー削減: GUID の手動入力によるミスを防止
  4. 運用性の向上: ユーザー変更時の保守性が向上

従来の RBAC 割り当て方法と比較して、より効率的で保守しやすい IaC (Infrastructure as Code) を実現できます。特に大規模な組織や複数のユーザーに権限を割り当てる場合には、この機能の恩恵を大きく受けることができるでしょう。

Microsoft Graph Bicep 拡張機能は、Azure リソースと Microsoft Entra ID リソースの統合管理を可能にし、現代的なクラウドインフラの管理に欠かせない機能となっています。

参考

共有

Kento
著者
[Kento GitHub Copilot]
2020年に新卒で IT 企業に入社. インフラエンジニア(主にクラウド)として活動中