Azure Application Gatewayの構築方法と利用してみての感想

こんにちは、今回は Azure Application Gateway をご紹介したいと思います。

Application Gateway とは

レイヤー7(アプリケーション層)のロードバランシングやSSLアクセラレータの様な役割をする Microsoft Azure のサービスです。主な機能としては

・HTTP と HTTPS に対応
・SSLオフロードに対応
・Cookieベースのパーシステンスに対応 (セッション維持を必要とするWebAPPも利用可能)
・Webアプリケーションファイアウォール(WAF)が利用可能

その他詳しい機能に関しては、公式サイトを見て頂ければと思います。

注意点として、Azure Application Gateway は作成した時点で課金が発生するため、課金を停止するには削除しか方法が無いようです。(これはなんとかしてほしい・・・)

Application Gateway の構成

Application Gateway の構成について、ネットワーク周りで苦戦しました。
今回、検証した構成は以下となります。

Application Gateway

Application Gateway用の仮想ネットワーク内にバックエンドを配置する場合、バックエンド用のサブネットを作成する必要があります。
もし、別の仮想ネットワークにある既存サーバをロードバランシング対象としたい場合は、コマンドでNICを追加編集するか、仮想マシンを再作成する必要があります。

Application Gateway の構築

上記構成のApplication Gatewayを作成します。
構築にAzure PowerShellを利用しますので、事前準備などは以下記事を参考として頂ければと思います。

Azure上でNginxを構築し、リバースプロキシ機能を検証

SSLオフロード用のサーバ証明書作成

今回は無料で発行できる Let’s Encrypt のSSLサーバ証明書を使用しました。
以下はLInuxサーバで実行する手順となります。

# yum install epel-release
# yum install certbot
# certbot certonly -d [ドメイン名] --standalone

制約として、SSLサーバ証明書を登録する際の形式がPKCS#12(.pfx)形式である必要があるため、以下の様に変換が必要となります。

# openssl pkcs12 -export -inkey /etc/letsencrypt/live/{ドメイン名}/privkey.pem -in /etc/letsencrypt/live/{ドメイン名}/cert.pem -out /etc/letsencrypt/live/{ドメイン名}/server.pfx

仮想ネットワークの作成

以降はAzure PowerShellでの作業となります。
Application Gateway用の仮想ネットワークとサブネットワークを作成します。

項目名 設定値 アドレス空間
Application Gateway用仮想ネットワーク AppGWVnet 10.0.0.0/16
Application Gateway用サブネットワーク FrontSubnet 10.0.0.0/24
バックエンド用サブネットワーク BackSubnet 10.0.1.0/24
# Application Gateway用のサブネットワークを定義
> $subnet01 = New-AzureRmVirtualNetworkSubnetConfig -Name FrontSubnet -AddressPrefix 10.0.0.0/24
# バックエンド用のサブネットワークを定義
> $subnet02 = New-AzureRmVirtualNetworkSubnetConfig -Name BackSubnet -AddressPrefix 10.0.1.0/24
# Application Gateway用の仮想ネットワークの作成
> $vnet = New-AzureRmVirtualNetwork -Name AppGWVnet -ResourceGroupName $RSCGRP -Location $LOCALE -AddressPrefix 10.0.0.0/16 -Subnet $subnet01,$subnet02
# サブネット変数を割り当て
> $subnet01=$vnet.Subnets[0]

Application Gateway の作成

構成やポリシーなどを設定し、Application Gateway を作成します。

# リソースグループの指定
> $RSCGRP=[任意]
# ロケーションの指定
> $LOCALE=[任意]
# パブリックIPアドレスの作成
> $publicip = New-AzureRmPublicIpAddress -ResourceGroupName $RSCGRP -name AppGWPublicIP01 -location $LOCALE -AllocationMethod Dynamic
# バックエンドへルーティングするためのIPアドレスを構成
# Application Gateway用のサブネットワークからIPアドレスが選択され、バックエンド側のアクセスログからIPアドレスを確認できる
> $bipconfig = New-AzureRmApplicationGatewayIPConfiguration -Name AppGWBackendIP01 -Subnet $subnet01
# ロードバランシング対象のバックエンドIPアドレスを指定
> $backendpool = New-AzureRmApplicationGatewayBackendAddressPool -Name BackendPool01 -BackendIPAddresses 10.0.1.11,10.0.1.12,10.0.1.13
# バックエンドとのアクセスポート番号やパーシステンス機能の可否、タイムアウト時間を指定
> $backendpoolSetting = New-AzureRmApplicationGatewayBackendHttpSettings -Name "BackendSetting01" -Port 80 -Protocol Http -CookieBasedAffinity disabled -RequestTimeout 60
# パブリックIPアドレスの割り当て
> $fipconfig = New-AzureRmApplicationGatewayFrontendIPConfig -Name FrontendIPConfig01 -PublicIPAddress $publicip
# フロントのアクセスポート番号を指定
> $fport = New-AzureRmApplicationGatewayFrontendPort -Name FrontendPort01 -Port 443
# SSLサーバ証明書の登録
> $sslcert = New-AzureRmApplicationGatewaySslCertificate -Name SSLCert01 -CertificateFile [PFXファイルパス] -Password [パスワード]
# フロントのリスナー条件やSSLオフロードの指定
> $listener = New-AzureRmApplicationGatewayHttpListener -Name Listener01 -Protocol Https -FrontendIPConfiguration $fipconfig -FrontendPort $fport -SslCertificate $sslcert
# フロントとバックエンドとのルーティンングルールを指定
> $rule = New-AzureRmApplicationGatewayRequestRoutingRule -Name Rule01 -RuleType Basic -BackendHttpSettings $backendpoolSetting -HttpListener $listener -BackendAddressPool $backendpool
# Application Gateway のサイズやインスタンス数の指定
> $sku = New-AzureRmApplicationGatewaySku -Name Standard_Small -Tier Standard -Capacity 2
# Application Gateway の作成(15~20分程かかります)
> $appgw = New-AzureRmApplicationGateway -Name AppGW -ResourceGroupName $RSCGRP -Location $LOCALE -BackendAddressPools $backendpool -BackendHttpSettingsCollection $backendpoolSetting -FrontendIpConfigurations $fipconfig -GatewayIpConfigurations $bipconfig -FrontendPorts $fport -HttpListeners $listener -RequestRoutingRules $rule -Sku $sku -SslCertificates $sslcert
# Application Gateway の確認
> Get-AzureRmApplicationGateway -Name AppGW -ResourceGroupName $RSCGRP

バックエンド側の構築手順は割愛させて頂きます。
注意としてロードバランシング対象のバックエンドIPアドレスを指定しましたが、ポータルサイトでは仮想マシンに対してプライベートIPアドレスの指定はできないので、コマンドで実施して下さい。

Application Gateway の動作確認

Nginxのテストページにアクセスした際のバックエンド側のアクセスログです。
パーシステンス機能を無効にしているため、各バックエンドに分散されていることがわかります。

■10.0.1.11

10.0.0.4 - - [25/May/2017:11:48:51 +0900] "GET / HTTP/1.1" 200 3700 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko" "***.***.***.***:63591"

■10.0.1.12

10.0.0.4 - - [25/May/2017:11:48:51 +0900] "GET /nginx-logo.png HTTP/1.1" 200 368 "http://***.***.***.***/" "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko" "***.***.***.***:63591"

■10.0.1.13

10.0.0.4 - - [25/May/2017:11:48:51 +0900] "GET /poweredby.png HTTP/1.1" 200 2811 "http://***.***.***.***/" "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko" "***.***.***.***:64003"

まとめ

Application Gatewayを利用してみて思ったことは、ロードバランシング方式やパーシステンス方式などの細かい指定は出来ないので、商用で利用する際には十分な検証が必要だと思います。
しかし、レイヤー7ロードバランサとしての基本的な機能やSSLオフロード機能などは実装されているので、検討の選択肢としては入るのでないでしょうか。今後、サポートするプロトコルや機能が増えると思いますので、期待したいと思います。

サイオステクノロジー株式会社 山田

Be the first to comment

コメント投稿

Your email address will not be published.


*