Azure Automation RunbookからExchange Onlineに接続する
この記事の内容
- Azure Automation RunbookとManaged Identityを使って、Exchange OnlineをPowerShellで自動化する方法を解説します
- Managed IDをExchange管理者ロールに割り当てる手順を説明します
- Exchange OnlineへのManaged ID認証に必要な
Exchange.ManageAsAppAPIアクセス許可の付与方法を紹介します - ランタイム環境はPowerShell 5.1が必要である点など、ハマりやすいポイントを共有します
- RunbookにスケジュールをリンクしてExchange Online操作を定期実行する方法をまとめます
なぜAzure AutomationとManaged Identityを使うのか
Exchange OnlineはPowerShellで自由に操作できますが、手動で実行する場合は多要素認証への応答が毎回必要になります。定期的に繰り返し実行したい処理であれば、人間が都度操作するのは現実的ではありません。
こうした定期実行の自動化には、AzureのAzure Automationが有効です。Azure AutomationのRunbookにPowerShellスクリプトを記述しておき、スケジュールで自動実行させることができます。
認証方式としては、IDとパスワードを使ったり証明書やサービスプリンシパルを別途作成したりする方法もありますが、最もシンプルで推奨される方法が**Managed Identity(マネージドID)**です。Managed IDを使えば、認証情報を管理する手間が不要になります。
全体の構成
今回の自動化の流れは次のとおりです。
- Azure AutomationアカウントをSystem-assigned Managed Identityで作成する
- そのManaged IDをEntra IDのExchange管理者ロールに割り当てる
- Managed IDにExchange.ManageAsApp APIアクセス許可を付与する
- RunbookにPowerShellスクリプトを記述してExchange Onlineに接続する
- Runbookを公開し、スケジュールにリンクして定期実行を設定する
手順1: Automationアカウントの作成
Azureポータルで「Automation」と検索し、オートメーションアカウントを作成します。
設定のポイントは以下のとおりです。
- マネージドID: 「システム割り当て」を選択します。ユーザー割り当て型は再利用性が高いですが、1つのAutomationアカウントを使い続ける場合はシステム割り当てで十分です
- ネットワーク: 特別な要件がなければパブリックアクセスで問題ありません
作成が完了すると、Automationアカウントと同時にManaged IDが自動生成されます。このManaged IDはEntra IDのエンタープライズアプリケーションとして登録されており、サービスプリンシパルとも呼ばれます。名称が複数あって混乱しやすいですが、「Managed ID = エンタープライズアプリケーション = サービスプリンシパル」と同一のものと理解しておいてください。
手順2: Exchange管理者ロールの割り当て
Automationアカウントのプリンシパルに、Exchange Onlineを操作するための権限を与えます。
- AzureポータルでMicrosoft Entra IDを開きます
- ロールと管理者を選択します
- Exchange管理者ロールを検索して開きます
- 割り当ての追加をクリックし、先ほど作成したAutomationアカウント名(またはオブジェクトID)で検索します
- 表示されたサービスプリンシパルを選択して追加します
手順3: Exchange.ManageAsApp APIアクセス許可の付与
これがよくはまるポイントです。Exchange管理者ロールを割り当てるだけでなく、Exchange.ManageAsAppというAPIアクセス許可もManaged IDに付与する必要があります。この手順を忘れると、Runbook実行時に認証エラーが発生します。
許可の付与にはMicrosoft Graph PowerShell SDKを使います。ローカルPCのPowerShellで以下を実行してください。
# Microsoft Graph PowerShell SDKのインストール
Install-Module Microsoft.Graph -Scope CurrentUser -Repository PSGallery -Force
# Microsoft Graphに接続
Connect-MgGraph
# Exchange OnlineリソースのサービスプリンシパルIDを取得
$ExchangeServicePrincipal = Get-MgServicePrincipal -Filter "AppId eq '00000002-0000-0ff1-ce00-000000000000'"
$AppRoleId = ($ExchangeServicePrincipal.AppRoles | Where-Object {$_.Value -eq "Exchange.ManageAsApp"}).Id
# AutomationアカウントのManaged IDをサービスプリンシパルとして取得
Connect-AzAccount -AuthScope MicrosoftGraphEndpointResourceId
$AutomationSP = Get-AzADServicePrincipal -DisplayName "<Automationアカウント名>"
$MyId = $AutomationSP.Id
# Exchange.ManageAsApp アクセス許可を付与
New-MgServicePrincipalAppRoleAssignment `
-ServicePrincipalId $MyId `
-PrincipalId $MyId `
-ResourceId $ExchangeServicePrincipal.Id `
-AppRoleId $AppRoleId
手順4: Runbookの作成とスクリプトの記述
AutomationアカウントのRunbookを新規作成します。
- Runbookの種類: PowerShell
- ランタイムバージョン: 5.1(重要: 後述)
Runbookに記述するPowerShellスクリプトの基本構成は以下のとおりです。
try {
# Managed IDで認証する(ベストプラクティス)
Connect-AzAccount -Identity
# Exchange Onlineモジュールのインポート
Import-Module ExchangeOnlineManagement
# Exchange OnlineにManaged IDで接続する
Connect-ExchangeOnline -ManagedIdentity -Organization "<テナントドメイン>.onmicrosoft.com"
# Exchange Onlineへの操作(例: メールボックス一覧の取得)
Get-Mailbox
} catch {
Write-Error "エラーが発生しました: $_"
}
Connect-AzAccount -Identityの-IdentityパラメーターがManaged IDで認証するためのキーポイントです。IDパスワードや証明書は不要で、これだけでManaged IDとしてトークンを取得できます。
Connect-ExchangeOnlineの-ManagedIdentityパラメーターと-Organizationパラメーターの組み合わせにより、ユーザーの対話なしにExchange Onlineへ接続できます。
手順5: ExchangeOnlineManagementモジュールの追加
Automationアカウントには、デフォルトでExchange Onlineのモジュールが含まれていません。以下の手順でモジュールを追加します。
- AutomationアカウントのメニューからSCHARED RESOURCES > モジュールを開きます
- モジュールの追加をクリックし、ギャラリーから参照を選択します
ExchangeOnlineManagementを検索して選択します- ランタイムバージョンに5.1を選択してインポートします
ランタイム環境に関する注意点
検証の過程でいくつかのポイントが明らかになりました。
PowerShell 5.1を使用すること
Exchange Online PowerShellは、現時点ではPowerShell 5.1でのみ動作します。PowerShell 7.2や7.4ではManaged ID認証時にエラーが発生するため、Runbook作成時のランタイムバージョンは必ず5.1を選択してください。
ランタイム環境を使う場合
Automationアカウントのランタイム環境機能(プレビュー)を使うと、より柔軟な環境設定が可能です。新しいランタイム環境を作成する場合は次のように設定します。
- 言語: PowerShell
- バージョン: 5.1
- パッケージ: ExchangeOnlineManagement(ギャラリーから追加)
ランタイム環境を使うほうが、実行環境を明示的に管理できるためおすすめです。
手順6: Runbookの公開とスケジュール設定
スクリプトの動作確認ができたら、Runbookを発行します。
- Runbookの編集画面から発行をクリックします
- スケジュールにリンクするを選択します
- 新しいスケジュールを作成し、以下を設定します
- 開始日時
- タイムゾーン
- 繰り返し頻度(毎日、毎週など)
- 有効期限(任意)
スケジュールにリンクすることで、人の手を借りずに定期的にExchange Onlineへの処理が自動実行されるようになります。
まとめ
Azure Automation RunbookからExchange OnlineにManaged IDで接続する手順をまとめます。
| ステップ | 内容 |
|---|---|
| 1 | AutomationアカウントをSystem-assigned Managed IDで作成 |
| 2 | Entra IDのExchange管理者ロールにManaged IDを割り当て |
| 3 | Microsoft Graph PowerShell SDKでExchange.ManageAsApp許可を付与 |
| 4 | PowerShell 5.1でRunbookを作成し、Connect-AzAccount -Identityで認証 |
| 5 | Connect-ExchangeOnline -ManagedIdentityでExchange Onlineに接続 |
| 6 | ExchangeOnlineManagementモジュールをAutomationアカウントに追加(5.1用) |
| 7 | Runbookを発行してスケジュールにリンク |
最大のポイントは、Exchange管理者ロールの割り当てだけでなく、Exchange.ManageAsApp APIアクセス許可の付与が別途必要である点です。また、ランタイムはPowerShell 5.1を使用することも重要な制約として覚えておいてください。
公式ドキュメントとしては「Azure Managed IDを使用してExchange Onlineに接続する」という記事が参考になります。手順を上から読むだけでなく、Managed IDを使った接続方法のセクションを探して参照するようにしてください。