Young Leaves

サービスプリンシパルを使いAzure Windows 仮想マシンをAzure Arc に登録する

オンプレミスのWindows Server やAzure のWindows 仮想マシンをAzure Arc でまとめて管理したいことがあります。今回はサービスプリンシパルを使い、Azure Windows 仮想マシンにConnected Machine エージェントをインストールしAzure Arc に登録する方法について説明します。

実施環境

OS

  • Windows Server 2022 Datacenter

Azure CLI

2.60.0

前提条件

  • Azure CLI を実行できる環境があること
  • RDP 接続が可能であること

Azure Arc とは

Azure Arc はオンプレミスのサーバーやAzure 内外の仮想マシン、Kubernetes クラスター、データサービス、SQL Server などを一元管理するためのサービスです。Azure Arc で一元管理することにより以下のようなことができます。

  • Azure 上でサーバー、仮想マシン、Kubernetes クラスターなどの一元管理
  • Azure VM 拡張機能を用いたサーバーの監視、分析、スクリプトの実行
  • オンプレミスのサーバー、Azure 外の仮想マシンなどへのAzure Policy 適用
  • Microsoft Defender for Endpoint やMicrosoft Defender for Cloud を利用したセキュリティ管理
  • Update Management を利用したAzure Arc 登録サーバーの更新プログラム管理
  • 拡張セキュリティ更新プログラム (ESU) の適用

Azure Arc にサーバーや仮想マシン、Kubernetes クラスターなどを接続する方法はAzure Arc の接続サービスにより異なります。サーバーや仮想マシンを管理する場合はConnected machine エージェントを導入し、Kubernetes クラスターはAzure CLI やAzure PowerShell での接続、Kubernetes のデータサービスはAzure Portal やAzure CLI の登録となります。また、Azure Update Management やグループポリシー、Ansible を利用したサーバー、仮想マシンの一斉登録もできます。

Azure Arc の料金はコントロールプレーンは無料となり、Azure Arc 対応のAzure サービスを利用する場合はサービス分の課金が発生します (例:Log Analytics を利用したVM のログ収集、など) 。また、ESU の適用を行う場合はAzure Arc にて購入が必要となるため、適用対象のサーバー、仮想マシン分の料金が必要となります。

Azure Arc の価格

今回の構成

今回は仮想マシン1台をAzure Arc に登録する構成とします。

リソースプロバイダーの登録

Azure Arc を利用する場合、以下のリソースプロバイダー登録が必要となります。リソースプロバイダーを既に登録済みの場合は本手順はスキップしてください。

  • Microsoft.HybridCompute
  • Microsoft.GuestConfiguration
  • Microsoft.HybridConnectivity
  • Microsoft.AzureArcData (Arc 対応のSQL Server を利用する場合)
  • Microsoft.Compute (Azure Update Manager と拡張機能の自動アップグレードを利用する場合)
# Azure Arc用のリソースプロバイダーを登録する
az provider register --namespace 'Microsoft.HybridCompute'
az provider register --namespace 'Microsoft.GuestConfiguration'
az provider register --namespace 'Microsoft.HybridConnectivity'

# 以下リソースプロバイダーは必要に応じて登録する
az provider register --namespace 'Microsoft.AzureArcData'
az provider register --namespace 'Microsoft.Compute'

リソースグループ、仮想マシンの作成

初めにAzure VM やサービスプリンシパル用のリソースグループを作成します。

# 変数を格納する
RESOURCE_GROUP_NAME="rg-azurearctest"
VIRTUAL_MACHINE_NAME="vm-azurearctest"
VIRTUAL_MACHINE_IMAGE="win2022datacenter"
VIRTUAL_MACHINE_ADMIN_NAME="hogehoge"
VIRTUAL_MACHINE_ADMIN_PASSWORD="a_HOe&kIse-2Tuh7"
LOCATION="japaneast"

# リソースグループを作成する
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION

# Windows仮想マシンを作成する
# RDP接続用に接続するためpublicIpAddressの値を控えておく
az vm create --name $VIRTUAL_MACHINE_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --location $LOCATION \
    --image $VIRTUAL_MACHINE_IMAGE \
    --admin-username $VIRTUAL_MACHINE_ADMIN_NAME \
    --admin-password $VIRTUAL_MACHINE_ADMIN_PASSWORD

サービスプリンシパル、Azure Arc 登録用スクリプトの作成

今回はサービスプリンシパルを利用してWindows 仮想マシンを登録するため、事前にサービスプリンシパルを作成します。Azure Portal からAzure Arc を開き左ペインの「Management > Service Principal > Create service principal」からサービスプリンシパルを作成します。Azure Portal からサービスプリンシパルを作成した場合、Azure Arc に必要なロールを絞り作成できます。

作成時の値は以下を設定し「Create」を選択します。今回はVM で管理を行わないためOnboarding の権限のみ付与します。

Name

azurearctest

Scope assignment level

Subscription

Subscription

利用するサブスクリプション

Description

空欄

Expires

1 month

Roles

Azure Connected machine Onboarding

サービスプリンシパル作成後、シークレットの記載されたテキストファイルをダウンロードするため「ServicePrincipalClientSecret」を控えておきます。サービスプリンシパル作成後、Azure Portal よりAzure Arc 登録用スクリプトを作成します。Azure Portal からAzure Arc を開き左ペインの「Azure Arc resources > machines」から「Add/Create > Add a machine」を選択します。

Azure Arc の登録方法が表示されるため「Add multiple servers > Generate script」を選択します。

スクリプト作成画面が表示されるため、以下内容を設定し「Download and run script」を選択します。タグの付与が必要な場合はタグ選択画面でタグ付けを行ってください。

Subscription

利用するサブスクリプション

Resource group

rg-azurearctest

Region

Japan East

Operating system

Windows

Connectivity method

Public endpoint

Service principal

azurearctest

「Add multiple servers with Azure Arc」画面で「Basic script」を選択しスクリプトをダウンロードします。ダウンロード後、「$ServicePrincipalClientSecret」にサービスプリンシパルのシークレットを入力します。サービスプリンシパル追加後のスクリプトは以下のような形となります。リソースグループ、リージョン、タグの種類によりスクリプトの内容は変化します。

try {
    $ServicePrincipalId="xxxxxxxx-xxxxxxxxx-xxxx-xxxxxxxxxxxx";
    $ServicePrincipalClientSecret="<サービスプリンシパル作成時にダウンロードしたシークレット値>";

    $env:SUBSCRIPTION_ID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
    $env:RESOURCE_GROUP = "rg-vmtest";
    $env:TENANT_ID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
    $env:LOCATION = "japaneast";
    $env:AUTH_TYPE = "principal";
    $env:CORRELATION_ID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
    $env:CLOUD = "AzureCloud";
    

    [Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor 3072;
    Invoke-WebRequest -UseBasicParsing -Uri "https://aka.ms/azcmagent-windows" -TimeoutSec 30 -OutFile "$env:TEMP\install_windows_azcmagent.ps1";
    & "$env:TEMP\install_windows_azcmagent.ps1";
    if ($LASTEXITCODE -ne 0) { exit 1; }
    & "$env:ProgramW6432\AzureConnectedMachineAgent\azcmagent.exe" connect --service-principal-id "$ServicePrincipalId" --service-principal-secret "$ServicePrincipalClientSecret" --resource-group "$env:RESOURCE_GROUP" --tenant-id "$env:TENANT_ID" --location "$env:LOCATION" --subscription-id "$env:SUBSCRIPTION_ID" --cloud "$env:CLOUD" --tags "Datacenter=japandc,City=Tokyo,StateOrDistrict=2024-05-04,CountryOrRegion=japaneast" --correlation-id "$env:CORRELATION_ID";
}
catch {
    $logBody = @{subscriptionId="$env:SUBSCRIPTION_ID";resourceGroup="$env:RESOURCE_GROUP";tenantId="$env:TENANT_ID";location="$env:LOCATION";correlationId="$env:CORRELATION_ID";authType="$env:AUTH_TYPE";operation="onboarding";messageType=$_.FullyQualifiedErrorId;message="$_";};
    Invoke-WebRequest -UseBasicParsing -Uri "https://gbl.his.arc.azure.com/log" -Method "PUT" -Body ($logBody | ConvertTo-Json) | out-null;
    Write-Host  -ForegroundColor red $_.Exception;
}

Azure Arc 登録用スクリプトの配置

Windows 仮想マシン作成後、Azure Arc 登録用スクリプトの内容をクリップボードにコピーしておきリモートデスクトップでログインします。ログイン後、デスクトップに適当なPowerShell スクリプト (拡張子ps1 のファイル) を作成しコピーした内容を貼り付けます。Windows 仮想マシンで拡張子が表示されていない場合は「File explorer > View > file name extensions」にチェックを入れて表示させます。リモートデスクトップ越しのコピーが難しい場合は仮想マシンからAzure Portal にログインしスクリプトをダウンロードしてください。

VM 拡張機能の削除

Azure Arc 登録用スクリプト配置後、対象VM に拡張機能を導入している場合は全て削除します。Azure Portal の場合、対象VM を選択し左ペインの「拡張機能 + アプリケーション」から格納機能を選択し「アンインストール」を選択します。Azure CLI の場合は以下のコマンドで削除を行います。

# Azure VMの拡張機能を削除する
az vm extension delete -g <リソースグループ名> --vm-name <対象VM名> -n <削除する拡張機能名>

VM エージェントサービスの停止、Azure Instance Metadata Service (IMDS) のブロック

Azure VM の拡張機能削除後、VM エージェントサービスを停止します。Connected Machine エージェントはVM エージェントと同様の機能を提供するため、既存のVM エージェントを起動したままだと競合してしまいます。そのため、事前にVM エージェントサービスを停止しておきます。

# VMエージェントサービスを停止する
Set-Service WindowsAzureGuestAgent -StartupType Disabled -Verbose
Stop-Service WindowsAzureGuestAgent -Force -Verbose

VM エージェントの停止後、Azure Instance Metadata Service (IMDS) をFirewall でブロックします。Azure VM のIMDS は仮想マシン作成時に有効となっており、Connected Machine エージェントを導入するとAzure Arc 対応サーバーのIMDS と競合を起こすため事前にブロックを行います。

Azure Arc 対応サーバーは独自の IMDS 実装を提供し、VM の Azure Arc 表現に関する情報を返します。 両方の IMDS エンドポイントが使用できるためにアプリがこの 2 つのいずれかを選択しなければならない状況を回避するために、Azure VM IMDS へのアクセスをブロックして、Azure Arc 対応サーバーの IMDS 実装だけが使用可能になるようにします。

また、こちらをブロックしないとAzure Arc 登録用スクリプト実行時に以下のようなエラーが表示され登録に失敗します。

C:\Users\hogehoge\AppData\Local\Temp\2\install_windows_azcmagent.ps1 : 'Cannot install Azure Connected Machine agent on an Azure Virtual Machine.

Azure Connected Machine Agent is designed for use outside Azure.

To connect an Azure VM for TESTING PURPOSES ONLY, see https://aka.ms/azcmagent-testwarning for more details.

# Azure Instance Metadata Service (IMDS) をブロックするFirewallルールを作成
# こちらをブロックしておかないとConnected machineエージェント実行時にエラーとなる
New-NetFirewallRule -Name BlockAzureIMDS -DisplayName "Block access to Azure IMDS" -Enabled True -Profile Any -Direction Outbound -Action Block -RemoteAddress 169.254.169.254

Azure Arc 登録用スクリプトの実行

Azure VM で一通りの設定完了後、Azure VM でPowerShell を「管理者として実行する」で開き配置したPowerShell のスクリプトを実行します。スクリプトを実行すると以下のような実行結果が表示されます。

PS C:\Users\hogehoge\Desktop> .\test.ps1
VERBOSE: Installing Azure Connected Machine Agent
VERBOSE: Total Physical Memory:     8,191 MB
VERBOSE: PowerShell version: 5.1.20348.2400
VERBOSE: .NET Framework version: 4.8.4161
VERBOSE: Checking if this is an Azure virtual machine
VERBOSE: Error Unable to connect to the remote server checking if we are in Azure
VERBOSE: Downloading agent package from https://aka.ms/AzureConnectedMachineAgent to
C:\Users\HOGEHO~1\AppData\Local\Temp\2\AzureConnectedMachineAgent.msi
VERBOSE: Installing agent package
Installation of azcmagent completed successfully
INFO    Connecting machine to Azure... This might take a few minutes.
INFO    Testing connectivity to endpoints that are needed to connect to Azure... This might take a few minutes.
  20% [==>            ]
  30% [===>           ]
  INFO    Creating resource in Azure...                 Correlation ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Resource ID=/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-azurearctest/providers/Microsoft.HybridCompute/machines/vm-azurearctest
  60% [========>      ]
  80% [===========>   ]
 100% [===============]
  INFO    Connected machine to Azure
INFO    Machine overview page: https://portal.azure.com/#@xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resource/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-azurearctest/providers/Microsoft.HybridCompute/machines/vm-azurearctest/overview

Windows 仮想マシンの登録確認

Azure Arc 登録用スクリプト実行後、Azure Portal から対象サーバーの仮想マシンが登録されたことを確認します。

リソースのクリーンアップ

登録用仮想マシンを削除する前にConnected machine エージェントの切断が必要となるため、Windows 仮想マシンにログインしPowerShell で以下コマンドを実行します。コマンドレットが無いとのエラーが出た場合は一度ターミナル画面を閉じて再度開くと実行できます。

# Connected machineエージェントを切断する
azcmagent disconnect

コマンド実行後、ブラウザが立ち上がりAzure の認証を求められるため、適切なアカウントでログインしブラウザを閉じます。Connected machine エージェントの切断後、Azure Portal から登録用仮想マシンの表示が削除されたことを確認します。仮想マシンの切断後、リソースグループを削除します。

# リソースグループを削除する
az group delete --name rg-azurearctest

リソースグループ削除後、サービスプリンシパルが残るためサービスプリンシパルも削除します。

まとめ

  • Azure Arc はオンプレミスとAzure を含むパブリッククラウドのサーバーやKubernetes クラスター、データベースなどを一元管理できるサービス
  • サーバーや仮想マシンを登録する場合、対象サーバーにConnected machine エージェントを導入しAzure と認証を行う
  • 複数のサーバーを登録する場合、サービスプリンシパルを利用することで認証を簡略化できる

参考資料