ハイブリッド構成によるWebサーバのオフロード事例(第1部:基本構成)
オンプレミスでWebサービスを運用していると、突発的な高負荷時にすぐに追加のサーバを用意できない、想定される最大負荷に応じてサーバをあらかじめ用意しておくにはコストが掛かりすぎるなど、スケールに関する問題に直面します。そこで今回は全3回にわたって、オンプレミスとAWSをネットワーク接続し、オンプレミスのWebサーバをAWSにオ フロードすることで必要なときに必要な台数のWebサーバをAWS上で確保する事例をご紹介します。
構成
オンプレミスからAWS間のネットワーク接続は専用線サービス「AWS Direct Connect」を利用します。オンプレミス上にはWebサーバが常時2台稼働していますが、追加のWebサ ーバが必要になった場合はAWSのVPC上にインスタンスを起動し、ロードバランサに追加します。別途、動作確認用にWebクライアントをロードバランサの上位に設置しております 。
本事例では、オンプレミス上のロードバランサにA10ネットワークス様の仮想アプライアンス vThunder(ACOS version 2.7.1-P3, build 76)を利用しました。本ブログ記事の作成にあたり、A10ネットワークス様に技術的なご支援をいただきました。この場を借りて御礼申 し上げます。
オンプレミス環境の準備
まずはオンプレミス上のロードバランサとWebサーバ2台から構成されるWebサービスの環境を構築します。
こちらはロードバランサ vThunderの基本設定になります。
interface ethernet 1
description "WAN interface"
ip address 10.0.0.100 255.255.255.0
!
interface ethernet 2
description "LAN interface"
ip address 192.168.10.20 255.255.255.0
!
health monitor http_index interval 3 timeout 1
method http url GET /index.html expect response-code 200
!
slb server websv01 192.168.10.101
health-check http_index
port 80 tcp
!
slb server websv02 192.168.10.102
health-check http_index
port 80 tcp
!
slb service-group websvgrp tcp
member websv01:80
member websv02:80
!
slb virtual-server webservice 10.0.0.101
disable when-all-ports-down
port 80 tcp
service-group websvgrp
この状態で、"show slb virtual-server"コマンドなどでVIPがUPしている か確認し、かつWebクライアントからVIP10.0.0.101にアクセスできることを確認します。
$ curl -I http://10.0.0.101/
HTTP/1.1 200 OK
...
オンプレミス上でWebサービスを提供する準備ができました。
AWSのVPC設定
次に、AWS上でWebサーバを起動するために、図のようなネットワーク環境を準備しま す。今回はAWS CLIを利用しました。
まずはVPCを作成します。
$ aws ec2 create-vpc --cidr-block 172.16.0.0/16
次に、Subnetを作成します。Subnetは2つのAvailability Zoneにそれぞれ1つづつ作成します。
$ aws ec2 create-subnet --vpc-id vpc-12345678 --availability-zone ap-northeast-1a --cidr-block 172.16.0.0/24
$ aws ec2 create-subnet --vpc-id vpc-12345678 --availability-zone ap-northeast-1c --cidr-block 172.16.1.0/24
Direct Connectを終端するために、VGW(Virtual Private Gateway)を作成し、VPCにアタッチします。
$ aws ec2 create-vpn-gateway --type ipsec.1
$ aws ec2 attach-vpn-gateway --vpn-gateway-id vgw-12345678 --vpc-id vpc-12345678
新規でルーティングテーブルを作成し、それぞれのSubnetにアソシエートします。オ ンプレミスと通信するため、192.168.10.0/24宛のネットワークをVGWへ向けるようにルーティングエントリを追加します。
$ aws ec2 create-route-table --vpc-id vpc-12345678
$ aws ec2 create-route --route-table-id rtb-12345678 --destination-cidr-block 192.168.10.0/24 --gateway-id vgw-12345678
$ aws ec2 associate-route-table --route-table-id rtb-12345678 --subnet-id subnet-12345678
$ aws ec2 associate-route-table --route-table-id rtb-12345678 --subnet-id subnet-abcdefgh
Direct Connectの設定
オンプレミスとAWSをネットワーク接続するために、Direct Connectを設定します。オンプレミスとVPCのルーティングにはBGP(Border Gateway Protocol)を利用します。
Direct Connectの利用手続きは完了しているものとし、Virtual Interfaceの作成から解説します。
VLAN番号、AS番号、IPアドレスなど、接続に必要なパラメータを指定し、Virtual Interfaceを作成します。前項で作成したVGWも同様に指定します。
$ aws directconnect create-private-virtual-interface \
--connection-id dx-xxxxxxx \
--new-private-virtual-interface virtualInterfaceName=vif,vlan=100,asn=65001,authKey=aws123,amazonAddress=169.254.0.1/30,customerAddress=169.254.0.2/30,virtualGatewayId=vgw-12345678
オンプレミス側のDirect Connectを終端するルータには、Cisco CSR1000Vを利用しま す。以下のようにインタフェース、ルーティング設定を行います。
!
interface GigabitEthernet1
no ip address
negotiation auto
!
interface GigabitEthernet1.100
description "Direct Connect"
encapsulation dot1Q 100
ip address 169.254.100.2 255.255.255.252
!
interface GigabitEthernet2
description "LAN"
ip address 192.168.10.20 255.255.255.0
negotiation auto
!
router bgp 65001
bgp log-neighbor-changes
network 192.168.10.0
neighbor 169.254.100.1 remote-as 10124
neighbor 169.254.100.1 password aws123
ロードバランサ vThunderに、VPCに対するルーティング設定を行います。VPCのCIDR(172.16.0.0/16)宛に、Cisco CSR1000Vをネクストホップとしてstatic routeを設定します 。
ip route 172.16.0.0 /16 192.168.10.10
今回利用したロードバランサvThuderはBGPも対応しているため、Direct Connectを直 接終端することも可能です。
EC2インスタンスの起動/登録
AWS上でEC2インスタンスを起動します。セキュリティグループはロードバランサから のHTTPトラフィックを許可します。また、Webサーバとして稼働するためにHTTPサーバの インストールやコンテンツの配置も行います。
$ aws ec2 create-security-group --group-name sg_websv --description "Security group for Web servers"
$ aws ec2 describe-security-groups --group-ids sg-12345678
$ aws ec2 authorize-security-group-ingress --group-id sg-12345678 --protocol tcp --port 80 --cidr 192.168.10.10/32
$ aws ec2 authorize-security-group-ingress --group-id sg-12345678 --protocol tcp --port 22 --cidr 192.168.10.0/24
$ aws ec2 run-instances --image-id ami-xxxxxxxx --count 1 --instance-type t1.micro --key-name keyname --security-group-ids sg-12345678 --subnet-id subnet-12345678
vThunderにec2インスタンスを登録します。
slb server ec2websv01 172.16.0.101
health-check http_index
port 80 tcp
確認用のサーバからvThunderのVIP宛にアクセスできるか確認してみます。オンプレミスで稼働しているWebサーバを一旦サービスから外しておくと、EC2インスタンスへのアクセスのみを確認することができます。
$ curl -I http://10.0.0.101/
HTTP/1.1 200 OK
...
AWS上のEC2インスタンスもWebサーバとしてロードバランサから利用できることが確認できました。
次回
次回の第2部では、突発的な負荷が発生した場合に備え、Auto Scalingを利用した「 自動スケールアウト」の方法をご紹介します。
さいごに
本検証はAWSが提供している「AWS専 用線アクセス体験ラボ」で行いました。オンプレミスとAWSの間の技術検証をご希望の方もぜひご利用ください。
ソリューションアーキテクト 吉田
コメント