Azure アプリケーションゲートウェイ リダイレクト設定

スポンサーリンク

Azure アプリケーションゲートウェイ(Application Gateway)でリダイレクトを設定する方法をまとめます。リダイレクトとは他のドメイン(FQDN)へお引越しした事を示すメッセージです。(個人的な主観かもしれませんが)旧来のオンプレミスのapache httpdやnginxで実装する場合と異なり、若干の癖の強さを感じます。

前提

公式ドキュメント

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

事前設定

以下、リソースグループを作成します。

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」へリダイレクトします。

構成図 01

事前準備

リスナーの作成

まずはリダイレクト設定前の構成を作成します。

「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」へリダイレクトします。

構成図 02

リダイレクト設定

「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へリダイレクトします。

構成図 03

事前準備

サーバ証明書の作成

「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 ~ %
タイトルとURLをコピーしました