Azure Arc Gateway を利用して Azure Arc-enabled servers の通信要件を減らす

azure arc
Published: 2024-07-18

はじめに

Azure Arc Gateway という機能がドキュメントに追加されていました。Limited Preview なので Forms から申請が必要です

Simplify network configuration requirements through Azure Arc gateway (Limited preview)

Azure Arc Gateway は Azure Arc を利用する際に必要となる多数の通信要件を削減できる仕組みです。試した結果をまとめました。

嬉しいポイント

Azure Arc-enabled servers を利用する際の1つの課題が通信要件です。Azure Arc-enabled servers の場合、利用する機能にもよりますが最大で18個の FQDN を Proxy やファイアウォールで許可する必要があります。

さらに18個の FQDN の中にはワイルドカードなものが含まれています。特に次の2つは、第三者のリソースを含むワイルドカードな FQDN のため、組織のルールとして許可するのが難しい場合があります。

  • *.blob.core.windows.net
  • *.servicebus.windows.net

なお「*.blob.core.windows.net」は、Azure Arc の Private Link Scope を利用すれば通信要件自体が不要になります。とはいえ、Private Link Scope 特有の DNS 設計を考慮しなければなりませんので、気軽ではありません。

「*.servicebus.windows.net」にも、回避策としてワイルドカードではない FQDN を確認できる API が存在しています。この API を利用して Proxy やファイアウォールの設定を定期的に更新する仕組みを自作すれば、ワイルドカードな FQDN を許可する必要はなくなります。ですが、仕組みを自作するのは気軽ではありませんし、API が提供する FQDN の更新タイミングが不明なので、一時的に古い FQDN が許可されている時間帯が発生してしまいます。

そんな課題のある Azure Arc-enabled servers の通信要件ですが、Azure Arc Gateway を利用すると、許可すべき FQDN が次の8つになります。

  • aka.ms
  • [YOUR-ARC-GW-ID].gw.arc.azure.com
  • management.azure.com
  • login.microsoftonline.com
  • packages.microsoft.com
  • download.microsoft.com
  • gbl.his.arc.azure.com
  • [region].his.arc.azure.com

許可すべき FQDN の数がぐっと減りますし、なによりも課題となっていたワイルドカード FQDN が無くなるのが大きいです。

構成のイメージ

Azure Arc Gateway を利用すると、サーバ内で、従来の Azure Connected Machine Agent だけでなく Azure Arc Proxy というコンポーネントが動作します。この Azure Arc Proxy は Azure Connected Machine Agent に対するプロキシとして動作します。

Azure Arc Gateway のイメージ

Azure Connected Machine Agent からの通信を受け取った Azure Arc Proxy は、Azure Arc Gateway が対応している FQDN への通信を Azure Arc Gateway 宛てに送信します。通信経路上のプロキシやファイアウォールからすると、対象のサーバは Azure Arc Gateway と通信しているように見えます。その結果として、ファイアウォールやプロキシで許可すべき通信要件が減るというわけです。

設定方法

ドキュメントに記載されている通りです。

How to use the Arc gateway (Limited preview)

最新版の Azure CLI connectedmachine 拡張機能 0.7.0 をインストールします。私の環境は 0.5.1 がインストール済みだったので、アップグレードしました。

az extension add --allow-preview true --source '.\Downloads\connectedmachine-0.7.0-py3-none-any.whl' --upgrade

そして、自分の環境に Azure Arc Gateway を作成します。

az connectedmachine gateway create --name ymarcgw --resource-group rg-arc-je --location japaneast --gateway-type public --allowed-features * --subscription <Your-SUB-ID>
This command is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
{
  "allowedFeatures": [
    "*"
  ],
  "gatewayEndpoint": "xxxxxxxx-xxxx-xxxx-xxxx-f1947c659e82.gw.arc.azure.com",
  "gatewayId": "xxxxxxxx-xxxx-xxxx-xxxx-79b947cb5ed1",
  "gatewayType": "Public",
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-9043d33c8175/resourceGroups/rg-arc-je/providers/Microsoft.HybridCompute/gateways/ymarcgw",
  "location": "japaneast",
  "name": "ymarcgw",
  "provisioningState": "Succeeded",
  "resourceGroup": "rg-arc-je",
  "type": "Microsoft.HybridCompute/gateways"
}

Azure Arc Gateway を利用するオンボード用スクリプトは Azure Portal では提供されていないため、自作します。今回利用するサーバは上位のルータでインターネット宛ての通信を全拒否されているため、インターネット宛ての通信をプロキシサーバ経由することが必須です。そのため、WinHTTP とインターネットオプションでプロキシを指定した上で、次のスクリプトを流します。azcmagent connect に –gateway-id で Azure Arc Gateway の ID を指定する点がポイントです。

$env:SUBSCRIPTION_ID = "xxxxxxxx-xxxx-xxxx-xxxx-9043d33c8175";
$env:RESOURCE_GROUP = "rg-arc-je";
$env:TENANT_ID = "xxxxxxxx-xxxx-xxxx-xxxx-51c75985461b";
$env:LOCATION = "japaneast";
$env:CLOUD = "AzureCloud";
$env:GW_ID = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-9043d33c8175/resourceGroups/rg-arc-je/providers/Microsoft.HybridCompute/gateways/ymarcgw";

[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" ;

# プロキシ経由で Azure Connected Machine Agent をインストール
$proxy = "http://192.168.111.120:8080"
& "$env:TEMP\install_windows_azcmagent.ps1" -Proxy $proxy

# Azure Connected Machine Agent にプロキシを設定
& "$env:ProgramW6432\AzureConnectedMachineAgent\azcmagent.exe" config set proxy.url $proxy

# Azure Arc Gateway を利用して Azure 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" --gateway-id  "$env:GW_ID" --use-device-code

動作確認

通常では direct となっている connection.type という設定が gateway になります。

> azcmagent.exe config list
Local Configuration Settings
  incomingconnections.enabled (preview)                 : true
  incomingconnections.ports (preview)                   : [6516,17426]
  connection.type (preview)                             : gateway
  proxy.url                                             : http://192.168.111.120:8080
  proxy.bypass                                          : []
  extensions.allowlist                                  : []
  extensions.blocklist                                  : []
  guestconfiguration.enabled                            : true
  extensions.enabled                                    : true
  config.mode                                           : full
  guestconfiguration.agent.cpulimit                     : 5
  extensions.agent.cpulimit                             : 5

また、通常では自分のプロキシサーバが表示されている Using HTTPS Proxy の欄に localhost 上でリッスンしているサービスが表示されます。自分のプロキシサーバは Upstream Proxy に表示されます。

> azcmagent.exe show
中略
Agent Status                            : Connected
Agent Last Heartbeat                    : 2024-07-17T18:34:55-07:00
Agent Error Code                        :
Agent Error Details                     :
Agent Error Timestamp                   :
Using HTTPS Proxy                       : http://localhost:40343
Proxy Bypass List                       :
Upstream Proxy                          : http://192.168.111.120:8080
Upstream Proxy Bypass List              :

localhost でリッスンしているサービスが Azure Arc Gateway と通信するコンポーネントである Azure Arc Proxy です。

> Get-NetTCPConnection | Where-Object {$_.LocalPort -eq "40343" -and $_.State -eq "Established"} | Select-Object LocalAddress,LocalPort,OwningProcess

LocalAddress LocalPort OwningProcess
------------ --------- -------------
127.0.0.1        40343          2300
127.0.0.1        40343          2300
127.0.0.1        40343          2300

> Get-Process -Id 2300 | Select-Object Id,Name,Path

  Id Name     Path
  -- ----     ----
2300 arcproxy C:\Program Files\AzureConnectedMachineAgent\arcproxy.exe

私の環境はプロキシサーバ経由で Azure Arc Gateway と通信しているので、プロキシサーバ上に Azure Arc Gateway の FQDN への通信ログが大量に記録されます。

2024/07/18 04:52:41 1721278361.538   2187 192.168.111.127 TCP_TUNNEL/200 20436 CONNECT xxxxxxxx-xxxx-xxxx-xxxx-f1947c659e82.gw.arc.azure.com:443 - HIER_DIRECT/40.90.64.10 -
2024/07/18 04:52:41 1721278361.950   1868 192.168.111.127 TCP_TUNNEL/200 13752 CONNECT xxxxxxxx-xxxx-xxxx-xxxx-f1947c659e82.gw.arc.azure.com:443 - HIER_DIRECT/40.90.64.10 -
2024/07/18 04:52:42 1721278362.012   1929 192.168.111.127 TCP_TUNNEL/200 13752 CONNECT xxxxxxxx-xxxx-xxxx-xxxx-f1947c659e82.gw.arc.azure.com:443 - HIER_DIRECT/40.90.64.10 -
2024/07/18 04:52:42 1721278362.932   1854 192.168.111.127 TCP_TUNNEL/200 13731 CONNECT xxxxxxxx-xxxx-xxxx-xxxx-f1947c659e82.gw.arc.azure.com:443 - HIER_DIRECT/40.90.64.10 -
2024/07/18 04:52:45 1721278365.810   2247 192.168.111.127 TCP_TUNNEL/200 20436 CONNECT xxxxxxxx-xxxx-xxxx-xxxx-f1947c659e82.gw.arc.azure.com:443 - HIER_DIRECT/40.90.64.10 -
2024/07/18 04:52:58 1721278378.800   1713 192.168.111.127 TCP_TUNNEL/200 13708 CONNECT xxxxxxxx-xxxx-xxxx-xxxx-f1947c659e82.gw.arc.azure.com:443 - HIER_DIRECT/40.90.64.10 -

Azure Arc Proxy が通信を Azure Arc Gateway に送ったかどうかは「C:\ProgramData\AzureConnectedMachineAgent\Log\arcproxy.log」に記録されます。

プロキシやファイアウォールで通信を許可しなければならない FQDN は、次のログの通り done via proxy として記録されました。via proxy となったのは、私の環境では Azure Connected Machine Agent の Upstream Proxy にプロキシが設定されているからでしょう。

time=2024-07-17T04:14:46.339-07:00 level=INFO msg="P:1:C:1 127.0.0.1:49797 --> gbl.his.arc.azure.com:443 on HTTP-1.1"
time=2024-07-17T04:14:46.420-07:00 level=INFO msg="P:1:C:2 127.0.0.1:49802 --> management.azure.com:443 on HTTP-1.1"
time=2024-07-17T04:14:46.420-07:00 level=INFO msg="P:1:C:1 done via proxy bytes ->:542, <-:5805"
time=2024-07-17T04:14:46.420-07:00 level=INFO msg="P:1:C:3 127.0.0.1:49803 --> gbl.his.arc.azure.com:443 on HTTP-1.1"
time=2024-07-17T04:14:46.420-07:00 level=INFO msg="P:1:C:4 127.0.0.1:49804 --> login.microsoftonline.com:443 on HTTP-1.1"
time=2024-07-17T04:14:46.465-07:00 level=INFO msg="P:1:C:3 done via proxy bytes ->:533, <-:5745"
time=2024-07-17T04:14:46.533-07:00 level=INFO msg="P:1:C:2 done via proxy bytes ->:854, <-:6992"
time=2024-07-17T04:14:46.790-07:00 level=INFO msg="P:1:C:4 done via proxy bytes ->:833, <-:5717"

一方で、プロキシやファイアウォールでの通信許可が不要になった FQDN、つまり Azure Arc Gateway 経由になった FQDN は、次のログの通り done via gatewayh1 として記録されました。

time=2024-07-17T04:28:34.776-07:00 level=INFO msg="P:2:C:14 127.0.0.1:50089 --> je.his.arc.azure.com:443 on HTTP-1.1"
time=2024-07-17T04:28:36.280-07:00 level=INFO msg="P:2:C:14 done via gatewayh1 bytes ->:2290, <-:5576"
time=2024-07-17T04:30:23.851-07:00 level=INFO msg="P:2:C:15 127.0.0.1:50107 --> agentserviceapi.guestconfiguration.azure.com:443 on HTTP-1.1"
time=2024-07-17T04:30:33.374-07:00 level=INFO msg="P:2:C:15 done via gatewayh1 bytes ->:2948, <-:13132"
time=2024-07-17T04:30:48.799-07:00 level=INFO msg="P:2:C:16 127.0.0.1:50120 --> japaneast-gas.guestconfiguration.azure.com:443 on HTTP-1.1"
time=2024-07-17T04:30:52.930-07:00 level=INFO msg="P:2:C:16 done via gatewayh1 bytes ->:2803, <-:18734"
time=2024-07-17T04:30:59.462-07:00 level=INFO msg="P:2:C:17 127.0.0.1:50125 --> oaasguestconfigwcuss1.blob.core.windows.net:443 on HTTP-1.1"
time=2024-07-17T04:31:01.858-07:00 level=INFO msg="P:2:C:17 done via gatewayh1 bytes ->:597, <-:35608"
time=2024-07-17T04:31:06.015-07:00 level=INFO msg="P:2:C:18 127.0.0.1:50128 --> oaasguestconfigwcuss1.blob.core.windows.net:443 on HTTP-1.1"
time=2024-07-17T04:31:08.990-07:00 level=INFO msg="P:2:C:18 done via gatewayh1 bytes ->:613, <-:109473"

Azure Arc Gateway を利用してオンボードしたサーバでも、通常のオンボード方式と同じように、ドキュメントに記載されている次の拡張機能をインストールできました。ただし、私が試した1台では普段と比べるとすごい時間がかかった気がします…

  • Azure Monitor (Azure Monitor エージェント + 依存関係エージェント)1
  • Windows Admin Center
  • SSH
  • SQL Server 用 Azure 拡張機能

拡張機能の画面

当然ですが、これらの拡張機能の通信要件に含まれる FQDN への通信は Azure Arc Gateway 経由になっていました。

# Windows Admin Center と SSH
time=2024-07-17T06:01:48.902-07:00 level=INFO msg="P:2:C:438 127.0.0.1:52527 --> g2-prod-os-vr0001-sb.servicebus.windows.net:443 on HTTP-1.1"
time=2024-07-17T06:01:50.435-07:00 level=INFO msg="P:2:C:438 done via gatewayh1 bytes ->:1379, <-:6295"

# SQL Server 用 Azure 拡張機能
time=2024-07-17T08:33:12.977-07:00 level=INFO msg="P:1:C:1108 127.0.0.1:55312 --> telemetry.japaneast.arcdataservices.com:443 on HTTP-1.1"
time=2024-07-17T08:33:17.476-07:00 level=INFO msg="P:1:C:1108 done via gatewayh1 bytes ->:3839, <-:5668"
time=2024-07-17T08:34:40.077-07:00 level=INFO msg="P:1:C:1137 127.0.0.1:55461 --> dataprocessingservice.japaneast.arcdataservices.com:443 on HTTP-1.1"
time=2024-07-17T08:35:49.348-07:00 level=INFO msg="P:1:C:1137 done via gatewayh1 bytes ->:4707, <-:4628"

# Azure Monitor (Azure Monitor エージェント + 依存関係エージェント)1
time=2024-07-17T08:36:21.860-07:00 level=INFO msg="P:1:C:1159 127.0.0.1:55592 --> global.handler.control.monitor.azure.com:443 on HTTP-1.1"
time=2024-07-17T08:36:23.038-07:00 level=INFO msg="P:1:C:1159 done via gatewayh1 bytes ->:2526, <-:7339"
time=2024-07-17T08:36:39.061-07:00 level=INFO msg="P:1:C:1160 127.0.0.1:55595 --> bd6681ca-a981-464a-91e8-3f28d39f91fa.ods.opinsights.azure.com:443 on HTTP-1.1"
time=2024-07-17T08:36:40.848-07:00 level=INFO msg="P:1:C:1160 done via gatewayh1 bytes ->:14912, <-:6329"

各種拡張機能もちゃんと動いてそうです。

Defender for Cloud のゲスト構成

SQL Server 用 Azure 拡張機能

VM Insightその1(Azure Monitor Agent と Dependency Agent)

VM Insightその2(Azure Monitor Agent と Dependency Agent)

通信経路

Azure Arc Gateway への通信はインターネット経由となります。Azure Arc Gateway の FQDN を名前解決した結果のグローバル IP アドレスは AzureFrontDoor.Frontend サービスタグに含まれており、ExpressRoute Microsoft Peering の BGP コミュニティには含まれていません。そのため、ExpressRoute Microsoft Peering 経由にはなりません。また、現時点で Azure Arc Gateway を VNET 内に配置したり、Private Endpoint 経由で Azure Arc Gateway にアクセスする機能もありませんので、ExpressRoute Private Peering 経由にもできません。

まとめ

Limited Preview になった Azure Arc Gateway を試しました。必要な FQDN が減るのはもちろんありがたいですが、Azure Arc を利用する際の困りごとの1つであったワイルドカードな FQDN が不要になるのがとてもありがたいです。GA に期待です。

Note

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