AWS
EC2
RDS
elb
elasticache

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

More than 1 year has passed since last update.

新たに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サーバを構築する

中規模ウェブサービスのためのクラウド構成例

大規模ウェブサービスのためのクラウド構成とお見積り例