プロキシと Private Endpoint を併用するサーバを Azure Arc-enabled servers に登録する

azure
Published: 2023-03-10

はじめに

Azure Portal を利用すると、サーバを Azure Arc-enabled servers に登録する際に使うスクリプトを生成してくれます。このスクリプトの自動生成機能は次の3つの環境をサポートしています。

  • Connected Machine Agent は、インターネット上のエンドポイントに直接アクセスする
  • Connected Machine Agent は、プロキシサーバ経由でインターネット上のエンドポイントにアクセスする
  • Connected Machine Agent は、プライベートエンドポイント経由でエンドポイントにアクセスする

ですが、2023年3月現在 Azure Arc-enabled servers で必要となる全ての URL はプライベートエンドポイントをサポートしていないので、実際にサーバが置かれている環境は次の2つの要件を同時に満たす必要があるはずです。

  • Connected Machine Agent は、プライベートエンドポイントをサポートするエンドポイントには、プライベートエンドポイント経由でアクセスする
  • Connected Machine Agent は、プライベートエンドポイント経由でアクセスできないエンドポイントには、プロキシを利用してインターネット経由でアクセスする

この環境をサポートするスクリプトは Azure Portal から提供されないため、利用者自身でスクリプトを自作する必要があります。今まではスクリプトを作るのが面倒で手作業でオンボードしていたのですが、今後の自分のためにも、提供されるスクリプトをつまみ食いする形で簡単なスクリプトを作ってみました。

サンプルスクリプト

$downloadUri = "https://aka.ms/AzureConnectedMachineAgent"
$proxy = "http://192.168.111.120:8080"

$env:SUBSCRIPTION_ID = "<SUB-ID>";
$env:RESOURCE_GROUP = "arc-server-je";
$env:TENANT_ID = "<TENANT-ID>";
$env:LOCATION = "japaneast";
$env:AUTH_TYPE = "token";
$env:CORRELATION_ID = (New-Guid).Guid;
$env:CLOUD = "AzureCloud";
$env:PLS_ID = "/subscriptions/<SUB-ID>/resourceGroups/labnet/providers/Microsoft.HybridCompute/privateLinkScopes/lab-je-plsForArc"

Invoke-WebRequest -UseBasicParsing -Proxy $proxy -Uri $downloadUri -OutFile c:\AzureConnectedMachineAgent.msi
Start-Process -FilePath msiexec.exe -ArgumentList @("/i", "c:\AzureConnectedMachineAgent.msi" , "/l*v", "c:\installationlog.txt", "/qn") -Wait -Passthru

& "$env:ProgramW6432\AzureConnectedMachineAgent\azcmagent" config set proxy.url ${Proxy}

& "$env:ProgramW6432\AzureConnectedMachineAgent\azcmagent" config set proxy.bypass "ARM,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 "$env:PLS_ID" --correlation-id "$env:CORRELATION_ID";

スクリプトの説明

インストーラのダウンロードとインストール

エージェントのインストーラをプロキシ経由でダウンロードしてから実行します。

$downloadUri = "https://aka.ms/AzureConnectedMachineAgent"
$proxy = "http://192.168.111.120:8080"

Invoke-WebRequest -UseBasicParsing -Proxy $proxy -Uri $downloadUri -OutFile c:\AzureConnectedMachineAgent.msi
Start-Process -FilePath msiexec.exe -ArgumentList @("/i", "c:\AzureConnectedMachineAgent.msi" , "/l*v", "c:\installationlog.txt", "/qn") -Wait -Passthru

Connected Machine Agent へのプロキシ設定

Connected Machine Agent ではエージェント固有のプロキシを設定することが推奨されています。ですので、オンボードを実施する前に Connected Machine Agent にプロキシを設定します。

& "$env:ProgramW6432\AzureConnectedMachineAgent\azcmagent" config set proxy.url ${Proxy}

プロキシのバイパス設定

Connected Machine Agent にプロキシを設定すると、プライベートエンドポイント宛ての通信もプロキシを経由してしまいます。Connected Machine Agent からプライベートエンドポイントへの通信をプロキシ経由にしたくない場合には、Connected Machine Agent にバイパスの設定が必要です。

私の環境では Arc のプライベートエンドポイント(Microsoft.HybridCompute/privateLinkScopes)と ARM のプライベートエンドポイント(Microsoft.Authorization/resourceManagementPrivateLinks)が存在しているので、“ARM,Arc” をオプションとして設定します。環境に存在するプライベートエンドポイントに合わせてオプションを変更してください。

& "$env:ProgramW6432\AzureConnectedMachineAgent\azcmagent" config set proxy.bypass "ARM,Arc"

サーバのオンボード

インストールした Connected Machine Agent に対して「プロキシ設定」と「プロキシのバイパス設定」が済んだので、最後にサーバを Azure Arc-enabled servers にオンボードします。プライベートエンドポイント経由でオンボードする場合には --private-link-scope のオプションでAzure Arc の Private Link Scope の ID を指定する必要があります。

$env:SUBSCRIPTION_ID = "<SUB-ID>";
$env:RESOURCE_GROUP = "arc-server-je";
$env:TENANT_ID = "<TENANT-ID>";
$env:LOCATION = "japaneast";
$env:AUTH_TYPE = "token";
$env:CORRELATION_ID = (New-Guid).Guid;
$env:CLOUD = "AzureCloud";
$env:PLS_ID = "/subscriptions/<SUB-ID>/resourceGroups/labnet/providers/Microsoft.HybridCompute/privateLinkScopes/lab-je-plsForArc"

& "$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 "$env:PLS_ID" --correlation-id "$env:CORRELATION_ID";