Azure Front DoorはCDN(Contents Delivery Network)を提供するマネージドサービスです。CDNを利用する事によって地理的に近いCDNサーバが応答するだけでなく、CDNがキャッシュ応答する事によってAzure内の仮想マシンなどの負荷を低減する事ができます。このページではAzure Front Doorの基本的な操作をまとめます。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
事前設定
以下のリソースグループと仮想ネットワークを作成します。
az group create --name MyResourceGroup --location japaneast az network vnet create \ --resource-group MyResourceGroup \ --name MyVnet \ --address-prefix 172.16.0.0/16 az network vnet subnet create \ --resource-group MyResourceGroup \ --name MySubnet \ --vnet-name MyVnet \ --address-prefixes 172.16.1.0/24
サンプルサイトの作成
パブリックIPアドレス
サンプルサイトに付与するパブリックIPアドレスを定義します。後続の操作でFQDNによる指定が必要になるため、dns-nameも併せて定義します。dns-nameは重複しない一位な値に変更ください。
DNS_NAME="gokatei01" az network public-ip create \ --resource-group MyResourceGroup \ --name MyPublicIp \ --dns-name ${DNS_NAME} \ --sku Standard
ネットワークセキュリティグループ
後続操作で何度かアクセスログを確認する必要がありますので、利便性のためにhttpだけでなくsshも許可します。
az network nsg create \ --resource-group MyResourceGroup \ --name MyNsg \ --location japaneast az network nsg rule create \ --resource-group MyResourceGroup \ --nsg-name MyNsg \ --name seq100 \ --priority 100 \ --destination-port-ranges 22 80 \ --access Allow \ --protocol Tcp
サンプルコンテンツ
仮想マシンを1台作成します。
az vm create \ --resource-group MyResourceGroup \ --name linux010 \ --image UbuntuLTS \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name MyVnet \ --subnet MySubnet \ --public-ip-address MyPublicIp \ --nsg MyNsg
サンプルコンテンツとしてPukiWikiをインストールします。PukiWikiのダウンロードURLは変わる可能性がありますので、リンク切れとなってしまった場合は「PukiWiki公式サイト」より最新リンクを確認ください。
az vm run-command invoke \ --resource-group MyResourceGroup \ --name linux010 \ --command-id RunShellScript \ --scripts @/dev/stdin << 'EOF' #!/bin/bash sudo apt -y install apache2 php libapache2-mod-php unzip wget -O /tmp/pukiwiki-1.5.4_utf8.zip https://mirrors.gigenet.com/OSDN/pukiwiki/77082/pukiwiki-1.5.4_utf8.zip unzip -d /tmp/ /tmp/pukiwiki-1.5.4_utf8.zip rm -rf /var/www/html mv -f /tmp/pukiwiki-1.5.4_utf8 /var/www/html EOF
仮想マシン作成後、「http://<パブリックIPアドレスのDNS名>.japaneast.cloudapp.azure.com/」をブラウザに入力し、PukiWikiを閲覧できる事を確認します。
Front Doorの作成
Front Doorの作成
以下のようなコマンドでFront Doorを作成します。最低限必要となる引数は以下の通りです。引数nameのFrontDoor名はAzureで一意な名前を指定する必要があります。
az network front-door create \ --resource-group MyResourceGroup \ --name fr-gokatei01 \ --backend-address gokatei01.japaneast.cloudapp.azure.com
正常性プローブの変更
デフォルトの監視設定を確認しましょう。GUI(ポータル)を使用する場合は、すべてのサービスから、「ネットワーキング」「Front DoorとCDNプロファイル」「FrontDoor名(fr-gokatei01)」「FrontDoorデザイナー」「バックエンドプール名(DefaultBackendPool)」の順に画面遷移します。
以下スクリーンショットがデフォルト設定の正常性プローブです。httpsの監視になっているため、今回の動作確認シナリオに照らし合わせると不適切です。監視方法は後続の操作で変更します。
CLI操作の場合は、以下listコマンドより正常性プローブの設定名を調査します。以下出力の場合は、DefaultLoadBalancingSettingsが設定名である事が分かります。
$ az network front-door backend-pool list \ --resource-group MyResourceGroup \ --front-door-name fr-gokatei01 [ { "backends": [ { "address": "gokatei01.japaneast.cloudapp.azure.com", "backendHostHeader": "gokatei01.japaneast.cloudapp.azure.com", "enabledState": "Enabled", "httpPort": 80, "httpsPort": 443, "priority": 1, "privateEndpointStatus": null, "privateLinkAlias": null, "privateLinkApprovalMessage": null, "privateLinkLocation": null, "privateLinkResourceId": null, "weight": 50 } ], "healthProbeSettings": { "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/MyResourceGroup/providers/Microsoft.Network/frontdoors/fr-gokatei01/healthProbeSettings/DefaultProbeSettings", "resourceGroup": "MyResourceGroup" }, "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourcegroups/MyResourceGroup/providers/Microsoft.Network/Frontdoors/fr-gokatei01/BackendPools/DefaultBackendPool", "loadBalancingSettings": { "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/MyResourceGroup/providers/Microsoft.Network/frontdoors/fr-gokatei01/loadBalancingSettings/DefaultLoadBalancingSettings", "resourceGroup": "MyResourceGroup" }, "name": "DefaultBackendPool", "resourceGroup": "MyResourceGroup", "resourceState": "Enabled", "type": "Microsoft.Network/Frontdoors/BackendPools" } ]
デフォルトの監視設定を出力します。デフォルト設定はhttpsの監視になっているため、これを後続操作でhttpに変更します。
$ az network front-door probe list \ --resource-group MyResourceGroup \ --front-door-name fr-gokatei01 [ { "enabledState": "Enabled", "healthProbeMethod": "Head", "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourcegroups/MyResourceGroup/providers/Microsoft.Network/Frontdoors/fr-gokatei01/HealthProbeSettings/DefaultProbeSettings", "intervalInSeconds": 30, "name": "DefaultProbeSettings", "path": "/", "protocol": "Https", "resourceGroup": "MyResourceGroup", "resourceState": "Enabled", "type": "Microsoft.Network/Frontdoors/HealthProbeSettings" } ]
以上の調査により、デフォルトの状態ではhttpsという事が分かりました。おそらく、アプリケーションゲートウェイをバックエンドとする事を想定したデフォルト設定と推測されます。今回のシナリオでは仮想マシンをバックエンドとしますので、正常性プローブをhttpsからhttpに変更します。
az network front-door probe update \ --resource-group MyResourceGroup \ --front-door-name fr-gokatei01 \ --name DefaultProbeSettings \ --protocol http
ルーティング規則の確認
設定変更の必要はありませんが、念の為、デフォルト設定のルーティング規則を確認します。このようなデフォルト設定は将来変更される可能性が高いので、なるべく明示的ではない設定は確認するようにしましょう。
GUI(ポータル)でFrontDoorを作成した場合と、CLI(azコマンド)でFrontDoorを作成した場合でデフォルト設定が異なる事に注意ください。このドキュメントはCLI操作を前提にしています。
GUI(ポータル)でルーティング規則を確認するには、すべてのサービスから、「ネットワーキング」「Front DoorとCDNプロファイル」「FrontDoor名(fr-gokatei01)」「FrontDoorデザイナー」「ルーティング規則名(DefaultRoutingRule)」の順に画面遷移します。
以下スクリーンショットがデフォルト設定のルーティング規則です。
CLI操作の場合は、以下listコマンドよりルーティング規則を確認します。設定変更不要である事が分かります。
az network front-door routing-rule list \ --resource-group MyResourceGroup \ --front-door-name fr-gokatei01 [ { "acceptedProtocols": [ "Http" ], "enabledState": "Enabled", "frontendEndpoints": [ { "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/MyResourceGroup/providers/Microsoft.Network/frontdoors/fr-gokatei01/frontendEndpoints/DefaultFrontendEndpoint", "resourceGroup": "MyResourceGroup" } ], "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourcegroups/MyResourceGroup/providers/Microsoft.Network/Frontdoors/fr-gokatei01/RoutingRules/DefaultRoutingRule", "name": "DefaultRoutingRule", "patternsToMatch": [ "/*" ], "resourceGroup": "MyResourceGroup", "resourceState": "Enabled", "routeConfiguration": { "backendPool": { "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/MyResourceGroup/providers/Microsoft.Network/frontdoors/fr-gokatei01/backendPools/DefaultBackendPool", "resourceGroup": "MyResourceGroup" }, "cacheConfiguration": null, "customForwardingPath": null, "forwardingProtocol": "MatchRequest", "odataType": "#Microsoft.Azure.FrontDoor.Models.FrontdoorForwardingConfiguration" }, "rulesEngine": null, "type": "Microsoft.Network/Frontdoors/RoutingRules", "webApplicationFirewallPolicyLink": null } ]
疎通確認
「http://<FrontDoor名>.azurefd.net」をブラウザに入力し、PukiWikiを閲覧できる事を確認します。
キャッシュ設定
デフォルト設定の確認
ここまでの設定ではCDNにキャッシュが保持されないため、高速化にはつながっていません。それではCDNにキャッシュを保持させる動作を確認しましょう。
まずは、設定投入の前にデフォルトのルーティング規則(DefaultRoutingRule)を確認します。patternsToMatchとcacheConfigurationに着目すると、全てのURL(/*)に対してcacheが無効になっている事が分かります。
az network front-door routing-rule show \ --resource-group MyResourceGroup \ --front-door-name fr-gokatei01 \ --name DefaultRoutingRule { "acceptedProtocols": [ "Http" ], "enabledState": "Enabled", "frontendEndpoints": [ { "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourcegroups/MyResourceGroup/providers/Microsoft.Network/Frontdoors/fr-gokatei01/FrontendEndpoints/DefaultFrontendEndpoint", "resourceGroup": "MyResourceGroup" } ], "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourcegroups/MyResourceGroup/providers/Microsoft.Network/Frontdoors/fr-gokatei01/RoutingRules/DefaultRoutingRule", "name": "DefaultRoutingRule", "patternsToMatch": [ "/*" ], "resourceGroup": "MyResourceGroup", "resourceState": "Enabled", "routeConfiguration": { "backendPool": { "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourcegroups/MyResourceGroup/providers/Microsoft.Network/Frontdoors/fr-gokatei01/BackendPools/DefaultBackendPool", "resourceGroup": "MyResourceGroup" }, "cacheConfiguration": null, "customForwardingPath": null, "forwardingProtocol": "MatchRequest", "odataType": "#Microsoft.Azure.FrontDoor.Models.FrontdoorForwardingConfiguration" }, "rulesEngine": null, "type": "Microsoft.Network/Frontdoors/RoutingRules", "webApplicationFirewallPolicyLink": null }
キャッシュ有効のルーティング規則
Webコンテンツは動的に表示したいファイルと静的に表示したいファイルがあります。静的に表示したいもののみをキャッシュしなければアプリケーションが想定外の挙動を起こします。具体的に言えば、png, css, jsなどのファイルがキャッシュ対象として該当します。
動的に表示しなければならないコンテンツも存在しますので、前述の操作で確認したデフォルト設定のルーティング規則(DefaultRoutingRule)は削除せずに、そのまま有効活用します。
PukiWikiは/image/配下に静的なファイルが格納されていますので、/image/配下のみをキャッシュするように設定します。設定コマンドは以下の通りです。引数patternsには、キャッシュ対象とするpathを指定します。引数cache-durationは、キャッシュ保持期間をISO8601形式で指定します。
引数patternsは「/」で始まりワイルドカード「*」は末尾のみ指定可能です。言い換えれば前方一致検索しかできない事を意味します。複数のPATHを指定したい場合はスペース区切りで指定します。
ISO 8601は日付と時刻を表す規格です。0秒間ならば「PT0S」と、3分間ならば「PT3M」のように指定します。
az network front-door routing-rule create \ --resource-group MyResourceGroup \ --front-door-name fr-gokatei01 \ --name RoutingRuleImage \ --frontend-endpoints DefaultFrontendEndpoint \ --route-type Forward \ --backend-pool DefaultBackendPool \ --patterns '/image/*' \ --caching Enabled \ --cache-duration PT3M
動作確認
手元の端末から10秒間隔でpngファイルへアクセスするようなCLI操作をします。
admin@mac19 ~ % while true ; do curl -s -I http://fr-gokatei01.azurefd.net/image/pukiwiki.png | grep ^HTTP sleep 10 done
仮想マシンへsshでログインします。アクセスログを確認すると、10秒間隔ではなくキャッシュ保持切れになる3分間隔でアクセスが発生している事が分かります。なお、以下出力の場合はCDNサーバは2台構成のようで、それぞれのサーバが3分間隔のアクセスになります。
root@linux010:~# tail -f /var/log/apache2/access.log | grep png 147.243.196.240 - - [06/May/2022:07:50:41 +0000] "GET /image/pukiwiki.png HTTP/1.1" 200 4672 "-" "curl/7.77.0" 147.243.196.200 - - [06/May/2022:07:51:13 +0000] "GET /image/pukiwiki.png HTTP/1.1" 200 4672 "-" "curl/7.77.0" 147.243.196.240 - - [06/May/2022:07:53:45 +0000] "GET /image/pukiwiki.png HTTP/1.1" 200 4672 "-" "curl/7.77.0" 147.243.196.200 - - [06/May/2022:07:54:25 +0000] "GET /image/pukiwiki.png HTTP/1.1" 200 4672 "-" "curl/7.77.0" 147.243.196.240 - - [06/May/2022:07:56:47 +0000] "GET /image/pukiwiki.png HTTP/1.1" 200 4672 "-" "curl/7.77.0" 147.243.196.200 - - [06/May/2022:07:57:48 +0000] "GET /image/pukiwiki.png HTTP/1.1" 200 4672 "-" "curl/7.77.0" 147.243.196.240 - - [06/May/2022:07:59:49 +0000] "GET /image/pukiwiki.png HTTP/1.1" 200 4672 "-" "curl/7.77.0" 147.243.196.200 - - [06/May/2022:08:01:11 +0000] "GET /image/pukiwiki.png HTTP/1.1" 200 4672 "-" "curl/7.77.0" 147.243.196.240 - - [06/May/2022:08:02:52 +0000] "GET /image/pukiwiki.png HTTP/1.1" 200 4672 "-" "curl/7.77.0"
手元の端末から10秒間隔でトップページへアクセスするようなCLI操作をします。
while true ; do curl -s -I http://fr-gokatei01.azurefd.net/ | grep ^HTTP sleep 10 done
仮想マシンへsshでログインします。アクセスログを確認すると、キャッシュヒットせず10秒間隔のアクセスが発生している事が分かります。
azureuser@linux010:~$ tail -f /var/log/apache2/access.log | grep curl 147.243.214.73 - - [06/May/2022:10:28:19 +0000] "HEAD / HTTP/1.1" 200 300 "-" "curl/7.77.0" 147.243.196.241 - - [06/May/2022:10:28:29 +0000] "HEAD / HTTP/1.1" 200 300 "-" curl/7.77.0" 147.243.196.213 - - [06/May/2022:10:28:39 +0000] "HEAD / HTTP/1.1" 200 300 "-" curl/7.77.0" 147.243.214.79 - - [06/May/2022:10:28:49 +0000] "HEAD / HTTP/1.1" 200 300 "-" "curl/7.77.0" 147.243.214.75 - - [06/May/2022:10:28:59 +0000] "HEAD / HTTP/1.1" 200 300 "-" "curl/7.77.0" 147.243.214.82 - - [06/May/2022:10:29:10 +0000] "HEAD / HTTP/1.1" 200 300 "-" "curl/7.77.0"