Azure トラフィックマネージャー 基本操作

スポンサーリンク

Azure Traffic ManagerはDNSラウンドロビンを実現するマネージドサービスです。DNSラウンドロビンによって地理的に近い位置に振り分けたり、災害対策(ディザスタリカバリ)を実現したり、使い方によって様々な要件を実現できます。このページではTraffic Managerを「性能(Performance)」によって負荷分散させる方法をまとめます。

Traffic Managerは様々な負荷分散方式をサポートします。「性能(Performance)」以外の負荷分散方式は「Azure トラフィックマネージャー 負荷分散方式のまとめ」を参照ください。

前提

公式ドキュメント

参考になる公式ドキュメントを以下に示します。

事前設定

東日本に仮想マシンを1台作成します。

az group create --name MyResourceGroup --location japaneast

az network nsg create \
  --resource-group MyResourceGroup \
  --name MyNsgEast \
  --location japaneast
 
az network nsg rule create \
  --resource-group MyResourceGroup \
  --nsg-name MyNsgEast \
  --name seq100 \
  --priority 100 \
  --destination-port-ranges 22 80 \
  --access Allow \
  --protocol Tcp
 
az network public-ip create \
  --resource-group MyResourceGroup \
  --name MyPublicAddressEast \
  --location japaneast \
  --sku Standard

az vm create \
  --resource-group MyResourceGroup \
  --name linuxEast \
  --location japaneast \
  --image UbuntuLTS \
  --size Standard_B1s \
  --admin-username azureuser \
  --ssh-key-values ~/.ssh/authorized_keys \
  --public-ip-address MyPublicAddressEast \
  --nsg MyNsgEast \
  --custom-data /dev/stdin << 'EOF'
#!/bin/bash
apt-get -y install nginx
echo "this is Japan East" > /var/www/html/index.html
echo "OK" > /var/www/html/health.html
EOF

西日本に仮想マシンを1台作成します。

az network nsg create \
  --resource-group MyResourceGroup \
  --name MyNsgWest \
  --location japanwest
 
az network nsg rule create \
  --resource-group MyResourceGroup \
  --nsg-name MyNsgWest \
  --name seq100 \
  --priority 100 \
  --destination-port-ranges 22 80 \
  --access Allow \
  --protocol Tcp

az network public-ip create \
  --resource-group MyResourceGroup \
  --name MyPublicAddressWest \
  --location japanwest \
  --sku Standard

az vm create \
  --resource-group MyResourceGroup \
  --name linuxWest \
  --location japanwest \
  --image UbuntuLTS \
  --size Standard_B1s \
  --admin-username azureuser \
  --ssh-key-values ~/.ssh/authorized_keys \
  --public-ip-address MyPublicAddressWest \
  --nsg MyNsgWest \
  --custom-data /dev/stdin << 'EOF'
#!/bin/bash
apt-get -y install nginx
echo "this is Japan West" > /var/www/html/index.html
echo "OK" > /var/www/html/health.html
EOF

Traffic Managerの設定

Traffic Manager profileの定義

Traffic Managerのプロファイルを定義します。引数routing-methodはどのように負荷分散させるかの指定で、Geographic, Multivalue, Performance, Priority, Subnet, Weightedを指定できます。引数unique-dns-nameはAzure内で一位な名前を指定し、以降、<unique-dns-name>.trafficmanager.netの名前で負荷分散されるようになります。

TM_DNS_NAME=gokatei01

az network traffic-manager profile create \
  --resource-group MyResourceGroup \
  --name MyTrafficManager \
  --routing-method Performance \
  --unique-dns-name ${TM_DNS_NAME}

エンドポイントの定義

エンドポイント(負荷分散先)を指定します。エンドポイントはAzure内のリソースでもAzure以外のリソースでも指定可能です。このページでは説明を省略しますが、例えば、既存のオンプレミス環境をそのまま利用しCDNのみAzureを使用するような構成も採用可能です。

それではAzureの仮想マシンをエンドポイントとする設定例を紹介します。エンドポイントとして指定可能なAzureリソースはパブリックな名前解決が可能な状態でなければなりません。ですので、デフォルト設定のパブリックIPアドレスでは指定不可で、以下のように名前を定義する必要があります。

az network public-ip update \
  --resource-group MyResourceGroup \
  --name MyPublicAddressEast \
  --dns-name gokatei01

az network public-ip update \
  --resource-group MyResourceGroup \
  --name MyPublicAddressWest \
  --dns-name gokatei01

念の為、東西の仮想マシンに付与されたパブリックIPアドレスが名前解決可能な事を確認します。

admin@mac19 ~ % nslookup gokatei01.japaneast.cloudapp.azure.com
Server:   8.8.8.8
Address:  8.8.8.8#53

Non-authoritative answer:
Name: gokatei01.japaneast.cloudapp.azure.com
Address: 20.89.23.215

admin@mac19 ~ % nslookup gokatei01.japanwest.cloudapp.azure.com
Server:   8.8.8.8
Address:  8.8.8.8#53

Non-authoritative answer:
Name: gokatei01.japanwest.cloudapp.azure.com
Address: 20.89.242.220

admin@mac19 ~ % 

以下のようなコマンドでエンドポイント(負荷分散先)を指定します。引数typeはエンドポイントの種類でazureEndpoints, externalEndpoints, nestedEndpointsのいずれかを指定可能です。nestedEndpointsは文字通りの「入れ子」となるエンドポイントで他のTraffic Managerを指定する場合に使用します。

今回のシナリオでは仮想マシンをエンドポイントとしますので、typeはazureEndpointsとします。typeをazureEndpointsとする場合は、負荷分散先を引数target-resource-idで指定します。target-resource-idは名前ではなく、リソースのIDを指定してください。

TARGET_RESOURCE_ID_WEST=$(az network public-ip show \
  --resource-group MyResourceGroup \
  --name MyPublicAddressWest \
  --query id \
  --output tsv )

az network traffic-manager endpoint create \
  --resource-group MyResourceGroup \
  --name MyEndpointWest \
  --profile-name MyTrafficManager \
  --type azureEndpoints \
  --target-resource-id ${TARGET_RESOURCE_ID_WEST}

TARGET_RESOURCE_ID_EAST=$(az network public-ip show \
  --resource-group MyResourceGroup \
  --name MyPublicAddressEast \
  --query id \
  --output tsv )

az network traffic-manager endpoint create \
  --resource-group MyResourceGroup \
  --name MyEndpointEast \
  --profile-name MyTrafficManager \
  --type azureEndpoints \
  --target-resource-id ${TARGET_RESOURCE_ID_EAST}

ヘルスチェックの設定

Traffic Managerはデフォルト設定でヘルスチェックが実装されています。デフォルトのヘルスチェックの設定は以下の通りです。

$ az network traffic-manager profile show \
  --resource-group MyResourceGroup \
  --name MyTrafficManager \
  --query "monitorConfig"
{
  "customHeaders": null,
  "expectedStatusCodeRanges": null,
  "intervalInSeconds": 30,
  "path": "/",
  "port": 80,
  "profileMonitorStatus": "Degraded",
  "protocol": "HTTP",
  "timeoutInSeconds": 10,
  "toleratedNumberOfFailures": 3
}

仮想マシンへsshでログインしアクセスログを確認すると、ユーザエージェント「Azure Traffic Manager Endpoint Monitor」から定期的なポーリングがなされている事が分かります。

azureuser@linuxEast:~$ tail -n3 -f /var/log/nginx/access.log 
23.96.179.243 - - [04/May/2022:18:01:20 +0000] "GET / HTTP/1.1" 200 19 "-" "Azure Traffic Manager Endpoint Monitor"
23.101.176.193 - - [04/May/2022:18:01:33 +0000] "GET / HTTP/1.1" 200 19 "-" "Azure Traffic Manager Endpoint Monitor"
23.96.179.243 - - [04/May/2022:18:01:44 +0000] "GET / HTTP/1.1" 200 19 "-" "Azure Traffic Manager Endpoint Monitor"
23.101.176.193 - - [04/May/2022:18:01:48 +0000] "GET / HTTP/1.1" 200 19 "-" "Azure Traffic Manager Endpoint Monitor"

ヘルスチェックに関する挙動は設定変更可能です。以下のように「ヘルスチェックのURL」や「正常と判定するステータスコード」などを変更する事が可能です。

az network traffic-manager profile update \
  --resource-group MyResourceGroup \
  --name MyTrafficManager \
  --path '/health.html' \
  --status-code-ranges 200-399 \
  --interval 10 \
  --timeout 5 \
  --max-failures 3

ヘルスチェックの設定変更後、仮想マシンへsshでログインし、アクセスログから設定変更が反映された事を確認します。

azureuser@linuxEast:~$ tail -n3 -f /var/log/nginx/access.log 
23.96.179.243 - - [04/May/2022:18:08:50 +0000] "GET /health.html HTTP/1.1" 200 3 "-" "Azure Traffic Manager Endpoint Monitor"
23.101.176.193 - - [04/May/2022:18:08:52 +0000] "GET /health.html HTTP/1.1" 200 3 "-" "Azure Traffic Manager Endpoint Monitor"
23.96.179.243 - - [04/May/2022:18:08:54 +0000] "GET /health.html HTTP/1.1" 200 3 "-" "Azure Traffic Manager Endpoint Monitor"
23.101.176.193 - - [04/May/2022:18:08:57 +0000] "GET /health.html HTTP/1.1" 200 3 "-" "Azure Traffic Manager Endpoint Monitor"

疎通確認

地理的な近さの確認

Traffic Managerに付与されたFQDNを用いてアクセスすると、Traffic Managerに設定された負荷分散方式(ルーティング)による名前解決がなされます。Traffic Managerに紐づけられたFQDNを確認するには以下showコマンドを使用します。

$ az network traffic-manager profile show \
  --resource-group MyResourceGroup \
  --name MyTrafficManager \
  --query dnsConfig
{
  "fqdn": "gokatei01.trafficmanager.net",
  "relativeName": "gokatei01",
  "ttl": 30
}

負荷分散方式を「性能(Performance)」とした場合は、最も近いエンドポイントに負荷分散されます。

東日本の仮想マシンへsshログインし、digコマンドを実行します。その結果、東日本のCNAMEを返す事を確認します。

azureuser@linuxEast:~$ dig gokatei01.trafficmanager.net

; <<>> DiG 9.11.3-1ubuntu1.17-Ubuntu <<>> gokatei01.trafficmanager.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33003
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;gokatei01.trafficmanager.net.  IN  A

;; ANSWER SECTION:
gokatei01.trafficmanager.net. 30 IN CNAME gokatei01.japaneast.cloudapp.azure.com.
gokatei01.japaneast.cloudapp.azure.com. 9 IN A  20.89.23.215

;; Query time: 54 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed May 04 18:23:43 UTC 2022
;; MSG SIZE  rcvd: 125

西日本の仮想マシンへsshログインし、digコマンドを実行します。その結果、西日本のCNAMEを返す事を確認します。

azureuser@linuxWest:~$ dig gokatei01.trafficmanager.net

; <<>> DiG 9.11.3-1ubuntu1.17-Ubuntu <<>> gokatei01.trafficmanager.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41959
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;gokatei01.trafficmanager.net.  IN  A

;; ANSWER SECTION:
gokatei01.trafficmanager.net. 30 IN CNAME gokatei01.japanwest.cloudapp.azure.com.
gokatei01.japanwest.cloudapp.azure.com. 9 IN A  20.89.242.220

;; Query time: 51 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed May 04 18:24:02 UTC 2022
;; MSG SIZE  rcvd: 125

正常系

手元のノートPCから、Traffic Manager経由で仮想マシンへのHTTPによる疎通を確認します。手元のノートPCが東日本にある場合は東日本に接続され、西日本にある場合は西日本に接続されます。

admin@mac19 ~ % dig @8.8.8.8 gokatei01.trafficmanager.net

; <<>> DiG 9.10.6 <<>> @8.8.8.8 gokatei01.trafficmanager.net
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3408
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;gokatei01.trafficmanager.net.  IN  A

;; ANSWER SECTION:
gokatei01.trafficmanager.net. 30 IN CNAME gokatei01.japaneast.cloudapp.azure.com.
gokatei01.japaneast.cloudapp.azure.com. 10 IN A 20.89.23.215

;; Query time: 73 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Thu May 05 03:13:16 JST 2022
;; MSG SIZE  rcvd: 125

admin@mac19 ~ % curl http://gokatei01.trafficmanager.net/
this is Japan East
admin@mac19 ~ % 

異常系

正常系で振り分けられる仮想マシンを停止させます。東日本在住の方は、東日本の仮想マシンを停止させます。西日本在住の方は。、西日本の仮想マシンを停止させます。

az vm stop \
  --resource-group MyResourceGroup \
  --name linuxEast

東日本在住の方は、Traffic Managerの振り分け先が東から西に変わった事を確認します。西日本在住の方は、Traffic Managerの振り分け先が西から東に変わった事を確認します。

admin@mac19 ~ % dig @8.8.8.8 gokatei01.trafficmanager.net

; <<>> DiG 9.10.6 <<>> @8.8.8.8 gokatei01.trafficmanager.net
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34461
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;gokatei01.trafficmanager.net.  IN  A

;; ANSWER SECTION:
gokatei01.trafficmanager.net. 30 IN CNAME gokatei01.japanwest.cloudapp.azure.com.
gokatei01.japanwest.cloudapp.azure.com. 10 IN A 20.89.242.220

;; Query time: 93 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Thu May 05 03:36:42 JST 2022
;; MSG SIZE  rcvd: 125

admin@mac19 ~ % curl http://gokatei01.trafficmanager.net/
this is Japan West
admin@mac19 ~ % 
タイトルとURLをコピーしました