🏢

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 ゾーン

もう少しだけ丁寧に説明している記事は こちら にあります(興味があれば)

作業の流れ

  1. オンプレ DNS Server の作成
  2. オンプレ VM の作成
  3. 事前準備
  4. Azure Arc プライベートリンクスコープ(AAPLS) の作成
  5. Private DNS Resolver の作成
  6. DNS フォワーダー設定(DNSサーバー)
  7. Arc へのオンボード準備
  8. Arc へのオンボード
  9. 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) を参照してください

[該当箇所]

    1. DNS フォワーダー設定 (AD Server)

指定する DNS ドメインは以下の3つとなります

  • his.arc.azure.com
  • guestconfiguration.azure.com
  • dp.kubernetesconfiguration.azure.com

6-2. 動作確認

Arc登録対象サーバー(Onpre VM#1)よりプライベートエンドポイントのアドレスを正しく解決できることを確認する

プライベートエンドポイントのIPアドレスを取得できることの確認

cmd
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
powershell
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 の構成 を実施してください

補足事項は以下の通りとなります

  • 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
https://learn.microsoft.com/en-us/azure/azure-arc/network-requirements-consolidated?tabs=azure-cloud

https://learn.microsoft.com/ja-jp/azure/azure-arc/servers/private-link-security#create-a-private-link-scope

https://learn.microsoft.com/ja-jp/azure/azure-arc/servers/deployment-options

https://support.microsoft.com/ja-jp/topic/kb5031043-延長サポートが-2023-年-10-月-10-日に終了した後もセキュリティ更新プログラムを受け取り続ける手順-c1a20132-e34c-402d-96ca-1e785ed51d45

https://learn.microsoft.com/ja-jp/azure/azure-arc/servers/billing-extended-security-updates

https://learn.microsoft.com/ja-jp/azure/azure-arc/servers/deliver-extended-security-updates

https://learn.microsoft.com/ja-jp/sql/sql-server/end-of-support/sql-server-extended-security-updates?view=sql-server-ver16#register-instances-on-azure-portal

https://learn.microsoft.com/ja-jp/sql/sql-server/end-of-support/sql-server-extended-security-updates?view=sql-server-ver16&tabs=portal#link-esu-invoice

https://learn.microsoft.com/ja-jp/sql/sql-server/azure-arc/manage-configuration?view=sql-server-ver16&tabs=azure#modify-sql-server-configuration

サポートブログ
https://jpazmon-integ.github.io/blog/Arc/Arc_AAMPLS_DNS/

https://jpazmon-integ.github.io/blog/Arc/Arc_onboard_FAQ/

Arc Blog
https://techcommunity.microsoft.com/blog/azurearcblog/generally-available-transition-to-ws2012--r2-esus-enabled-by-azure-arc-from-volu/4199566

Zennの記事
https://zenn.dev/microsoft/articles/zenn-arc-enabledservers-instruction

GitHub
https://github.com/takutsu001/arc-private-base-env

Microsoft (有志)

Discussion