新たにAWSにウェブサイトを立ち上げるにあたり、拡張性・耐障害性・セキュリティを考慮したクラウド構成、ネットワーク設計を検討しました。
構成、配置、ネットワークの設定等を記載したいと思います。(作成手順を書くと長くなるので省略しました)
要件
ウェブサイトに求められる主な要件は以下のとおりです。
- サービスイン後の障害対応や仕様変更にもできるだけ不停止でサービスを続けたい
- 将来的にWebサーバーの追加も可能な構成としたい
- セキュリティを考慮した構成としたい(あいまい)
そこで、今回は以下の構成としました。
- クライアントからのリクエストはELBで受け付け、複数のWebサーバーに振り分ける
- ELB、Webサーバー(Apache+PHP)、DBサーバーを複数のデータセンターに分散配置する
- ELBはHTTPSで受け付け、WebサーバーとはHTTPで通信する
- Webサーバーのセッション情報はElastiCacheのmemcachedを利用して、Webサーバー間で共有する
- Webサーバー、DBサーバーはプライベートサブネットに配置し、踏み台サーバーを経由してアクセスする
- プライベートサブネットから外部へのアクセスはNATゲートウェイを経由してアクセスする
構成図
上記の要件を考慮した構成図です。
それでは、個々の要素の内容を見ていきます。
VPC
まずはVPCを1つ作成します。
Name | CIDRブロック |
---|---|
vpc-area | 10.0.0.0/16 |
インターネットゲートウェイ
インターネットゲートウェイ(Name:i-gateway)を作成し、VPCにアタッチします。
サブネット
以下のサブネットを作成していきます。
ELBのサブネット
ELBを配置するパブリックサブネットを2つのアベイラビリティゾーンに作成します。
Name | アベイラビリティゾーン | CIDRブロック |
---|---|---|
public-subnet-elb-1 | ap-northeast-1a | 10.0.1.0/24 |
public-subnet-elb-2 | ap-northeast-1c | 10.0.2.0/24 |
踏み台サーバーのサブネット
踏み台サーバー、NATゲートウェイを配置するパブリックサブネットを作成します。
これらの利用は一時的なものなので、とりあえず1つのAZだけに作成します。
AZの障害に対応するには、異なるAZにも配置する必要があります。
Name | アベイラビリティゾーン | CIDRブロック |
---|---|---|
public-subnet-bastion-1 | ap-northeast-1a | 10.0.3.0/24 |
Webサーバーのサブネット
Webサーバーを配置するプライベートサブネットを作成します。
Name | アベイラビリティゾーン | CIDRブロック |
---|---|---|
private-subnet-web-1 | ap-northeast-1a | 10.0.11.0/24 |
private-subnet-web-2 | ap-northeast-1c | 10.0.12.0/24 |
DBサーバーのサブネット
DBサーバーを配置するプライベートサブネットを作成します。
Name | アベイラビリティゾーン | CIDRブロック |
---|---|---|
private-subnet-db-1 | ap-northeast-1a | 10.0.21.0/24 |
private-subnet-db-2 | ap-northeast-1c | 10.0.22.0/24 |
ElastiCacheのサブネット
セッション情報を管理するElastiCacheを配置するプライベートサブネットを作成します。
Name | アベイラビリティゾーン | CIDRブロック |
---|---|---|
private-subnet-memcached-1 | ap-northeast-1a | 10.0.31.0/24 |
private-subnet-memcached-2 | ap-northeast-1c | 10.0.32.0/24 |
NATゲートウェイ
NATゲートウェイを作成し、踏み台サーバーのパブリックサブネットに配置します。
プライベートサブネットに配置するWebサーバーは、このNATゲートウェイを経由してインターネットにアクセスします。
Name | サブネット |
---|---|
nat-gateway | public-subnet-bastion-1 |
ルートテーブル
ルートテーブルはパブリックサブネット用とプライベートサブネット用の2つを作成します。
パブリックサブネットのルートテーブルpublic-route-tableを作成します。
このVPC内のターゲットであればVPC内でルーティングし、それ以外のものはインターネットゲートウェイを使用します。
先ほど作成したパブリックサブネット(public-subnet-elb-1、public-subnet-elb-2、public-subnet-bastion-1)に関連付けます。
送信先 | ターゲット |
---|---|
10.0.0.0/16 | local |
0.0.0.0/0 | i-gateway |
プライベートサブネットのルートテーブルprivate-route-tableを作成します。
こちらはインターネットゲートウェイではなく、NATゲートウェイを使用します。
先ほど作成したプライベートサブネット(private-subnet-web-1、private-subnet-web-2、private-subnet-db-1、private-subnet-db-2、private-subnet-memcached-1、private-subnet-memcached-2)に関連付けます。
送信先 | ターゲット |
---|---|
10.0.0.0/16 | local |
0.0.0.0/0 | nat-gateway |
セキュリティグループ
サーバーの用途ごとにセキュリティグループを作成します。
ELBのセキュリティグループ
パブリックサブネットに配置するELBのセキュリティグループelb-security-groupを作成します。
HTTPとHTTPSを受け付け、後続のWebサーバーにHTTPで接続します。(HTTPはHTTPSにリダイレクトするため接続を許可しています)
アウトバウンドの送信先に指定するweb-security-groupはこの後に作成します。
実際の手順では、web-security-groupを作成後、elb-security-groupを再度編集することになります。
インバウンド
タイプ | ソース |
---|---|
HTTP(80) | 0.0.0.0/0 |
HTTPS(443) | 0.0.0.0/0 |
アウトバウンド
タイプ | 送信先 |
---|---|
HTTP(80) | web-security-group |
踏み台サーバーのセキュリティグループ
パブリックサブネットに配置する踏み台サーバーのセキュリティグループbastion-security-groupを作成します。
SSHでのアクセスを受け付け、後続のWebサーバーへのSSHアクセスを許可します。
実際の運用ではポート番号を22から変更したり、アクセス元をIPアドレスで制限をかけたりすることになると思います。
インバウンド
タイプ | ソース |
---|---|
SSH(22) | 0.0.0.0/0 |
アウトバウンド
タイプ | 送信先 |
---|---|
SSH(22) | web-security-group |
Webサーバーのセキュリティグループ
プライベートサブネットに配置するWebサーバーのセキュリティグループweb-security-groupを作成します。
インバウンドでは、踏み台サーバーからのSSHとELBからのHTTPアクセスを許可します。
アウトバウンドでは、DBサーバー、ElastiCacheへのアクセス、さらに、パッケージのアップデートのためにNATゲートウェイ経由で外部へアクセスするため、HTTPとHTTPSを許可します。
インバウンド
タイプ | ソース |
---|---|
SSH(22) | bastion-security-group |
HTTP(80) | elb-security-group |
アウトバウンド
タイプ | 送信先 |
---|---|
MySQL/Aurora (3306) | db-security-group |
カスタム (11211) | memcached-security-group |
HTTP(80) | 0.0.0.0/0 |
HTTPS(443) | 0.0.0.0/0 |
DBサーバーのセキュリティグループ
プライベートサブネットに配置するDBサーバーのセキュリティグループdb-security-groupを作成します。
Webサーバーからのアクセスを許可します。アウトバウンドは不要なのでなしとします。
インバウンド
タイプ | ソース |
---|---|
MySQL/Aurora (3306) | web-security-group |
ElastiCache(memcached)のセキュリティグループ
プライベートサブネットに配置するmemcachedのセキュリティグループmemcached-security-groupを作成します。
Webサーバーからのアクセスを許可します。こちらもアウトバウンドは不要なのでなしとします。
タイプ | ソース |
---|---|
カスタム (11211) | web-security-group |
サブネットグループ
RDSとElastiCacheを利用するにあたり、それぞれのメニューでサブネットグループを作成します。
RDSのサブネットグループ(Name:db-subnet-group)では、DBのサブネット(private-subnet-db-1、private-subnet-db-2)を選択します。
ElastiCacheのサブネットグループ(Name:memcached-subnet-group)では、memcachedのサブネット(private-subnet-memcached-1、private-subnet-memcached-2)を選択します。
さいごに
ネットワークの作成やEC2インスタンスの生成など作業自体はAWSのコンソールで簡単にできますが、どのような構成・設計とすべきか検討するのは結構時間がかかるものです。
他にも具体的な事例をみて、不備がないか今後も確認していきたいと思います。
参考資料
これだけ押さえておけば大丈夫!Webサービス向けVPCネットワークの設計指針
AWSで最低限セキュアな構成を組む
AWSでセキュアなWebサーバを構築する
中規模ウェブサービスのためのクラウド構成例
大規模ウェブサービスのためのクラウド構成とお見積り例