LoginSignup
6
7

More than 5 years have passed since last update.

AWSで拡張性・耐障害性・セキュリティを考慮したクラウド構成のネットワーク設計

Posted at

新たにAWSにウェブサイトを立ち上げるにあたり、拡張性・耐障害性・セキュリティを考慮したクラウド構成、ネットワーク設計を検討しました。
構成、配置、ネットワークの設定等を記載したいと思います。(作成手順を書くと長くなるので省略しました)

要件

ウェブサイトに求められる主な要件は以下のとおりです。

  • サービスイン後の障害対応や仕様変更にもできるだけ不停止でサービスを続けたい
  • 将来的にWebサーバーの追加も可能な構成としたい
  • セキュリティを考慮した構成としたい(あいまい)

そこで、今回は以下の構成としました。

  • クライアントからのリクエストはELBで受け付け、複数のWebサーバーに振り分ける
  • ELB、Webサーバー(Apache+PHP)、DBサーバーを複数のデータセンターに分散配置する
  • ELBはHTTPSで受け付け、WebサーバーとはHTTPで通信する
  • Webサーバーのセッション情報はElastiCacheのmemcachedを利用して、Webサーバー間で共有する
  • Webサーバー、DBサーバーはプライベートサブネットに配置し、踏み台サーバーを経由してアクセスする
  • プライベートサブネットから外部へのアクセスはNATゲートウェイを経由してアクセスする

構成図

上記の要件を考慮した構成図です。

all.png

それでは、個々の要素の内容を見ていきます。

VPC

まずはVPCを1つ作成します。

Name CIDRブロック
vpc-area 10.0.0.0/16

インターネットゲートウェイ

インターネットゲートウェイ(Name:i-gateway)を作成し、VPCにアタッチします。

サブネット

以下のサブネットを作成していきます。

subnets.png

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

セキュリティグループ

サーバーの用途ごとにセキュリティグループを作成します。

securitygroups.png

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サーバを構築する
中規模ウェブサービスのためのクラウド構成例
大規模ウェブサービスのためのクラウド構成とお見積り例

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7