Azure Traffic ManagerはDNSラウンドロビンを実現するマネージドサービスです。DNSラウンドロビンによって地理的に近い位置に振り分けたり、災害対策(ディザスタリカバリ)を実現したり、使い方によって様々な要件を実現できます。このページではTraffic Managerを「性能(Performance)」によって負荷分散させる方法をまとめます。
Traffic Managerは様々な負荷分散方式をサポートします。「性能(Performance)」以外の負荷分散方式は「Azure トラフィックマネージャー 負荷分散方式のまとめ」を参照ください。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
- クイック スタート:Azure CLI を使用して Web アプリケーションの高可用性を実現する Traffic Manager プロファイルを作成する
- チュートリアル:Traffic Manager を使用して Web サイトの応答性を向上させる
- パフォーマンスによるトラフィック ルーティング方法の構成
事前設定
東日本に仮想マシンを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 ~ %