Azure Front Door ルーティングエンジン

スポンサーリンク

Azure Front DoorはCDN(Contents Delivery Network)を提供するマネージドサービスです。Azure Front Doorでルーティングエンジンを使用すると、URL, 送信元のデバイス種別, 地域に応じて、任意のHTTPヘッダーを付与したりキャッシュ有無を変更したり柔軟な制御ができます。

前提

公式ドキュメント

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

事前設定

Azure Front Door 基本操作」で紹介したFront Doorが設定済の状態とします。

変数DNS_NAMEと変数FRONT_DOOR_NAMEは重複しない一位な値に変更ください。

DNS_NAME="gokatei01"
FRONT_DOOR_NAME="fr-gokatei01"

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

az network public-ip create \
  --resource-group MyResourceGroup \
  --name MyPublicIp \
  --dns-name ${DNS_NAME} \
  --sku Standard

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

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

az vm run-command invoke \
  --resource-group MyResourceGroup \
  --name linux010 \
  --command-id RunShellScript \
  --scripts @/dev/stdin << 'EOF'
#!/bin/bash
apt-get -y install nginx
echo "this is ${HOSTNAME}" > /var/www/html/index.html
echo "OK" > /var/www/html/image.png
EOF

az network front-door create \
  --resource-group MyResourceGroup \
  --name ${FRONT_DOOR_NAME} \
  --backend-address ${DNS_NAME}.japaneast.cloudapp.azure.com

az network front-door probe update \
  --resource-group MyResourceGroup \
  --front-door-name ${FRONT_DOOR_NAME} \
  --name DefaultProbeSettings \
  --protocol http

HTTPヘッダーの書き換え例

ルールエンジンの編集

HTTPレスポンスヘッダーにContent-Security-Policyを付与するルールを作成します。

az network front-door rules-engine rule create \
  --resource-group MyResourceGroup \
  --front-door-name fr-gokatei01 \
  --rules-engine-name MyRuleEngine \
  --name rule010 \
  --priority 10 \
  --match-processing-behavior Continue \
  --action-type ResponseHeader \
  --header-action Append \
  --header-name Content-Security-Policy \
  --header-value "script-src 'self' https://xxxx.xxxx.com."

作成したルール(MyRuleEngine)をルーティング規則(DefaultRoutingRule)に適用します。

az network front-door routing-rule update \
  --resource-group MyResourceGroup \
  --front-door-name fr-gokatei01 \
  --name DefaultRoutingRule \
  --rules-engine MyRuleEngine

動作確認

HTTPレスポンスヘッダーにContent-Security-Policyが付与されている事を確認します。

admin@mac19 ~ % curl -I http://fr-gokatei01.azurefd.net
HTTP/1.1 200 OK
Content-Length: 17
Content-Type: text/html
Last-Modified: Fri, 06 May 2022 13:46:08 GMT
Accept-Ranges: bytes
ETag: "627526a0-11"
X-Cache: CONFIG_NOCACHE
Content-Security-Policy: script-src 'self' https://xxxx.xxxx.com.
X-Azure-Ref: 03jB1YgAAAAD/j7dZMbIsS684M5raud4rVFlPMDFFREdFMjMxOABlZTc1ZjQ3YS1kYWEzLTQ1MjMtYTM0ZS05OTk5YWNmN2E5MTc=
Date: Fri, 06 May 2022 14:29:50 GMT

キャッシュ有無の変更

ルールエンジンのアクションの編集

ルールエンジンはHTTPヘッダーの書き換えだけでなく、ルーティング(振り分け先のバックエンドプールやキャッシュ有無)を変更する事もできます。

現在(2022年5月)時点ではaz network front-door rules-engine rule createコマンドでルーティングを変更する事はできません。近い将来に改修される可能性は高いと思いますが、以下のような回避策を用いて操作します。

  1. az network front-door rules-engine rule createコマンドでダミーのHTTPヘッダー書き換えルール作成
  2. az network front-door rules-engine rule action addコマンドでルーティング変更のルール作成
  3. az network front-door rules-engine rule action removeコマンドでダミーのHTTPヘッダー書き換えルール削除

後の操作で削除しますが、ダミーのHTTPヘッダー書き換えルールを作成します。

az network front-door rules-engine rule create \
  --resource-group MyResourceGroup \
  --front-door-name fr-gokatei01 \
  --rules-engine-name MyRuleEngine \
  --name rule020 \
  --priority 20 \
  --match-processing-behavior Continue \
  --action-type ResponseHeader \
  --header-action Delete \
  --header-name Dummy

キャッシュを有用にするルーティングを設定します。キャッシュ保持期間は3分とします。

az network front-door rules-engine rule action add \
  --resource-group MyResourceGroup \
  --front-door-name fr-gokatei01 \
  --rules-engine-name MyRuleEngine \
  --name rule020 \
  --action-type ForwardRouteOverride \
  --backend-pool DefaultBackendPool \
  --caching Enabled \
  --cache-duration PT3M

ダミーのHTTPヘッダー書き換えルールを削除します。

az network front-door rules-engine rule action remove \
  --resource-group MyResourceGroup \
  --front-door-name fr-gokatei01 \
  --rules-engine-name MyRuleEngine \
  --name rule020 \
  --index 0 \
  --action-type ResponseHeader

ここまでの操作で想定通りのルールになっている事を確認します。responseHeaderActionsが空配列で、routeConfigurationOverrideがキャッシュ有効の設定になっている事を確認します。

$ az network front-door rules-engine rule show \
  --resource-group MyResourceGroup \
  --front-door-name fr-gokatei01 \
  --rules-engine-name MyRuleEngine \
  --name rule020
{
  "action": {
    "name": null,
    "requestHeaderActions": [],
    "responseHeaderActions": [],
    "routeConfigurationOverride": {
      "backendPool": {
        "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/MyResourceGroup/providers/Microsoft.Network/Frontdoors/fr-gokatei01/backendPools/DefaultBackendPool",
        "resourceGroup": "MyResourceGroup"
      },
      "cacheConfiguration": {
        "cacheDuration": "0:03:00",
        "dynamicCompression": "Enabled",
        "queryParameterStripDirective": "StripAll",
        "queryParameters": null
      },
      "customForwardingPath": null,
      "forwardingProtocol": "MatchRequest",
      "odataType": "#Microsoft.Azure.FrontDoor.Models.FrontdoorForwardingConfiguration"
    }
  },
  "matchConditions": [],
  "matchProcessingBehavior": "Continue",
  "name": "rule020",
  "priority": 20
}

ルールエンジンの条件の編集

Azure Front Door 基本操作」で紹介したURL patternの例では、前方一致による条件一致しか指定できませんでした。しかし、ルールエンジンを使用すれば柔軟な条件一致を定義する事ができます。

以下にaz network front-door rules-engine rule condition addのヘルプを転載します。「モバイルか否か」「RequestBodyに基づく条件一致」「後方一致」など様々な指定方法が可能な事が分かります。

$ az network front-door rules-engine rule condition add -h

Please let us know how we are doing: https://aka.ms/azureclihats
admin@mac19 doc % az network front-door rules-engine rule condition add -h
This command is from the following extension: front-door

Command
    az network front-door rules-engine rule condition add : Add a match condition to a Rules Engine
    rule.

Arguments
    --front-door-name -f   [Required] : Name of the Front Door.
    --name -n              [Required] : Name of the rule.
    --resource-group -g    [Required] : Name of resource group. You can configure the default group
                                        using `az configure --defaults group=<name>`.
    --rules-engine-name -r [Required] : Name of the Rules Engine.

Match Condition Arguments
    --match-values                    : Space-separated list of values to match against.
    --match-variable                  : Name of the match condition.  Allowed values: IsMobile,
                                        PostArgs, QueryString, RemoteAddr, RequestBody,
                                        RequestFilename, RequestFilenameExtension, RequestHeader,
                                        RequestMethod, RequestPath, RequestScheme, RequestUri.
    --negate-condition                : Applies "Not" to the operator.  Allowed values: false, true.
    --operator                        : Operator of the match condition.  Allowed values: Any,
                                        BeginsWith, Contains, EndsWith, Equal, GeoMatch,
                                        GreaterThan, GreaterThanOrEqual, IPMatch, LessThan,
                                        LessThanOrEqual.
    --selector                        : Optional selector for the match condition variable.
    --transforms                      : Space-separated list of transforms to apply.  Allowed
                                        values: Lowercase, RemoveNulls, Trim, Uppercase, UrlDecode,
                                        UrlEncode.

末尾がpngで終わるURLのみに条件を絞り込むならば、以下のように記述します。

az network front-door rules-engine rule condition add \
  --resource-group MyResourceGroup \
  --front-door-name fr-gokatei01 \
  --rules-engine-name MyRuleEngine \
  --name rule020 \
  --match-variable RequestUri \
  --operator EndsWith \
  --match-values png

動作確認

手元の端末から10秒間隔でpngファイルへアクセスするようなCLI操作をします。

admin@mac19 ~ % while true ; do
 curl -s -I http://fr-gokatei01.azurefd.net/image.png | grep ^HTTP
 sleep 10
done

仮想マシンへsshでログインします。アクセスログを確認すると、10秒間隔ではなくキャッシュ保持切れになる3分間隔でアクセスが発生している事が分かります。なお、以下出力の場合はCDNサーバは2台構成のようで、それぞれのサーバが3分間隔のアクセスになります。

azureuser@linux010:~$ tail -f /var/log/nginx/access.log | grep png
147.243.196.245 - - [06/May/2022:15:01:42 +0000] "GET /image.png HTTP/1.1" 200 3 "-" "curl/7.77.0"
147.243.196.204 - - [06/May/2022:15:02:02 +0000] "GET /image.png HTTP/1.1" 200 3 "-" "curl/7.77.0"
147.243.196.245 - - [06/May/2022:15:05:04 +0000] "GET /image.png HTTP/1.1" 200 3 "-" "curl/7.77.0"
147.243.196.204 - - [06/May/2022:15:05:14 +0000] "GET /image.png HTTP/1.1" 200 3 "-" "curl/7.77.0"
147.243.196.245 - - [06/May/2022:15:08:07 +0000] "GET /image.png HTTP/1.1" 200 3 "-" "curl/7.77.0"
147.243.196.204 - - [06/May/2022:15:08:27 +0000] "GET /image.png HTTP/1.1" 200 3 "-" "curl/7.77.0"
147.243.196.245 - - [06/May/2022:15:11:10 +0000] "GET /image.png HTTP/1.1" 200 3 "-" "curl/7.77.0"
147.243.196.204 - - [06/May/2022:15:11:40 +0000] "GET /image.png HTTP/1.1" 200 3 "-" "curl/7.77.0"
タイトルとURLをコピーしました