Azure Arc へのオンプレサーバーの登録(一部閉域化)
はじめに
以前 Azure Arc へのオンプレサーバーの登録 (Arc-enabled servers) の記事をアップしましたが、今回は ESU の利用を行うシナリオでアクセスするエンドポイントに対してプライベート化を行う場合の手順を纏めたいと思います
Azure Arc のネットワーク要件について
Azure Arc を利用するのにアクセスするエンドポイント一覧が以下の公式 Docs に纏められています。以前はネットワーク要件に関して頻繁に更新されることが多かったので、念のため日本語版ではなく英語版の Docs のリンクを載せておきます
本検証環境では、拡張セキュリティ更新プログラム (ESU) を利用する際に必要となるエンドポイントに対して作業を実施していきます
上記の図にある通り、プライベートリンクを構成することが出来るのは以下2つとなります(それ以外はパブリックでのアクセスが必要となります)
- *.his.arc.azure.com (メタデータとハイブリッド ID サービス用エンドポイント)
- *.guestconfiguration.azure.com(拡張機能管理とゲスト構成サービス用エンドポイント)
検証環境の構成図
なお、本検証環境における各エンドポイントへのアクセス経路は以下の通りです
上記の図では「プライベートIPが返ってくる」部分について色々と説明を省略していますが、名前解決のフローは以下の通りとなります
[問い合わせフロー]
Onpre VM#1 --> Onpre DNS Server --> Private Resolver --> Azure DNS Server (168.63.129.16) --> プライベート DNS ゾーン
もう少しだけ丁寧に説明している記事は こちら にあります(興味があれば)
作業の流れ
- オンプレ DNS Server の作成
- オンプレ VM の作成
- 事前準備
- Azure Arc プライベートリンクスコープ(AAPLS) の作成
- Private DNS Resolver の作成
- DNS フォワーダー設定(DNSサーバー)
- Arc へのオンボード準備
- Arc へのオンボード
- ESU の構成
1. オンプレ DNS Server の作成
1-1. DNS サーバーの構成
DNSサーバーの役割をインストールします。
本手順は同僚の記事の 3-2. Azure 上のカスタム DNS サーバー で 168.63.129.16 をフォワーダーとして設定する を参照してください
[該当箇所]
- DNS の役割をインストールする
2. オンプレ VM の作成
windows Server 2012 R2 のイメージを利用して仮想マシンをデプロイします。また、SQL Server 2012 も併せてインストールを行います
2-1. オンプレVMのデプロイ (Windows Server 2012 R2)
Windows Server 2012 R2 のイメージは Azure 上に存在していないため、ローカルマシンの Hyper-V で作成したイメージを持ち込んでいます。Hyper-V の仮想マシンを Azure VM に移行する手順は以下の記事を参照してください
2-2. SQL Server 2012 のインストール
デプロイが完了した後、SQL Server 2012 のインストールを実施します。本手順は検索いただければ記事がヒットすると思うので、記事を参考にインストールを実施してください
私は以下の記事を参照してインストールを実施しました(本検証で利用したエディションは Standard となります)
なお、以下Docs に記載がある通り ESU を適用する場合は最新の SQL Server Service パックを適用している必要がありますのでご注意ください
拡張セキュリティ更新プログラムのメリットを活用するためには、最新の SQL Server Service パックを実行している必要がありますか?
はい。ESU を適用するために、最新の Service パックを使用して SQL Server を実行する必要があります。 Microsoft では、最新の Service パックに適用可能な更新プログラムのみを作成します。
SQL Server 2012 SP4 は以下からダウンロード可能です
2-3. SQL Server 2012 のインストール確認
インストール完了後に、SQL Server Management Studio (SSMS) にてデータベースサーバーにログインできることを確認します
2-3-1. SSMSの起動
2-3-2. ログイン
2-4. Arc登録の準備(SQL Server 向け)
SQL Server を有効化する際の前提条件は以下の通りとなります。内容を確認して前提条件を満たすようにしてください
私の環境( Windows Server 2012 R2 + SQL Server 2012 Standard )では以下の作業が必要でした
- .Net Framework 4.7.2 のインストール
- Microsoft Visual C++ 再頒布可能パッケージ のインストール
2-4-1. .NET Framework 4.7.2のインストール
以下URLよりパッケージをダウンロードしてインストールを実施します
2-4.2. Microsoft Visual C++ 再頒布可能パッケージ のインストール
以下のURLよりパッケージをダウンロードしてインストールを実施します
3. 事前準備
Azure上の仮想マシンは Azure Arc へ登録を行うことができないため、Azure で管理されていないように偽装する必要があります。また、併せて Onpre VM#1 が参照する DNS サーバーを Onpre DNS Server に変更を行います
また、リソースプロバイダーの登録も実施します
3-1. Azure で管理されていないように偽装
本手順は 1. 事前準備 (Azure VMでの作業) を参照してください
[該当箇所]
- 1-1. 拡張機能のアンインストール
- 1-2. ゲストエージェントの無効化
- 1-3. Azure IMDS エンドポイントへのアクセスをブロック
3-2. DNS サーバーの変更
Arc 登録対象サーバー(Onpre VM#1)の DNS を DNSサーバー(Onpre DNS Server)に向けます
本手順は 5-1. 仮想ネットワークのDNSサーバー設定 を参照してください
[該当箇所]
- 5-1. 仮想ネットワークのDNSサーバー設定
3-3. リソースプロバイダーの登録
以下のリソース プロバイダーを登録する
- Microsoft.HybridCompute
- Microsoft.GuestConfiguration
- Microsoft.HybridConnectivity
- Microsoft.AzureArcData
登録するリソースプロバイダーについては Docs に記載がある通りです
本手順は 2-1. Azure リソースプロバイダーの登録 を参照してください
[該当箇所]
- 2-1. Azure リソースプロバイダーの登録
4. Azure Arc プライベートリンクスコープ(AAPLS) の作成
パブリックではなく Azure Arc にプライベートに接続するために Azure Arc プライベートリンクスコープ (AAPLS) を作成します
詳細は以下の記事をご参照ください
4-1. AAPLS の作成
4-2. 作成されたリソースの確認
リソースが作成されたことを確認します
Private DNS Zone が DNS Private Resolver をデプロイする VNet と接続されていることを確認します(作成された全ての Private DNS Zone で確認する)
割り当てられたプライベート IP アドレスを確認します(後ほどの動作確認で利用)
プライベート DNS ゾーンにレコードが追加されていることを確認します
- privatelink.his.arc.azure.com
- privatelink.guestconfiguration.azure.com
- privatelink.dp.kubernetesconfiguration.azure.com
5. DNS Private Resolver の作成
オンプレの DNS サーバーのフォワーダー先として利用するため Azure DNS Private Resolver を作成します
5-1. DNS Private Resolver の作成
本手順は 2-1. Azure DNS Private Resolver の作成 を参照してください
[該当箇所]
- 2-1. Azure DNS Private Resolver の作成
- 2-2. 受信エンドポイントの作成
後ほど DNS サーバーの条件付きフォワーダーの設定で転送先のアドレスを設定するので Private DNS Resolver の受信エンドポイント のIPアドレスを控えておいてください
6. DNS フォワーダー設定(DNSサーバー)
6-1. DNS フォワーダー設定
プライベートエンドポイントに対する DNS クエリを Private DNS Resolver へ転送するためにオンプレの DNS サーバーにて条件付きフォワーダーを設定します
本手順は 4. DNS フォワーダー設定 (AD Server) を参照してください
[該当箇所]
-
- DNS フォワーダー設定 (AD Server)
指定する DNS ドメインは以下の3つとなります
- his.arc.azure.com
- guestconfiguration.azure.com
- dp.kubernetesconfiguration.azure.com
6-2. 動作確認
Arc登録対象サーバー(Onpre VM#1)よりプライベートエンドポイントのアドレスを正しく解決できることを確認する
プライベートエンドポイントのIPアドレスを取得できることの確認
nslookup gbl.his.arc.azure.com
nslookup agentserviceapi.guestconfiguration.azure.com
nslookup japaneast.dp.kubernetesconfiguration.azure.com
ちなみにですが、本環境では オンプレの DNS Server で名前解決してもプライベート IP は取得できません。必要な場合は DNS Server VM 自体の DNS 設定を自分自身に向ける必要がありますのでご注意ください
本環境ではオンプレ相当の環境も Azure 上に作成していますが、何も設定しない場合 DNS Server VM は デフォルトで 168.63.129.16 (Azureの内部リゾルバー) を利用して名前解決を行います。168.63.129.16 は Azure のサービス名の解決や、通常のパブリック DNS の解決を行うことができるのですが、本環境では DNS Server VM が接続している VNet は Private DNS Zone とリンクしていないため、プライベート IP ではなくパブリック IP が返されてしまいます
168.63.129.16 については以下のDocsを参照してください
7. Arc へのオンボード準備
デプロイ方法は複数存在していますが、本手順では「デプロイスクリプト (大規模向け)」の方法にて検証を実施しています。
その他のデプロイ方法は Azure Connected Machine エージェントのデプロイ オプション を参照してください
7-1. サービスプリンシパルの作成
本手順は 2-3. サービスプリンシパルの作成 を参照してください
[該当箇所]
- 2-3. サービスプリンシパルの作成
7-2. オンボードスクリプトの生成
Azure Arc へオンボードを行うためのスクリプトを生成します
手順の詳細は Azure Arc のオンボードスクリプトの留意点 を参照してください
スクリプトのダウンロードが完了したら、ウィンドウは閉じていただいて大丈夫です
7-3. オンボードスクリプトの修正
作成されたスクリプトにて変数を修正します
ほとんど自動で入力されるため、内容に誤りがないかの確認がメインとなります
変数 | 設定内容 | 自動入力 |
---|---|---|
$ServicePrincipalId | サービスプリンシパルID | ○ |
$ServicePrincipalClientSecret | サービスプリンシパルのシークレット | × |
$env:SUBSCRIPTION_ID | サブスクリプションID | ○ |
$env:RESOURCE_GROUP | Arcリソースを登録するリソースグループ | ○ |
$env:TENANT_ID | テナントID | ○ |
$env:LOCATION | ロケーション | ○ |
$env:AUTH_TYPE | principal | ○ |
$env:CORRELATION_ID | 固有の識別子 | ○ |
$env:CLOUD | AzureCloud | ○ |
生成されたスクリプトを以下に貼っておきますので興味があればご確認ください
生成されたオンボードスクリプト
$global:scriptPath = $myinvocation.mycommand.definition
function Restart-AsAdmin {
$pwshCommand = "powershell"
if ($PSVersionTable.PSVersion.Major -ge 6) {
$pwshCommand = "pwsh"
}
try {
Write-Host "This script requires administrator permissions to install the Azure Connected Machine Agent. Attempting to restart script with elevated permissions..."
$arguments = "-NoExit -Command `"& '$scriptPath'`""
Start-Process $pwshCommand -Verb runAs -ArgumentList $arguments
exit 0
} catch {
throw "Failed to elevate permissions. Please run this script as Administrator."
}
}
try {
if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
if ([System.Environment]::UserInteractive) {
Restart-AsAdmin
} else {
throw "This script requires administrator permissions to install the Azure Connected Machine Agent. Please run this script as Administrator."
}
}
# サービス プリンシパル アプリケーション ID とシークレットをこちらで追加してください
$ServicePrincipalId="<ENTER SERVICE PRINCIPAL ID HERE>";
$ServicePrincipalClientSecret="<ENTER SECRET HERE>";
$env:SUBSCRIPTION_ID = "<ENTER SUBSCRIPTSION ID HERE>";
$env:RESOURCE_GROUP = "arc-private-RG";
$env:TENANT_ID = "<ENTER TENANT ID HERE>";
$env:LOCATION = "japaneast";
$env:AUTH_TYPE = "principal";
$env:CORRELATION_ID = "592684ce-0cc7-41b9-a258-8e2e330e73fc";
$env:CLOUD = "AzureCloud";
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor 3072;
# インストール パッケージをダウンロードします
Invoke-WebRequest -UseBasicParsing -Uri "https://gbl.his.arc.azure.com/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" --private-link-scope "/subscriptions/<SUBSCRIPTION ID>/resourceGroups/arc-private-RG/providers/Microsoft.HybridCompute/privateLinkScopes/AAPLS" --tags 'Datacenter=onpre,City=Minato-ku,StateOrDistrict=Tokyo,CountryOrRegion=Japan' --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;
8. Arc へのオンボード
修正したスクリプトを Arc 登録対象サーバー(Onpre VM#1)で実行し、Azure に登録されたことを確認します
8-1. スクリプトの実行
修正したスクリプトを Arc 登録対象サーバー (Onpre VM#1) に配置し、実行します
スクリプト名 | 設置場所 |
---|---|
OnboardingScript.ps1 | C:\Tools |
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Get-ExecutionPolicy -List
cd C:\Tools
.\OnboardingScript.ps1
実行した際の画面ショットは以下の通りとなります
8-2. 登録確認
8-2-1. Azure Arc に インスタンスとして登録されていることを確認します
8-2-2. SQL 用拡張機能の確認
Arc登録サーバーに SQL 用拡張機能がインストールされていることを確認します(Azure Arc に接続されているサーバーに SQL Server がインストールされている場合は SQL 用拡張機能は自動でインストールされます)
9. ESU の構成
9-1. Windows Server 2012 R2 の ESU 構成
以下ドキュメントを参照し ESU の構成 を実施してください
- KB5031043: 延長サポートが 2023 年 10 月 10 日に終了した後もセキュリティ更新プログラムを受け取り続ける手順
- Azure Arc 対応 Windows Server 2012 の拡張セキュリティ更新プログラムの課金サービス
- Windows Server 2012 用の拡張セキュリティ更新プログラムを配信する
- Generally Available: Transition to WS2012 / R2 ESUs enabled by Azure Arc from Volume Licensing
補足事項は以下の通りとなります
- 2023年8月8日以降のSSUが適用されている必要があります(KB5029368)
- 拡張セキュリティ更新プログラムのライセンス作成時に「ライセンスの認証を行う」という項目がありますが、「今すぐアクティブ化」を指定すると課金が即座に開始されるためご注意ください
- ESU の契約を2年目から Arc契約 に切り替える場合は、ライセンス作成時に「ボリュームライセンス」の項目で 「ボリュームライセンスで購入した1年目の ESU ライセンスの請求書 ID」の入力が必要となります(こちらを入力しないで Azure Arc で ESU ライセンスを作成すると、1年目の ESU ライセンス料金が遡及で請求されてしまうのでご注意ください)
9-2. SQL Server 2012 の ESU 構成
SQL Server の場合は ESU を購入した方法によって登録方法が異なります
本検証では「サブスクリプションにて ESU を購入」を前提としていますが、「ボリュームライセンスセンターを通じて ESU を購入」する場合についても調べて纏めました
オプション | 購入方法 | やること |
---|---|---|
ESU プラン | ボリュームライセンスセンターを通じて ESU を購入 | Azure Portal にて SQL Server インスタンスを手動で登録(=登録済みインスタンス)し、ESU 請求書をリンクする |
ESU サブスクリプション | サブスクリプションにて ESU を購入 | Azure Arc に接続(=接続済みインスタンス)し、ESU サブスクリプションを有効化する |
ボリュームライセンスセンターを通じて ESU を購入の場合
ESU プランの場合は、まずは、以下の手順で SQL Server インスタンスを手動で追加する必要があります
その後、ESU 請求書のリンクを行います
サブスクリプションにて ESU を購入の場合
ESU サブスクリプションの場合は、Azure Arc に接続(=接続済みインスタンス)での登録となるため、ESU サブスクリプションを有効化するだけで大丈夫です。有効化の手順は以下をご参照ください
なお、「ボリュームライセンスセンターを通じて ESU を購入」した場合はパッチは 手動インストールのみがサポートされます(= Azure Portal からダウンロードして適用する必要がある)
「サブスクリプションにて ESU を購入」した場合は自動インストールもサポートされているので、Windows Update を利用したパッチ適用が可能です
まとめ
今回は Azure Arc への接続を閉域化する手順を纏めました。全ての接続を閉域化できるわけではないのでご注意ください
ESU での利用の場合は MS Peering を利用すれば閉域化することは可能だと考えますが、Arc 利用で必要となるパブリックエンドポイントに対する通信の全てが MS Peering を通れるかどうかは机上の調査しかできないため、実際の環境で MS Peering 経由で接続できるかどうかの確認を実施頂く必要があると思います。また、Arc で利用するエンドポイントは頻繁にアップデートされる傾向があるためその点も注意が必要です(現在はある程度枯れてきたのでそこまで頻繁な更新はないかもしれませんが)
本記事の内容が Arc の利用を検討している方に少しでもお役にたてれば幸いです
Appendix
公式Docs
サポートブログ
Arc Blog
Zennの記事
GitHub
Discussion