弊社で提供するWebサービスのシステム構成は以下を基本として、条件により簡易化しております。
今回、以下のVPC、subnet 、セキュリティグループ、ELB、EC2、RDS、S3等の構築手順を記載したいと思います。
踏み台・NATサーバ設置のセキュア構成
上記構成では、メンテナンス等でアプリサーバへSSH接続する場合、外部から直接接続しないよう、踏み台サーバを経由して接続する構成にしています。
さらに、この踏み台サーバのインスタンスは、メンテナンスで使うときだけ立ち上げるようにし、通常時はインスタンスを落としておくことで、外部からの侵入のリスクを低減させており、セキュアなシステム構成といえます。
また、ELBをパブリックサブネットに置き、EC2をプライベートサブネットに置くことでEC2のアプリサーバにELB以外の外部からの直接アクセスを拒否し、ELBからのアクセスのみできるようにしています。
この場合、EC2から yum update 等での外部へのアウトバウンド通信が必要なときは、先の踏み台サーバをNATとして利用します。アウトバウンド通信が必要ない時は、インスタンスを落としておけば、セキュリティも向上しますし、インスタンス稼働のコストも節約することが可能です。
今回のシステム構成で作成するVPC内のサブネットは以下の3階層で作成します。
用途 | network | 設置 |
---|---|---|
フロントエンド | public | ELB, EC2(踏み台/NAT) |
アプリケーション | private | EC2(アプリケーションサーバ) |
データベース | private | RDS(DBサーバ) |
VPC外のAWSサービスとして以下を利用しますが、設定手順の詳細は今回は割愛します。
- S3(画像など静的コンテンツの保存)
- CloudFront
- SES
- WAF
- CloudWatch
今回の記事では、NAT設定の手前まで記載し、NAT設定は次の記事にて記載します。
VPCの作成
VPCは以下で設定します。
Name | IPv4 CIDR bloack | IPv6 CIDR bloack | テナンシー |
---|---|---|---|
vpc-cf-elb | 10.0.0.0/16 | No | デフォルト |
VPCを作成したら、タグに「キー:Network 値:Public」とつけておきましょう。
subnetの作成
各サブネットの設定は以下になります。
Name | VPC | Availability Zone | CIDR block |
---|---|---|---|
public-subnet-front1 | vpc-cf-elb | ap-northeast-1a | 10.0.0.0/24 |
public-subnet-front2 | vpc-cf-elb | ap-northeast-1c | 10.0.1.0/24 |
private-subnet-ap1 | vpc-cf-elb | ap-northeast-1a | 10.0.100.0/24 |
private-subnet-ap2 | vpc-cf-elb | ap-northeast-1c | 10.0.101.0/24 |
private-subnet-db1 | vpc-cf-elb | ap-northeast-1a | 10.0.200.0/24 |
private-subnet-db2 | vpc-cf-elb | ap-northeast-1c | 10.0.201.0/24 |
public-subnet-front1 の作成手順です。
サブネットを作成したら、タグに「キー:Network 値:Public」とつけておきましょう。
同様に他のサブネットも作成していきます。タグのNetworkはサブネットに応じて、Public/Private をつけます。
Internet Gateway の作成
VPC内のサーバがインターネットにアクセスするための出入口である Internet Gateway を作成します。
作成したInternet Gateway を VPC に紐付けます。「VPCにアタッチ」ボタンを押して下記の画面でVPCにアタッチします。
Route Table の作成
Route Table は、各サブネットに対しての設置される仮想ルータのルーティングテーブルです。
今回は、ルートテーブルを3階層(フロントエンドサブネット/アプリケーションサブネット/DBサーバサブネット)のサブネットにあわせて3つ作成します。
DBサーバ(プライベートサブネット)用 Route Table
サブネットを作成すると自動で生成され割当てられる Route Table をそのまま使います。
デフォルトのままですと、明示的に割当られているサブネットがないとのメッセージがでますので、一応、紐付けしておきます。また、名前も付けておきます。
フロントエンド(パブリックサブネット)用 Route Table
以下で、Route Table を新規作成します。
Destination に 0.0.0.0/0 が Internet Gateway に向くようにします。
この Route Table をパブリックサブネットに設定します。
パブリックサブネットの「ルートテーブル」タブをクリックして「編集」を押すと変更先のRoute Table を入力できるようになりますので、上記で作成した Route Table を選んで「保存」します。
もう1つのパブリックサブネットも同様に設定します。
アプリケーションサブネット用 Route Table
このRute Table はNAT用の設定も行ないますが、今はNATなしの設定で新規作成し、後ほど編集します。
作成した Route Table のサブネットの関連付けで、アプリケーションサブネットを関連つけます。
Security Group の作成
セキュリティグループを用途別に作成します。
ロードバランサー用(sg-public-web)
Inbound
Type | Protocol | Port | Source |
---|---|---|---|
HTTP(80) | TCP(6) | 80 | 0.0.0.0/0 |
HTTPS(443) | TCP(6) | 443 | 0.0.0.0/0 |
踏み台・NATサーバ用(sg-ssh-nat)
Inbound
Type | Protocol | Port | Source |
---|---|---|---|
SSH(22) | TCP(6) | 22 | [作業場所IP]/32 |
アプリケーションサーバ用(sg-ap)
Inbound (VPC内の通信は全インスタンス間をOKにするというポリシーなら設定なしでいいです)
Type | Protocol | Port | Source |
---|---|---|---|
HTTP(80) | TCP(6) | 80 | ELB のセキュリティグループ |
HTTPS(443) | TCP(6) | 443 | ELB のセキュリティグループ |
SSH(22) | TCP(6) | 22 | 踏み台のセキュリティグループ |
DBサーバ用(sg-db)
Inbound (VPC内の通信は全インスタンス間をOKにするというポリシーなら設定なしでいいです)
Type | Protocol | Port | Source |
---|---|---|---|
MySQL (3306) | TCP(6) | 3306 | ap server のセキュリティグループ |
DB サブネットグループの作成
RDSのコンソール画面にいき、「サブネットグループ」から「DBサブネットグループの作成」を行ないます。
DBサブネットグループ名「db-subnet-vpc-cf-elb」をつけ、VPCを選び、dbの2つのサブネットを登録します。
これでVPCの構築は完了です。
次は、以下のNAT構築編です。