😀

パブリック IP を持たない Azure VM に Azure Load Balancer からパブリックアクセスする構

に公開

パブリック IP を持たない Azure VM が既に存在していたとします。後から Azure Load Balancer を追加し、パブリック経由でアクセスできるようにしたい場合を想定して試してみました。

検証用のパブリック IP を持たない Azure VM を作成

bash
region=japaneast
prefix=mnrvmlb

az group create \
  --name ${prefix}-rg \
  --location $region

az vm create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --os-disk-name ${prefix}-vmOSDisk \
  --image Ubuntu2204 \
  --size Standard_B1s \
  --admin-username azureuser \
  --generate-ssh-keys \
  --public-ip-address "" \
  --nsg-rule NONE

Azure VM に Nginx を入れて動作確認

bash
az vm extension set \
  --publisher Microsoft.Azure.Extensions \
  --version 2.0 \
  --name CustomScript \
  --resource-group ${prefix}-rg \
  --vm-name ${prefix}-vm \
  --settings '{"fileUris":["https://raw.githubusercontent.com/Azure-Samples/compute-automation-configurations/master/automate_nginx.sh"],"commandToExecute":"./automate_nginx.sh"}'

az vm run-command invoke \
  --command-id RunShellScript \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --query "value[0].message" \
  --output tsv \
  --scripts "curl -s http://localhost/"

下記のような結果になれば動作確認完了。

Enable succeeded: 
[stdout]
Hello World from host mnrvmlb-vm !

[stderr]

Azure Load Balancer を作成

bash
az network public-ip create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-pip \
  --sku Standard

az network lb create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-lb \
  --sku Standard \
  --public-ip-address ${prefix}-pip \
  --frontend-ip-name myFrontEnd \
  --backend-pool-name myBackEndPool

az network lb probe create \
  --resource-group ${prefix}-rg \
  --lb-name ${prefix}-lb \
  --name myHealthProbe \
  --protocol tcp \
  --port 80

az network lb rule create \
  --resource-group ${prefix}-rg \
  --lb-name ${prefix}-lb \
  --name myHTTPRule \
  --protocol tcp \
  --frontend-port 80 \
  --backend-port 80 \
  --frontend-ip-name myFrontEnd \
  --backend-pool-name myBackEndPool \
  --probe-name myHealthProbe \
  --disable-outbound-snat true \
  --idle-timeout 15 \
  --enable-tcp-reset true

Azure VM を Azure Load Balancer に登録

bash
az network nic ip-config address-pool add \
  --resource-group ${prefix}-rg \
  --lb-name ${prefix}-lb \
  --address-pool myBackendPool \
  --ip-config-name ipconfig${prefix}-vm \
  --nic-name ${prefix}-vmVMNic

Azure VM の NSG に自分のパブリック IP を許可

bash
az network nsg rule create \
  --resource-group ${prefix}-rg \
  --nsg-name ${prefix}-vmNSG \
  --name myNSGRuleHTTP \
  --protocol Tcp \
  --direction inbound \
  --source-address-prefix $(curl -s inet-ip.info/ip) \
  --destination-port-range 80 \
  --access allow \
  --priority 200

パブリック IP を持たない Azure VM に Azure Load Balancer からパブリックアクセスを試す

bash
pip=$(az network public-ip show \
  --resource-group ${prefix}-rg \
  --name ${prefix}-pip \
  --query ipAddress \
  --output tsv)

curl -s $pip

下記のような結果になれば動作確認完了。

Hello World from host mnrvmlb-vm !

参考

https://learn.microsoft.com/ja-jp/azure/load-balancer/quickstart-load-balancer-standard-public-cli

Discussion