【第19回】Azureで社内システム再現（クラウド編）｜Automation を VM 上で動かすために Hybrid Worker を構成した話

## 概要

これまでの「オンプレ編」では、Azure の仮想マシン（IaaS）を使って、社員番号から名前を検索できるシンプルな社内システムを構築してきました。Active Directory、SQL Server、ADFS などを組み合わせ、オンプレミスの構成を仮想的に再現しています。

※全体構成の詳細は、[【第0回】Azureで社内システム再現（オンプレ編）｜構成図と動作の流れ](https://qiita.com/your-link-here) をご参照ください。

クラウド編では、これまでの構成をベースにしつつ、Azure のマネージドサービス（PaaS）を中心とした構成へ段階的に移行していきます。

※クラウド移行全体の設計方針については、[【第10.5回】Azureで社内システム再現（クラウド編）｜オンプレ構成をどうクラウドに移行するか？](https://qiita.com/saba_infra/items/4ff691131593e947d6cf) にまとめています。

## システム構成（前回の対象範囲）

前回の記事では、Azure Automation を使って以下の一連の処理を自動化しました：

- Microsoft Graph API を使って Entra IDからユーザー情報を取得
- データを CSV に整形
- Azure Storage にファイルとして出力
![cloud_automaiton.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/27499949-e0db-4d3b-9dcd-e9a7276f0737.png)
この構成では、Automation アカウントが直接 Graph API やストレージアカウントにアクセスしており、**すべての通信はインターネット経由（パブリックアクセス）で行われていました**。

---

しかし今回は、**社内向けアプリケーションでの実装を想定**しており、セキュリティの観点から以下の要件が求められました：

- すべての処理を仮想ネットワーク内で閉じたい（＝閉域構成）
- インターネットを経由せずに Automation を使いたい
- Storage や Graph API へのアクセスも閉域構成で行いたい

このような構成を実現しようとすると、**クラウド上で実行される通常の Azure Automation では限界があります**。

> Automation アカウントには Private Endpoint を構成できますが、それは受信専用であり、Automation から外部サービス（Graph API や Storage）へのアクセスはインターネット経由となってしまいます。

---

そこで登場するのが、**ハイブリッドランブックワーカー（Hybrid Worker）**です。

---

### ハイブリッドワーカーとは？

Hybrid Worker は、Azure Automation のランブックを **指定した仮想マシン（VM）上で実行できる仕組み**です。

これにより、ランブックの実行環境がクラウドではなく自分で管理する VM に移るため、**仮想ネットワーク内で閉じた構成が可能になります**。

Automation はあくまで「ジョブの送信役」として機能し、  
実際の処理（Graph API へのアクセスやストレージ操作）は Hybrid Worker VM 上で実行されます。

---
### 今回の対象範囲

以下の構成図は、今回新たに構築した閉域型の実行環境を示したものです。

![スクリーンショット 2025-04-18 14.17.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/f2c31873-a546-4340-b5d7-e838f14d6d12.png)

実施した作業は以下です。

- **Automation アカウントにハイブリッドワーカーグループを作成**
- **ランブック実行用の VM をグループに追加（拡張機能が自動インストール）**
- **PowerShell 7 + 必要なモジュールを VM にセットアップ**
- **VM のマネージド ID に Microsoft Graph / Storage のアクセス権を付与**

> Private Endpoint の構成やランブックの実行確認については、次回の記事で扱います。


## ハイブリッドワーカーグループの作成

まず、Automation アカウント上に「ハイブリッドワーカーグループ」を作成します。

これは、ランブックを実行する仮想マシンの**グループ単位の管理枠**です。後ほどこのグループに対して VM を割り当てていきます。

![スクリーンショット 2025-04-05 16.29.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/b5970437-3503-466a-9704-64eb52aae6d8.png)

---

## VMの追加（エージェントの自動インストール）

次に、作成したハイブリッドワーカーグループに、ランブック実行用の VM を追加します。

今回は `hybridworker` という名前で事前に用意していた仮想マシンを対象に指定しました。

![スクリーンショット 2025-04-18 11.31.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/b3f929d4-80db-4eff-9bad-57c22fcf7722.png)

この操作により、対象の VM に Azure Automation エージェントが拡張機能としてインストールされます。

---

## Hybrid Worker VM に実行環境を整える（PowerShell 7 + モジュール）

今回構築した Hybrid Worker でも、前回の記事  
[【第18回】Azureで社内システム再現（クラウド編）｜Graph API×AutomationでCSV自動生成](https://qiita.com/saba_infra/items/3edf9bdc036538b1dcee)  
と同じ実行環境を構築する必要があります。

---

### なぜ VM 側に実行環境を用意する必要があるのか？

Hybrid Runbook Worker（HRW）は、ランブックを **Azure のクラウド上で実行するのではなく、VM 上で実行**する仕組みです。

そのため、ランブック内で使用する PowerShell コマンドやモジュールが、**VM 側にインストールされていないと実行時にエラーになります**。

たとえば、ランブック内で `Connect-AzAccount` や `Get-MgUser` などを使っている場合、それに対応するモジュール（`Az.Accounts` や `Microsoft.Graph`）が VM に存在している必要があります。

> Automation（クラウド実行）の場合は、モジュールをアカウントにインポートすればOKですが、Hybrid Worker は「実際に動かすVM自身」がすべてを持っている必要があります。

---

### PowerShell バージョンの確認とインストール

Azure Automation では PowerShell 7.x を使用していたため、今回もそれと同じバージョンを使うようにします。

しかし、VM に標準でインストールされていたのは PowerShell 5.x だったため、手動で PowerShell 7をインストールしました。
![スクリーンショット 2025-04-07 18.41.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/2b759564-0a7f-4639-9ca1-c9f3c8ebe136.png)


---

### 必要なモジュールのインストール

次に、**前回の記事で Automation 側にインポートして使用していたモジュールと「同じバージョン」**を、今回構築した VM にもインストールしていきます。

> Hybrid Worker では、ランブックを実行するのはあくまで VM 側なので、**モジュールのバージョンが異なると、ランブックが正常に動作しない可能性があります。**

**Automation で使用したのと同じバージョンを明示的に指定してインストール**します。



![スクリーンショット 2025-04-07 19.01.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/4b260b1a-4b5c-4d3d-8109-e97e4fbc4340.png)

```powershell
# Microsoft Graph 関連モジュール
Install-Module Microsoft.Graph.Users -RequiredVersion 2.25.0 -Scope AllUsers -Force
Install-Module Microsoft.Graph.Authentication -RequiredVersion 2.25.0 -Scope AllUsers -Force

# Azure 関連モジュール
Install-Module Az.Storage -RequiredVersion 6.1.0 -Scope AllUsers -Force
Install-Module Az.Accounts -RequiredVersion 2.15.0 -Scope AllUsers -Force
```
---

## VM のマネージド ID に権限を割り当てる（Graph API / Storage）

Hybrid Worker 上のランブックから Microsoft Graph API や Azure Storage にアクセスするには、VM に割り当てた **マネージド ID（System-Assigned Managed Identity）に適切な権限を付与**しておく必要があります。

これは前回、Automation アカウントに対して行った設定と同様の内容です。

---

### Graph API へのアクセス権付与（User.Read.All）

Hybrid Worker 上のランブックから Microsoft Graph API を使用するために、**VM のマネージド ID（システム割り当てマネージド ID）に「User.Read.All」のアプリケーション権限を付与**する必要があります。

Azure ポータル上では Microsoft Graph に対してアプリケーションロールを直接割り当てる UI が存在しないため、**PowerShell から手動でロール割り当て**を行います。

以下のスクリプトは、Hybrid Worker VM のマネージド ID を対象に `User.Read.All` 権限を付与するものです。

```powershell
# Hybrid Worker VM のマネージド ID（Service Principal ID）を指定
$spId = "<Hybrid Worker VM のマネージド ID（オブジェクト ID）>"

# Microsoft Graph のサービスプリンシパルを取得
$graphSp = Get-MgServicePrincipal -Filter "appId eq '00000003-0000-0000-c000-000000000000'"

# User.Read.All のロールを取得（アプリケーション権限）
$userReadRole = $graphSp.AppRoles | Where-Object {
    $_.Value -eq "User.Read.All" -and $_.AllowedMemberTypes -contains "Application"
}

# アクセス権限を割り当てる
New-MgServicePrincipalAppRoleAssignment `
    -PrincipalId $spId `
    -ResourceId $graphSp.Id `
    -AppRoleId $userReadRole.Id
```


割り当て完了後、以下のように `hybridworkergroup`（VM名）のマネージド ID に `User.Read.All` 権限が追加されたことを確認できます。

![スクリーンショット 2025-04-07 19.09.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/4ea17cf7-af11-4f41-91e6-4611dd078226.png)

---

### ストレージアカウントへのロール割り当て

次に、Hybrid Worker VM のマネージド ID に対して、Azure Storage へのアクセス権を割り当てます。

今回は、**Automation アカウントのマネージド ID に設定していたものと同じ内容**で、以下の2つのロールを割り当てました。

- **ストレージ BLOB データ共同作成者**  
  → BLOB コンテナー内のデータに対して、読み取り・書き込みが可能

- **ストレージ アカウント共同作成者**  
  → ストレージアカウント全体のデータ操作（Queue や File など含む）に関するフルアクセスが可能

![スクリーンショット 2025-04-18 12.44.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/9b20f567-8113-4734-a783-636f82919b08.png)

これらのロールを割り当てることで、Hybrid Worker 上のランブックからBLOB ストレージへのファイル出力が可能になります。


これで、Hybrid Worker VM のマネージド ID に必要なアクセス権の付与が完了しました。

---