Azure アプリケーションゲートウェイ(Application Gateway)でリダイレクトを設定する方法をまとめます。リダイレクトとは他のドメイン(FQDN)へお引越しした事を示すメッセージです。(個人的な主観かもしれませんが)旧来のオンプレミスのapache httpdやnginxで実装する場合と異なり、若干の癖の強さを感じます。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
- Azure CLI を使用して HTTP から HTTPS へのリダイレクトと共にアプリケーション ゲートウェイを作成する
- Azure CLI を使用して外部リダイレクトと共にアプリケーション ゲートウェイを作成する
- Azure CLI を使用して内部リダイレクトと共にアプリケーション ゲートウェイを作成する
事前設定
以下、リソースグループを作成します。
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 Subnet01 \ --vnet-name MyVnet \ --address-prefixes 172.16.1.0/24 az network vnet subnet create \ --resource-group MyResourceGroup \ --name Subnet02 \ --vnet-name MyVnet \ --address-prefixes 172.16.2.0/24
アプリケーションゲートウェイを作成します。
az network public-ip create \ --resource-group MyResourceGroup \ --name MyPublicAddress \ --sku Standard az network application-gateway create \ --name MyAppGateway \ --resource-group MyResourceGroup \ --capacity 2 \ --sku Standard_v2 \ --public-ip-address MyPublicAddress \ --vnet-name MyVnet \ --subnet Subnet01
アプリケーションゲートウェイ配下に仮想マシンスケールセットを配置します。
az vmss create \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --image UbuntuLTS \ --vm-sku Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name MyVnet \ --subnet subnet02 \ --app-gateway MyAppGateway \ --backend-pool-name appGatewayBackendPool \ --custom-data /dev/stdin << 'EOF' #!/bin/bash apt-get -y install nginx echo "this is ${HOSTNAME}" > /var/www/html/index.html EOF
内部サイトへのリダイレクト
構成図
以下構成のロードバランサを作成します。「test.gokatei.net」から「www.gokatei.net」へリダイレクトします。
事前準備
リスナーの作成
まずはリダイレクト設定前の構成を作成します。
「test.gokatei.net」と「www.gokatei.net」のそれぞれに対するリスナーを定義します。
az network application-gateway http-listener create \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name MyListenerTest80 \ --frontend-ip appGatewayFrontendIP \ --frontend-port appGatewayFrontendPort \ --host-name test.gokatei.net az network application-gateway http-listener create \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name MyListenerWww80 \ --frontend-ip appGatewayFrontendIP \ --frontend-port appGatewayFrontendPort \ --host-name www.gokatei.net
ルールの作成
「test.gokatei.net」と「www.gokatei.net」のそれぞれに対するルールを定義します。
az network application-gateway rule create \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name RuleTest80 \ --http-listener MyListenerTest80 \ --rule-type Basic \ --address-pool appGatewayBackendPool az network application-gateway rule create \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name RuleWww80 \ --http-listener MyListenerWww80 \ --rule-type Basic \ --address-pool appGatewayBackendPool
デフォルト設定の削除
動作の妨げとなるデフォルト設定を削除します。
az network application-gateway rule delete \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name rule1 az network application-gateway http-listener delete \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name appGatewayHttpListener
疎通確認
リダイレクト設定前の状態で、期待通りの疎通ができる事を確認します。まずはアプリケーションゲートウェイに付与されたパブリックIPアドレスを調査します。
$ az network public-ip show \ --resource-group MyResourceGroup \ --name MyPublicAddress \ --query "ipAddress" "20.222.50.55"
「test.gokatei.net」と「www.gokatei.net」のそれぞれに疎通可能である事を確認します。
admin@mac19 ~ % curl -H 'Host:test.gokatei.net' http://20.222.50.55 this is myscae302000000 admin@mac19 ~ % curl -H 'Host:www.gokatei.net' http://20.222.50.55 this is myscae302000000 admin@mac19 ~ %
リダイレクト設定
「test.gokatei.net」から「www.gokatei.net」へのリダイレクトを設定します。
まずはredirect-configと呼ばれるどのようにリダイレクトするかの設定を作成します。引数target-listenerはリダイレクト先のリスナーを指定します。引数typeはHTTPステータスコードの指定で、Found(302), Permanent(301), SeeOther(303), Temporary(307)のいずれかを指定できます。
az network application-gateway redirect-config create \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name RuleRedirectWww \ --target-listener MyListenerWww80 \ --type Temporary \ --include-path true \ --include-query-string true
先ほどの操作で作成したredirect-configをルール(RuleTest80)に紐づけます。ルールはBackendPoolとredirect-configを同時に指定できないデータ構造の都合から、ruleのdelete/create操作をします。
az network application-gateway rule delete \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name RuleTest80 az network application-gateway rule create \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name RuleTest80 \ --http-listener MyListenerTest80 \ --rule-type Basic \ --redirect-config RuleRedirectWww
動作確認
「test.gokatei.net」から「www.gokatei.net」へリダイレクトされることを確認します。
admin@mac19 ~ % curl -I -H 'Host:test.gokatei.net' http://20.222.50.55 HTTP/1.1 307 Temporary Redirect Server: Microsoft-Azure-Application-Gateway/v2 Date: Sun, 01 May 2022 01:48:11 GMT Content-Type: text/html Content-Length: 197 Connection: keep-alive Location: http://www.gokatei.net/ admin@mac19 ~ %
外部サイトへのリダイレクト
構成図
以下構成のロードバランサを作成します。「test.gokatei.net」から「msn.com」へリダイレクトします。
リダイレクト設定
「test.gokatei.net」から「msn.com」へのリダイレクトを設定します。
以下のredirect-configを作成します。引数target-urlはリダイレクト先のURLを指定します。
az network application-gateway redirect-config create \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name RuleRedirectMsn \ --target-url http://msn.com \ --type Found \ --include-path false \ --include-query-string false
先ほどの操作で作成したredirect-configをルール(RuleTest80)に紐づけます。
az network application-gateway rule update \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name RuleTest80 \ --redirect-config RuleRedirectMsn
動作確認
「test.gokatei.net」から「msn.com」へリダイレクトされることを確認します。
admin@mac19 doc % curl -I -H 'Host:test.gokatei.net' http://20.222.50.55 HTTP/1.1 302 Moved Temporarily Server: Microsoft-Azure-Application-Gateway/v2 Date: Sun, 01 May 2022 02:10:17 GMT Content-Type: text/html Content-Length: 171 Connection: keep-alive Location: http://msn.com admin@mac19 doc %
HTTPからHTTPSへのリダイレクト
構成図
以下構成のロードバランサを作成します。httpからhttpsへリダイレクトします。
事前準備
サーバ証明書の作成
「www.gokatei.net」のサーバ証明書を作成します。
openssl req \ -x509 \ -sha256 \ -nodes \ -days 365 \ -newkey rsa:2048 \ -keyout privateKey.key \ -out appgwcert.crt \ -subj "/CN=www.gokatei.net" openssl pkcs12 -export -out appgwcert.pfx -inkey privateKey.key -in appgwcert.crt
証明書をアップロードします。証明書のファイル名とパスワードは適宜変更ください。
az network application-gateway ssl-cert create \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name www.gokatei.net \ --cert-file ./appgwcert.pfx \ --cert-password P@ssw0rd
フロントエンドポートの作成
tcp443のフロントエンドポートを定義します。
az network application-gateway frontend-port create \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name appGatewayFrontendPort443 \ --port 443
リスナーの作成
「test.gokatei.net」と「www.gokatei.net」のそれぞれに対するリスナーを定義します。
az network application-gateway http-listener create \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name MyListenerWww443 \ --frontend-ip appGatewayFrontendIP \ --frontend-port appGatewayFrontendPort443 \ --host-name www.gokatei.net \ --ssl-cert www.gokatei.net
ルールの作成
「https://www.gokatei.net」に対するルールを定義します。
az network application-gateway rule create \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name RuleWww443 \ --http-listener MyListenerWww443 \ --rule-type Basic \ --address-pool appGatewayBackendPool
疎通確認
「https://www.gokatei.net」へ疎通可能な事を確認します。
admin@mac19 ~ % curl -k \ --resolv www.gokatei.net:443:20.222.50.55 \ https://www.gokatei.net this is myscae302000000 admin@mac19 ~ %
リダイレクト設定
httpからhttpsへのリダイレクトを設定します。
以下のredirect-configを作成します。引数target-listenerはhttpsのリスナーを指定します。
az network application-gateway redirect-config create \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name RuleRedirect443 \ --target-listener MyListenerWww443 \ --type Temporary \ --include-path true \ --include-query-string true
先ほどの操作で作成したredirect-configをルール(MyListenerWww80)に紐づけます。ルールはBackendPoolとredirect-configを同時に指定できないデータ構造の都合から、ruleのdelete/create操作をします。
az network application-gateway rule delete \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name RuleWww80 az network application-gateway rule create \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name RuleWww80 \ --http-listener MyListenerWww80 \ --rule-type Basic \ --redirect-config RuleRedirect443
疎通確認
httpからhttpsへリダイレクトされる事を確認します。
admin@mac19 ~ % curl -I -H 'Host:www.gokatei.net' http://20.222.50.55 HTTP/1.1 307 Temporary Redirect Server: Microsoft-Azure-Application-Gateway/v2 Date: Sun, 01 May 2022 03:07:09 GMT Content-Type: text/html Content-Length: 197 Connection: keep-alive Location: https://www.gokatei.net/ admin@mac19 ~ %