Azure CLI を利用して VMware ESXi 上に Azure Arc Resource Bridge を作成する

azure arc
Published: 2022-07-12

はじめに

VMware vSphere を Azure Arc の管理下に置くためには、Azure Arc Resource Bridge という仕組みを利用して VMware vSphere を Azure Arc に接続する必要があります。docs.microsoft.com に記載されている Resource Bridge をデプロイする手順は、Azure Portal が生成するスクリプトを vCenter と通信できる端末上で実行する形です。詳細は以下の URL の通りです。

クイックスタート: ヘルパー スクリプトを使用して VMware vCenter Server を Azure Arc に接続する

このスクリプトは次の作業を実行します。

  • 作業環境の整備
  • Resource Bridge のデプロイ
  • Resource Bridge への VMware vSphere 用拡張機能のインストール
  • カスタムロケーションの作成
  • vCenter の接続

スクリプト実行中に求められる各種情報を入力していくことで Azure Arc への接続は完了します。ですが、裏で何が起きているのかが分かりにくいので、構成と作業への理解を深めるために、スクリプトを分解してあえて一つずつ手作業で実行してみました。

作業環境の整備

Resource Bridge をデプロイするためには、64bit 版の Azure CLI が必要なようです。手間を惜しんで MSI 版の Azure CLI(32bit版)で試したところ、次のエラーが出て Resource Bridge のインストールが途中で失敗しました。

cli.azure.cli.core.azclierror: {
"errorCode": "KvaError",
"errorResponse": "Error in reading OVA file: failed to parse ovf: strconv.ParseInt: parsing \"5194121216\": value out of range"
}
az_command_data_logger: {
"errorCode": "KvaError",
"errorResponse": "Error in reading OVA file: failed to parse ovf: strconv.ParseInt: parsing \"5194121216\": value out of range"
}

エラーを回避するために、スクリプトの記載されている通り、インターネット上から Python 3.8 のインストーラをダウンロードしてインストールします。

Invoke-WebRequest -Uri "https://www.python.org/ftp/python/3.8.8/python-3.8.8-amd64.exe" `
  -OutFile ".temp/python-3.8.8-amd64.exe"
$p = Start-Process .\.temp\python-3.8.8-amd64.exe -Wait -PassThru `
  -ArgumentList '/quiet InstallAllUsers=0 PrependPath=1 Include_test=0'

インストール後に、パスの260文字制限を解除します。

Start-Process powershell.exe -verb runas -ArgumentList "Set-ItemProperty `
  -Path HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem -Name LongPathsEnabled -Value 1" -Wait

インストールした Python を利用して Azure CLI をインストールします。

.temp\.env\Scripts\python.exe -m pip install --upgrade pip wheel setuptools >> $logFile
.temp\.env\Scripts\pip install azure-cli==2.36.0 >> $logFile

この手順を踏んでインストールされた Azure CLI は64bit版になります。

> az --version | Select-String "64 bit"

Please let us know how we are doing: https://aka.ms/azureclihats
and let us know if you\'re interested in trying out our newest features: https://aka.ms/CLIUXstudy

Python (Windows) 3.8.8 (tags/v3.8.8:024d805, Feb 19 2021, 13:18:16) [MSC v.1928 64 bit (AMD64)]

最後に venv を実行します。

.temp\.env\Scripts\Activate.ps1

Resource Bridge のデプロイ

作業環境が整ったので Resource Bridge をデプロイします。スクリプトでは az arcappliance run vmware というコマンドを実行することで、Resource Bridge のインストールに必要となる createconfig と prepare、deploy、create がまとめて実行されます。ですが、今回は構成と作業への理解を深めるために1つずつ実行して動きを確認します。

az arcappliance createconfig vmware

まずは Resource Bridge をインストールするための設定ファイルを az arcappliance createconfig vmware で作成します。スクリプトに入力すべき情報は、vCenter の資格情報と Resource Bridge を配置するクラスタの情報、Resource Bridge のネットワーク設定です。

なお、 Resource Bridge は、導入時だけでなく導入後も入力された資格情報を利用して vCenter を操作します。また、入力した vCenter のアカウント名は、Azure 上に登録される vCenter のプロパティに保存されます。これらの挙動が望ましくない場合は、必要に応じて Resource Bridge 専用のアカウントを用意するとよいでしょう。今回は初期の管理者アカウントを利用します。

>  az arcappliance createconfig vmware --resource-group arc-validate `
  --name vcsa-home --location eastus
Command group 'arcappliance createconfig' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
Please enter vCenter FQDN/Address: vcsa.int.aimless.jp
Please enter vCenter username: administrator@vsphere.local
Please enter vCenter password:
2022-07-08T17:38:27+09:00       INFO    Client Created with vcenter url: vcsa.int.aimless.jp
retrieving config
2022-07-08T17:38:27+09:00       INFO    vsphereProvider: createConfigHelper

Please select datacenter:
1) DC_aimless
Enter number: 1
You Selected: DC_aimless

Please select network:
1) VM Network
Enter number: 1
You Selected: VM Network
Do you want to configure Appliance for DHCP or Static IP deployment? Please select Y for DHCP and N for Static IP (y/n)?n
Please enter Static IP address prefix: 192.168.111.240/24 # この記載でデプロイできたが、本来は192.168.111.0/24 が正しい。
Please enter Static gateway: 192.168.111.254
Please enter DNS servers as a comma separated list: 192.168.111.248
The virtual machine hosting Appliance requires an IP range (minimum size of 2 addresses one for the VM, and the other IP is reserved for Appliance upgrade). Please specify the start range IP:192.168.111.238 # Resource Bridge が動作する CBL-Mariner 仮想マシン の NIC で利用
Please specify the end range IP:192.168.111.239 
Please enter VLAN ID (leave blank if not needed):

Please select resourcepool:
1) Cluster01/Resources (Complete path - /DC_aimless/host/Cluster01/Resources)
Enter number: 1
You Selected: Cluster01/Resources (Complete path - /DC_aimless/host/Cluster01/Resources)

Please select datastore:
1) datastore1
2) NVMeDisk
Enter number: 2
You Selected: NVMeDisk

Please select folder:
1) HCI (Complete path - /DC_aimless/vm/HCI)
2) vCLS (Complete path - /DC_aimless/vm/vCLS)
3) Discovered virtual machine (Complete path - /DC_aimless/vm/Discovered virtual machine)
Enter number: 1
You Selected: HCI (Complete path - /DC_aimless/vm/HCI)
Please enter name of the VM template that will be created on your infrastructure: arcresourcebridge

Please provide Appliance cluster configuration
Please enter Appliance control plane IP: 192.168.111.237 # CBL-Mariner 内部で動作する Kubernetes の API エンドポイントで利用
Do you want to configure Appliance proxy settings? (y/n) n

All configuration files created successfully
Appliance Configuration YAML was created here: C:\Users\<YOUR-NAME>\Downloads\vm-resource-bridge\vcsa-home-appliance.yaml
Resource Configuration YAML was created here: C:\Users\<YOUR-NAME>\Downloads\vm-resource-bridge\vcsa-home-resource.yaml
Infrastructure Configuration YAML was created here: C:\Users\<YOUR-NAME>\Downloads\vm-resource-bridge\vcsa-home-infra.yaml

コマンドが成功すると3つのファイルが生成されます。<NAME>-appliance.yaml がメインのファイルで、<NAME>-resource.yaml<NAME>-infra.yaml を参照する形になっています。後続のコマンドでは --config-file オプションで <NAME>-appliance.yaml を指定します。

applianceClusterConfig:
  controlPlaneEndpoint: 192.168.111.237
applianceResourceFilePath: vcsa-home-resource.yaml
infrastructureConfigPath: vcsa-home-infra.yaml
resource:
  location: eastus
  name: vcsa-home
  resource_group: arc-validate
  subscription: xxxxxxxx-xxxx-xxxx-xxxx-b91fff05677c
vsphereprovider:
  appliancevm:
    vmtemplate: resourceBridge
  datacenter: DC_aimless
  datastore: NVMeDisk
  disksizegib: 25
  folder: /DC_aimless/vm/HCI
  memorymib: 16384
  network:
    dnsservers:
    - 192.168.111.248
    gateway: 192.168.111.254
    ipaddressprefix: 192.168.111.240/24
    k8snodeippoolend: 192.168.111.239
    k8snodeippoolstart: 192.168.111.238
    segment: VM Network
  numcpus: 4
  resourcepool: /DC_aimless/host/Cluster01/Resources

az arcappliance prepare vmware

コンフィグファイルが用意できたら、az arcappliance prepare vmware を実行して ESXi 上に Resource Bridge 用仮想マシンを作る準備をします。このコマンドを実行すると、コマンドを実行している端末上に仮想マシンを作成するための OVA ファイルがダウンロードされます。そして、その OVF ファイルを利用して vSphere 上にテンプレートが作成されます。

> az arcappliance prepare vmware --config-file vcsa-home-appliance.yaml
Command group 'arcappliance prepare' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
Please enter vCenter FQDN/Address: vcsa.int.aimless.jp
Please enter vCenter username: administrator@vsphere.local
Please enter vCenter password:
Preparing the appliance configuration...

2022-07-07T20:16:41+09:00       INFO    Client Created with vcenter url: vcsa.int.aimless.jp
2022-07-07T20:16:41+09:00       INFO    vsphereProvider: Image Client: Checking if a template is provisioned...
2022-07-07T20:16:41+09:00       INFO    ProvisionImage: Discovering image download information...
2022-07-07T20:16:42+09:00       INFO    ProvisionImage: Downloading and validating image...
session state saved to "C:\\Users\\<YOUR-NAME>\\AppData\\Local\\Temp\\kva703162653\\dsdk-701121496\\Linux-K8s-1.21.9-v193256.ova.json"
2022-07-07T20:23:39+09:00       INFO    vsphereProvider: Image Client Provision: Deploying the template...
2022-07-07T20:24:50+09:00       INFO    ImageProvision: VSphere: Template Deployed. Creating snapshot and finishing aftersteps....
2022-07-07T20:24:50+09:00       INFO    ImageProvision: VSphere: Image Provision is successful
Appliance configuration was prepared successfully

Prepared appliance for deployment!

vSphere 上に作成されたテンプレート

az arcappliance deploy vmware

テンプレートが用意できたら、az arcappliance deploy vmware を実行して Resource Bridge を構築します。

> az arcappliance deploy vmware --config-file vcsa-home-appliance.yaml
Command group 'arcappliance deploy' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
Please enter vCenter FQDN/Address: vcsa.int.aimless.jp
Please enter vCenter username: administrator@vsphere.local
Please enter vCenter password:
Creating the appliance...

2022-07-07T21:02:47+09:00       INFO    Client Created with vcenter url: vcsa.int.aimless.jp
2022-07-07T21:02:47+09:00       INFO    vsphereProvider: Ensuring pre-requisites on vcenter for the appliance deployment
2022-07-07T21:02:47+09:00       INFO    REST Client Created with vcenter url: vcsa.int.aimless.jp
2022-07-07T21:02:47+09:00       INFO    virtual machine template for management appliance and it\'s snapshot already ready...
2022-07-07T21:02:50+09:00       INFO    vsphereProvider: CloudInit
2022-07-07T21:02:50+09:00       INFO    vsphereProvider: deployHelper
2022-07-07T21:02:50+09:00       INFO    vsphereProvider: deployHelper, Waiting for VM Clone...
2022-07-07T21:02:51+09:00       INFO    vsphereProvider: Turning on VM...
2022-07-07T21:02:51+09:00       INFO    vsphereProvider: Waiting for VM to get IP...
2022-07-07T21:03:15+09:00       INFO    Received IP address: 192.168.111.238
2022-07-07T21:03:15+09:00       INFO    core: Waiting for API server...
2022-07-07T21:04:05+09:00       INFO    core: Waiting for pod 'Cloud Operator' to be ready...
2022-07-07T21:23:46+09:00       INFO    core: Waiting for pod 'Cluster API core' to be ready...
{
"errorCode": "KvaTimeoutError",
"errorResponse": "{\n\"message\": \"Appliance Deploy timed out\"\n}"
}

仮想マシンは起動してきました。ですが、コマンドが期待する待ち時間にすべての作業が終わらなかったようで、コマンドがタイムアウトで失敗になってしまいました。

起動してきた Resource Bridge 用の仮想マシン

しばらく放置した後に Resource Bridge 用仮想マシン内の k8s 上の Pod を確認した結果、ほぼすべての Pod がすべて Running になっていたので先に進むことにしました。本番環境でコマンドが失敗した場合は、サポートに問い合わせましょう。

> kubectl get pod -A
NAMESPACE                           NAME                                                                                    READY   STATUS     RESTARTS   AGE
azure-arc                           alertmanager-azure-arc-monitoring-alertmanager-0                                        3/3     Running    0          93m
azure-arc                           appliance-connect-agent-6f88f9ccc4-xmk6t                                                2/2     Running    0          96m
azure-arc                           azure-arc-monitoring-kube-state-metrics-9c5568bd-gh4g4                                  1/1     Running    0          93m
azure-arc                           azure-arc-monitoring-operator-56db4569f-pnkt4                                           1/1     Running    0          93m
azure-arc                           azure-arc-monitoring-prometheus-node-exporter-vqscb                                     1/1     Running    0          93m
azure-arc                           clusterconnect-agent-5b5cf599db-6cwpp                                                   3/3     Running    3          96m
azure-arc                           clusteridentityoperator-5fcdc695d6-c8wcx                                                2/2     Running    0          96m
azure-arc                           config-agent-789885db48-mm78w                                                           1/2     Running    0          96m
azure-arc                           extension-manager-776947bbb8-g8jdv                                                      2/2     Running    0          96m
azure-arc                           guard-7594496c6b-c8lh2                                                                  0/2     Init:0/1   0          96m
azure-arc                           metrics-agent-58586fc7dc-5pdl5                                                          2/2     Running    0          96m
azure-arc                           prometheus-azure-arc-monitoring-prometheus-0                                            3/3     Running    0          93m
azure-arc                           resource-sync-agent-c56cb8c57-ssgsm                                                     2/2     Running    0          96m
capi-kubeadm-bootstrap-system       capi-kubeadm-bootstrap-controller-manager-59b45d75f7-pzktr                              2/2     Running    0          96m
capi-kubeadm-control-plane-system   capi-kubeadm-control-plane-controller-manager-5cbc779d84-6r7f6                          2/2     Running    0          96m
capi-system                         capi-controller-manager-6d8d9c98b7-t8dgl                                                2/2     Running    0          96m
capv-system                         capv-controller-manager-74f956c99-grw47                                                 3/3     Running    0          96m
capv-system                         capv-static-ip-controller-manager-8559c8997b-qjzhg                                      2/2     Running    0          101m
capv-system                         ipam-controller-manager-5957f5bb84-wdpcx                                                1/1     Running    0          101m
cert-manager                        cert-manager-7c74b5d568-wf7hc                                                           1/1     Running    0          102m
cert-manager                        cert-manager-cainjector-647bc55979-ggpfc                                                1/1     Running    0          102m
cert-manager                        cert-manager-webhook-6f69754dcd-8hdbs                                                   1/1     Running    0          102m
cloudop-system                      cloudop-controller-manager-574684d6d4-jrcsl                                             1/1     Running    0          101m
kube-system                         calico-kube-controllers-59fcc878bb-k9gkm                                                1/1     Running    0          96m
kube-system                         calico-node-zjklr                                                                       1/1     Running    0          10h
kube-system                         calico-patch-4h8pn                                                                      1/1     Running    0          96m
kube-system                         calicoctl                                                                               1/1     Running    0          101m
kube-system                         coredns-7489c675f5-6nbp6                                                                1/1     Running    0          101m
kube-system                         coredns-7489c675f5-b9hdg                                                                1/1     Running    0          101m
kube-system                         etcd-ce7e5a01624b63d2f2802c3ab875f19eb45f675c79e99-control-plane-0                      1/1     Running    0          101m
kube-system                         kube-apiserver-ce7e5a01624b63d2f2802c3ab875f19eb45f675c79e99-control-plane-0            1/1     Running    0          101m
kube-system                         kube-controller-manager-ce7e5a01624b63d2f2802c3ab875f19eb45f675c79e99-control-plane-0   1/1     Running    0          101m
kube-system                         kube-proxy-kwstx                                                                        1/1     Running    0          101m
kube-system                         kube-scheduler-ce7e5a01624b63d2f2802c3ab875f19eb45f675c79e99-control-plane-0            1/1     Running    0          101m
kube-system                         kube-vip-ce7e5a01624b63d2f2802c3ab875f19eb45f675c79e99-control-plane-0                  1/1     Running    0          101m
kube-system                         vsphere-cloud-controller-manager-svp55                                                  1/1     Running    0          97m

Resource Bridge 上の k8s にアクセスするためには、コマンドを実行した端末の c:\programData\kva 配下に保存されている kubeconfig を利用します。このフォルダには、kubeconfig だけでなく Resource Bridge 用仮想マシンに SSH 接続するためのキーペアも保存されています。これらのファイルはデプロイ後の運用でも利用しますので、安全な場所に保管しておきましょう。

PS C:\ProgramData> Get-ChildItem .\kva\ -Recurse

    Directory: C:\ProgramData\kva

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2022/07/07    19:09                .ssh
-a---          2022/07/07    21:03           7359 kubeconfig
-a---          2022/07/08    17:38        2012995 kva.log

    Directory: C:\ProgramData\kva\.ssh

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          2022/07/07    19:09           1675 logkey
-a---          2022/07/07    19:09            381 logkey.pub

az arcappliance create vmware

そして、作成された Resource Bridge を Azure に登録します。az arcappliance create vmware を実行することで、Azure ポータル上に Resource Bridge が出現します。

>az arcappliance create vmware --config-file vcsa-home-appliance.yaml `
  --kubeconfig C:\ProgramData\kva\kubeconfig
  
Command group 'arcappliance create' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
{
  "distro": "AKSEdge",
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/arc-validate/providers/microsoft.resourceconnector/appliances/vcsa-home",
  "identity": {
    "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "type": "SystemAssigned"
  },
  "infrastructureConfig": {
    "provider": "VMWare"
  },
  "location": "eastus",
  "name": "vcsa-home",
  "provisioningState": "Succeeded",
  "publicKey": "<DELETED>",
  "resourceGroup": "arc-validate",
  "status": "WaitingForHeartbeat",
  "systemData": "<DELETED>",
  "tags": null,
  "type": "Microsoft.ResourceConnector/appliances",
  "version": null
}

Azure ポータル上の Resource Bridge

コマンドを実行した直後は、statusWaitingForHeartbeat になっています。このステータスが Running になるまでしばし待ちます。

拡張機能のインストール

できあがった Resource Bridge に対して vSphere と連携するための拡張機能をインストールします。

> $applianceSubscriptionId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
> $applianceResourceGroupName = "arc-validate"
> $applianceName = "vcsa-home"
> $VMW_RP_OBJECT_ID = (az ad sp show --id 'ac9dc5fe-b644-4832-9d03-d9f1ab70c5f7' --query id -o tsv)
>
> az k8s-extension create --debug --subscription $applianceSubscriptionId `
    --resource-group $applianceResourceGroupName --name azure-vmwareoperator `
    --extension-type 'Microsoft.vmware' --scope cluster --cluster-type appliances `
    --cluster-name $applianceName `
    --config Microsoft.CustomLocation.ServiceAccount=azure-vmwareoperator `
    --config global.rpObjectId="$VMW_RP_OBJECT_ID"
    
{
  "aksAssignedIdentity": null,
  "autoUpgradeMinorVersion": true,
  "configurationProtectedSettings": {},
  "configurationSettings": {
    "Microsoft.CustomLocation.ServiceAccount": "azure-vmwareoperator",
    "global.rpObjectId": "46b1b4eb-ab16-4ce8-aa55-096807312417"
  },
  "customLocationSettings": null,
  "errorInfo": null,
  "extensionType": "microsoft.vmware",
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/arc-validate/providers/Microsoft.ResourceConnector/appliances/vcsa-home/providers/Microsoft.KubernetesConfiguration/extensions/azure-vmwareoperator",
  "identity": null,
  "name": "azure-vmwareoperator",
  "packageUri": null,
  "provisioningState": "Succeeded",
  "releaseTrain": "Stable",
  "resourceGroup": "arc-validate",
  "scope": {
    "cluster": {
      "releaseNamespace": "azure-vmwareoperator"
    },
    "namespace": null
  },
  "statuses": "<DELETED>",
  "systemData": "",
  "type": "Microsoft.KubernetesConfiguration/extensions",
  "version": "1.0.39"
}

拡張機能をインストールすると、Resource Bridge 内の k8s に Pod が増えます。

> .\kubectl.exe get pod -A --kubeconfig 'C:\ProgramData\kva\kubeconfig'
NAMESPACE                           NAME                                                                                    READY   STATUS              RESTARTS   AGE
(中略)
azure-arc                           prometheus-azure-arc-monitoring-prometheus-0                                            3/3     Running             0          5h22m
azure-arc                           resource-sync-agent-c56cb8c57-ssgsm                                                     2/2     Running             0          5h24m
azure-vmwareoperator                vmware-operator-manager-676c857d84-swbj2                                                1/1     Running             0          20m # 増えた Pod
capi-kubeadm-bootstrap-system       capi-kubeadm-bootstrap-controller-manager-59b45d75f7-pzktr                              2/2     Running             0          5h24m
capi-kubeadm-control-plane-system   capi-kubeadm-control-plane-controller-manager-5cbc779d84-6r7f6                          2/2     Running             0          5h24m

カスタムロケーションの作成

そのうえで、Resource Bridge と連携する vSphere 環境を Azure リージョンのように見せるために、カスタムロケーションを作成します。日本にある自宅の環境なので japanhome という名前にしました。

> $clusterExtensionId = (az k8s-extension show --subscription $applianceSubscriptionId `
  --resource-group $applianceResourceGroupName --name azure-vmwareoperator --cluster-type appliances --cluster-name $applianceName --query id -o tsv)
> 
> $applianceId = (az arcappliance show --subscription $applianceSubscriptionId `
  --resource-group $applianceResourceGroupName --name $applianceName --query id -o tsv)
WARNING: Command group 'arcappliance' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
> 
> $customLocationNamespace = ("$customLocationName".ToLower() -replace '[^a-z0-9-]', '')
> 
> $applianceId = (az arcappliance show --subscription $applianceSubscriptionId `
  --resource-group $applianceResourceGroupName --name $applianceName --query id -o tsv)
WARNING: Command group 'arcappliance' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
> 
> $customLocationSubscriptionId = $applianceSubscriptionId
> $customLocationResourceGroupName = $applianceResourceGroupName
> $customLocationName = "japanhome"
> $location = "eastus"
> $customLocationNamespace = ("$customLocationName".ToLower() -replace '[^a-z0-9-]', '')
>
> az customlocation create --debug --tags "" --subscription $customLocationSubscriptionId `
  --resource-group $customLocationResourceGroupName --name $customLocationName `
  --location $location --namespace $customLocationNamespace `
  --host-resource-id $applianceId --cluster-extension-ids $clusterExtensionId

{
  "authentication": {
    "type": null,
    "value": null
  },
  "clusterExtensionIds": [
    "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/arc-validate/providers/Microsoft.ResourceConnector/appliances/vcsa-home/providers/Microsoft.KubernetesConfiguration/extensions/azure-vmwareoperator"
  ],
  "displayName": "japanhome",
  "hostResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/arc-validate/providers/microsoft.resourceconnector/appliances/vcsa-home",
  "hostType": "Kubernetes",
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/arc-validate/providers/microsoft.extendedlocation/customlocations/japanhome",
  "identity": null,
  "location": "eastus",
  "name": "japanhome",
  "namespace": "japanhome",
  "provisioningState": "Succeeded",
  "resourceGroup": "arc-validate",
  "systemData": "<DELETED>",
  "tags": null,
  "type": "Microsoft.ExtendedLocation/customLocations"
}

登録されたカスタムロケーション

vCenter の接続

最後に az connectedvmware vcenter connect で vCenter を Azure に接続します。

> $customLocationId =  (az customlocation show --subscription $customLocationSubscriptionId `
  --resource-group $customLocationResourceGroupName --name $customLocationName --query id -o tsv)
> 
> $vCenterSubscriptionId = $applianceSubscriptionId
> $vCenterResourceGroupName = $applianceResourceGroupName
> $vCenterName = "vcsa.int.aimless.jp"
> $location = "eastus"
> az connectedvmware vcenter connect --debug --tags "" --subscription $vCenterSubscriptionId `
  --resource-group $vCenterResourceGroupName --name $vCenterName `
  --custom-location $customLocationId --location $location --port 443
> 
{
  "connectionStatus": "Connected",
  "credentials": {
    "password": null,
    "username": "administrator@vsphere.local" 
  },
  "customResourceName": "78697eda-4eb8-4b18-8d5a-7b1ecbf05e59",
  "extendedLocation": {
    "name": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/arc-validate/providers/microsoft.extendedlocation/customlocations/japanhome",
    "type": "CustomLocation"
  },
  "fqdn": "vcsa.int.aimless.jp",
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/arc-validate/providers/Microsoft.ConnectedVMwarevSphere/vcenters/vcsa.int.aimless.jp",
  "instanceUuid": "d65ce80e-1ec6-4b38-8d31-f0d54b112c9c",
  "kind": "VMware",
  "location": "eastus",
  "name": "vcsa.int.aimless.jp",
  "port": 443,
  "provisioningState": "Succeeded",
  "resourceGroup": "arc-validate",
  "statuses": [
    {
      "lastUpdatedAt": "2022-07-08T04:44:21+00:00",
      "message": null,
      "reason": null,
      "severity": null,
      "status": "True",
      "type": "Connected"
    },
    {
      "lastUpdatedAt": "2022-07-08T04:44:29.662588+00:00",
      "message": null,
      "reason": null,
      "severity": null,
      "status": "True",
      "type": "Ready"
    },
    {
      "lastUpdatedAt": "2022-07-08T04:44:29.662588+00:00",
      "message": null,
      "reason": null,
      "severity": null,
      "status": "True",
      "type": "Idle"
    }
  ],
  "systemData": "<DELETED>",
  "tags": {},
  "type": "microsoft.connectedvmwarevsphere/vcenters",
  "uuid": "78697eda-4eb8-4b18-8d5a-7b1ecbf05e59",
  "version": "7.0.3"
}

接続が完了すると、Azure Portal に vCenter が出現します。準備完了です。

Azure ポータル上の vCenter

まとめ

Azure Portal が生成するスクリプトを使わずに、あえて手作業で Azure Arc Resource Bridge を VMware vSphere 環境にデプロイしてみました。スクリプトに任せるのも良いですが、ステップバイステップで作業をすると理解が深まります。あえて手作業でやってみるのも悪くないですね。