プロキシとプライベートエンドポイントを併用するサーバを Azure Arc に登録する

azure
Published: 2024-02-08

少し長めのはじめに

Azure Arc-enabled servers で利用する Azure Connected Machine Agent には、「通信をプロキシを経由にする設定(proxy.url)」と「プライベートエンドポイントをサポートする宛先への通信(=プライベート IP アドレスな FQDN)をプロキシ経由から除外する設定(proxy.bypass)が存在します。

PS C:\Users\Administrator> & 'C:\Program Files\AzureConnectedMachineAgent\azcmagent.exe' config list 
Local Configuration Settings
  incomingconnections.enabled (preview)                 : true
  incomingconnections.ports (preview)                   : []
  proxy.url                                             : http://192.168.111.120:8080
  extensions.allowlist                                  : []
  extensions.blocklist                                  : []
  proxy.bypass                                          : [Arc]
  guestconfiguration.enabled                            : true
  extensions.enabled                                    : true
  config.mode                                           : full

この2つを組み合わせることで、「グローバル IP アドレスな FQDN にはプロキシ経由でアクセス」「プライベート IP アドレスな FQDN にはプロキシを経由せずに直接アクセス」という合わせ技な構成をとれます。

一方で、Azure Portal から生成できる「サーバを Arc にオンボードするためのスクリプト」がこの合わせ技に対応していません。Azure ポータルから生成されるスクリプトの種類とアクセス先、アクセス方法は次の通りです。

  • パブリックなエンドポイント
    • アクセス先:グローバル IP アドレスな FQDN
    • アクセス方法:直接
  • プロキシサーバ
    • アクセス先:グローバル IP アドレスな FQDN
    • アクセス方法:プロキシ経由
  • プライベートエンドポイント
    • アクセス先:グローバル IP アドレスな FQDN とプライベート IP アドレスな FQDN
    • アクセス方法:直接

実現したい通信方法は次の通りなので、「これだ!」というオンボード用のスクリプトがありません。

  • 実現したい方式
    • アクセス先1:グローバル IP アドレスな FQDN
    • アクセス方法1:プロキシ経由
    • アクセス先2:プライベート IP アドレスな FQDN
    • アクセス方法2:直接

そこで、オンボード用のスクリプトへの理解を深めるためにも、「ないなら作ってしまおう」というのが本エントリの趣旨です。

オンボード用のスクリプトが実施していること

Windows 版のスクリプトは主に次の作業を実施しています。

  • サーバをオンボードする Azure の情報を環境変数に設定
  • TLS 1.2 を指定
  • エージェントをインストールするためのスクリプトをダウンロード
  • スクリプトを利用して Azure Connected Machine Agent をインストール
  • インストールされたエージェントを利用して、サーバを Arc にオンボード

これを一つずつ確認して、今回の合わせ技で動くようにしていきます。

インストール用スクリプトのダウンロード

オンボード用のスクリプトでは、次の部分でエージェントをインストールするためのスクリプトをダウンロードしています。

Invoke-WebRequest -UseBasicParsing -Uri "https://aka.ms/azcmagent-windows" -TimeoutSec 30 -OutFile "$env:TEMP\install_windows_azcmagent.ps1";

このままだと https://aka.ms/azcmagent-windows へのアクセスがプロキシを経由しません。そこで https://aka.ms/azcmagent-windows へのアクセスがプロキシ経由になるように、-Proxy オプションでプロキシを指定します。

$proxy = "http://192.168.111.120:8080"
Invoke-WebRequest -UseBasicParsing -Uri "https://aka.ms/azcmagent-windows" -TimeoutSec 30 -OutFile "$env:TEMP\install_windows_azcmagent.ps1" - Proxy $proxy;

しかし、インストール用スクリプトはダウンロードできません。https://aka.ms/azcmagent-windows のリダイレクト先である https://gbl.his.arc.azure.com/installationScripts?api-version=1.0-preview&platform=windows にもプロキシ経由でアクセスしてしまうためです。https://gbl.his.arc.azure.com はプライベートエンドポイントをサポートしているため、プライベート IP アドレスな FQDN になります。今回の要件ではプロキシを経由すべきではありません。

そこで、リダイレクト先の https://gbl.his.arc.azure.com に直接アクセスする形にスクリプトを変更します。プライベートエンドポイントに対して直接通信したいので、-Proxy は不要です。

Invoke-WebRequest -UseBasicParsing -Uri "https://gbl.his.arc.azure.com/installationScripts?api-version=1.0-preview&platform=windows" -TimeoutSec 30 -OutFile "$env:TEMP\install_windows_azcmagent.ps1" ;

インストーラ用スクリプトを利用して Azure Connected Machine Agent をインストール

スクリプトは、ダウンロードしたスクリプトを実行して、前提条件のチェックと Azure Connected Machine Agent のインストールを行います。

& "$env:TEMP\install_windows_azcmagent.ps1";

このスクリプトの中では、https://aka.ms/AzureConnectedMachineAgent にアクセスしてエージェントのインストーラをダウンロードします。リダイレクト先は https://download.microsoft.com なので、パブリックなエンドポイントになります。この FQDN にはプロキシサーバ経由でアクセスするべきです。

そんな我々のために、インストール用スクリプトには、スクリプト内で実行される通信に対してプロキシサーバを利用するオプション(-Proxy)が用意されています。

[CmdletBinding()]
param (
    [string]$OutFile,
    [string]$AltDownload,
    [string]$Proxy,
    [string]$AltHisEndpoint    
)

このオプションを利用する形にスクリプトを修正します。

$proxy = "http://192.168.111.120:8080"
& "$env:TEMP\install_windows_azcmagent.ps1" -Proxy $proxy;

インストールされたエージェントを利用して、サーバを Arc にオンボード

Azure Connected Machine Agent のインストールが完了したら、azcmagent コマンドが利用できるようになります。このコマンドを利用して、Arc にオンボードする前に、エージェントに設定を追加します。必要な設定はプロキシ経由にする設定とプライベートエンドポイントをサポートする宛先をプロキシから除外する設定の2つです。

& "$env:ProgramW6432\AzureConnectedMachineAgent\azcmagent.exe" config set proxy.url $proxy
& "$env:ProgramW6432\AzureConnectedMachineAgent\azcmagent.exe" config set proxy.bypass Arc

これらのコマンドによってエージェントの準備が整ったので、azcmagent コマンドを利用してサーバを Arc にオンボードします。プライベートエンドポイントを利用するオプション(–private-link-scope)を忘れずに

& "$env:ProgramW6432\AzureConnectedMachineAgent\azcmagent.exe" connect --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/xxxxxxxx-xxxx-xxxx-xxxx-e4720761aa65/resourceGroups/labnet/providers/Microsoft.HybridCompute/privateLinkScopes/lab-je-plsForArc" --correlation-id "$env:CORRELATION_ID";

最終的なスクリプトは以下のようになります。

$env:SUBSCRIPTION_ID = "xxxxxxxx-xxxx-xxxx-xxxx-e4720761aa65";
$env:RESOURCE_GROUP = "0115";
$env:TENANT_ID = "xxxxxxxx-xxxx-xxxx-xxxx-e4720761aa65";
$env:LOCATION = "japaneast";
$env:AUTH_TYPE = "token";
$env:CLOUD = "AzureCloud";

[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor 3072;

Invoke-WebRequest -UseBasicParsing -Uri "https://gbl.his.arc.azure.com/installationScripts?api-version=1.0-preview&platform=windows" -TimeoutSec 30 -OutFile "$env:TEMP\install_windows_azcmagent.ps1" ;

$proxy = "http://192.168.111.120:8080"
& "$env:TEMP\install_windows_azcmagent.ps1" -Proxy $proxy

& "$env:ProgramW6432\AzureConnectedMachineAgent\azcmagent.exe" config set proxy.url $proxy
& "$env:ProgramW6432\AzureConnectedMachineAgent\azcmagent.exe" config set proxy.bypass Arc

& "$env:ProgramW6432\AzureConnectedMachineAgent\azcmagent.exe" connect --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/xxxxxxxx-xxxx-xxxx-xxxx-e4720761aa65/resourceGroups/labnet/providers/Microsoft.HybridCompute/privateLinkScopes/lab-je-plsForArc";

おわりに

今回のエントリでは「原則プロキシ経由で Arc の FQDN にアクセスするが、プライベートエンドポイントをサポートする FQDN にはプロキシを利用せず直接アクセスする」という環境下で利用できるオンボードスクリプトを作ってみました。スクリプトを少し修正するだけで、個別の要件の環境に対応できるものができました。満足です。

Note

  • 当サイトは個人のブログです。このブログに示されている見解や意見は個人的なものであり、所属組織の見解や意見を表明するものではありません。
  • 公開情報を踏まえて正確な情報を掲載するよう努めますが、その内容の完全性や正確性、有用性、安全性、最新性について一切保証しません。
  • 添付文章やリンク先などを含む本サイトの内容は作成時点でのものであり、予告なく変更される場合があります。