こんにちは、今回は 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用の仮想ネットワーク内にバックエンドを配置する場合、バックエンド用のサブネットを作成する必要があります。
もし、別の仮想ネットワークにある既存サーバをロードバランシング対象としたい場合は、コマンドでNICを追加編集するか、仮想マシンを再作成する必要があります。
Application Gateway の構築
上記構成のApplication Gatewayを作成します。
構築にAzure PowerShellを利用しますので、事前準備などは以下記事を参考として頂ければと思います。
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 "https://***.***.***.***/" "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 "https://***.***.***.***/" "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko" "***.***.***.***:64003"
まとめ
Application Gatewayを利用してみて思ったことは、ロードバランシング方式やパーシステンス方式などの細かい指定は出来ないので、商用で利用する際には十分な検証が必要だと思います。
しかし、レイヤー7ロードバランサとしての基本的な機能やSSLオフロード機能などは実装されているので、検討の選択肢としては入るのでないでしょうか。今後、サポートするプロトコルや機能が増えると思いますので、期待したいと思います。
サイオステクノロジー株式会社 山田