AWSでアプリケーションを動かすとき、いきなりECSやRDSを作るのではなく、まず「どこに置くか」「誰がどこへ入れるか」を決める必要がある。
VPC・ネットワーク構築は、家を建てる前の区画整理、塀、門の位置決めに近い。アプリやデータベースという建物を安全に置くために、先に街の構造を作っておく作業だ。
今回作ったネットワーク構成
今回の構成は、AWS上に自分専用のプライベートな街を作るイメージで整理した。
1. VPC(10.0.0.0/16)
2. パブリックサブネット x 2
3. プライベートサブネット x 2
4. インターネットゲートウェイ
5. S3用VPCエンドポイント
6. ALB用セキュリティグループ
7. ECS用セキュリティグループ
8. RDS用セキュリティグループ
全体像は次のようになる。
┌─────────────────────────────────────────────┐
│ VPC = 自分専用の街(10.0.0.0/16) │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ パブリック │ │ パブリック │ │
│ │ サブネット1 │ │ サブネット2 │ │
│ └──────────────┘ └──────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ プライベート │ │ プライベート │ │
│ │ サブネット1 │ │ サブネット2 │ │
│ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────┘
↑
インターネットゲートウェイ = 街の正門
VPCは自分専用のネットワーク空間
VPC(Virtual Private Cloud)は、AWS上に作る自分専用のネットワーク空間だ。
今回の 10.0.0.0/16 はCIDR表記で、使えるIPアドレスの範囲を表している。
10.0.0.0 〜 10.0.255.255
/16 は「上位16ビットを固定する」という意味。ざっくり言うと、10.0 から始まる住所をこの街の中で使う、という感覚で捉えるとわかりやすい。
パブリックサブネットとプライベートサブネット
サブネットは、VPCという大きな街の中をさらに分けた区画だ。
| パブリックサブネット | プライベートサブネット | |
|---|---|---|
| インターネットからの直接アクセス | できる構成にする | できない構成にする |
| 主に置くもの | ALB、場合によってはECS | RDS、内部用リソース |
| 比喩 | 表通り | 裏通り・金庫室 |
大事なのは、データベースをインターネットから直接見える場所に置かないこと。
鍵を強くすることも大切だが、そもそも到達できない場所に置くほうが安全性は高い。RDSのようなデータベースは、基本的にプライベートサブネットに置く。
Multi-AZで落ちにくくする
AZ(Availability Zone)は、物理的に分かれたデータセンターのようなもの。
1つのAZだけにサブネットを作ると、そのAZに障害が起きたときに影響を受けやすい。そこで、パブリックサブネットとプライベートサブネットをそれぞれ2つ作り、別々のAZに分散する。
AZ-A
├── パブリックサブネット
└── プライベートサブネット
AZ-C
├── パブリックサブネット
└── プライベートサブネット
これは、東京本社だけでなく大阪支店も用意しておくような考え方だ。片方に問題が起きても、もう片方でサービスを続けられる可能性が上がる。
インターネットゲートウェイは街の正門
インターネットゲートウェイは、VPCとインターネットをつなぐ門の役割を持つ。
ただし、インターネットゲートウェイがあるだけで全サブネットがインターネットと通信できるわけではない。サブネットに関連付けられたルートテーブルで、インターネット向け通信をインターネットゲートウェイへ流す必要がある。
0.0.0.0/0 → インターネットゲートウェイ
このルートを持つサブネットが、いわゆるパブリックサブネットになる。
NAT Gatewayを使わない構成にした理由
本番寄りの構成では、ECSなどのアプリケーションをプライベートサブネットに置き、外へ出る通信だけNAT Gateway経由にすることが多い。
プライベートサブネットのECS
↓
NAT Gateway
↓
インターネットゲートウェイ
↓
インターネット
NAT Gatewayは、塀の中の住人の代わりに外へ出てくれる執事のような存在だ。プライベートサブネット内のリソースは外へ通信できるが、インターネット側から勝手に入ってくることはできない。
ただし、学習用途ではNAT Gatewayのコストが気になる。そのため今回は、ECSをパブリックサブネットに置き、Public IPを付けて外へ通信できるようにする構成で代用する。
ECSにPublic IPを付ける考え方
Public IPを付けたECSは、プライベートIPに加えてインターネットと通信できるIPを持つ。
Public IPなし
→ プライベートIPのみ
→ そのままではインターネットに出られない
Public IPあり
→ プライベートIP + Public IP
→ インターネットに出られる
ここで注意したいのは、Public IPがあることと、誰でも入れることは別という点。
Public IPはインターネットへ出ていくために使う。一方で、外から入ってくる通信はセキュリティグループで制限する。
そのため、ECS用セキュリティグループで「ALBからの通信だけ許可」としておけば、ECSへ直接アクセスされるリスクを下げられる。
NAT Gateway方式とPublic IP方式の比較
| NAT Gatewayあり | Public IPで代用 | |
|---|---|---|
| ECSの配置 | プライベートサブネット | パブリックサブネット |
| ECSのIP | プライベートIPのみ | プライベートIP + Public IP |
| 外への通信 | NAT Gateway経由 | ECS自身が直接通信 |
| コスト | NAT Gateway分の費用がかかる | 学習用途では抑えやすい |
| セキュリティ | より本番向き | SG設計で補う学習向け構成 |
学習段階ではPublic IP方式で全体像を掴み、本番ではNAT Gatewayを含めた構成を検討する、という整理がよさそうだ。
S3用VPCエンドポイントはS3への裏口
VPCエンドポイントは、VPC内のリソースからAWSサービスへプライベートに接続するための仕組み。
S3 Gateway Endpointを使うと、インターネットゲートウェイやNAT Gatewayを経由せずにS3へアクセスできる。
VPC内のリソース
↓
S3 Gateway Endpoint
↓
S3
S3 Gateway Endpointは追加料金なしで使えるため、学習用でも取り入れやすい。S3にログやファイルを置く構成では、先に知っておくと便利な部品だ。
セキュリティグループはリソース単位の鍵
セキュリティグループは、EC2、ALB、ECS、RDSなどに付ける仮想ファイアウォールだ。
今回の構成では、3つのセキュリティグループをバケツリレーのようにつなげる。
インターネット
↓ HTTP/HTTPSのみ許可
ALB用SG
↓ ALB用SGからの通信のみ許可
ECS用SG
↓ ECS用SGからの3306のみ許可
RDS用SG
ポイントは、RDSの許可元をIPアドレスではなく、ECS用セキュリティグループにすること。
ECSタスクは起動し直すたびにIPアドレスが変わることがある。IPアドレスで許可していると、タスクの入れ替えに追従しにくい。
そこで「このIPの人だけ入れる」ではなく、「このバッジを付けている人だけ入れる」という考え方にする。
IP指定
→ 10.0.x.x のような住所で許可する
→ ECSのIPが変わると困る
SG指定
→ ECS用SGを持つリソースを許可する
→ ECSタスクが増減しても扱いやすい
セキュリティグループはステートフル
セキュリティグループはステートフルな仕組みだ。
つまり、行きの通信を許可すると、その戻りの通信は自動的に許可される。
1. ALB → ECS の通信を許可する
2. ECS → ALB の戻り通信は自動的に許可される
この性質のおかげで、リクエストとレスポンスの両方を毎回細かく書く必要がない。
ただし、これは「何でも通してよい」という意味ではない。どのリソースからどのポートへ入れるかは、インバウンドルールで明確に絞る必要がある。
固有名詞チェック
今回の記事では、学習環境に依存するセキュリティグループ名やプロジェクト名は本文に出さず、次のように一般化した。
| 元の意味 | 記事内での表現 |
|---|---|
| ALB向けのSG名 | ALB用セキュリティグループ |
| ECS向けのSG名 | ECS用セキュリティグループ |
| RDS向けのSG名 | RDS用セキュリティグループ |
AWS、VPC、ECS、RDS、ALB、S3などはサービス名・技術用語として必要なので残している。
まとめ
VPC・ネットワーク構築は、アプリやデータベースを置く前の土台作りだ。
- VPCはAWS上の自分専用ネットワーク
- サブネットはVPC内の区画
- パブリックサブネットは表通り、プライベートサブネットは裏通り
- RDSは直接インターネットから見えない場所に置く
- インターネットゲートウェイは街の正門
- NAT Gatewayはプライベートサブネットから外へ出るための出口
- 学習用途ではECSにPublic IPを付けて代用する構成もある
- S3 Gateway EndpointはS3への直通の裏口
- セキュリティグループはIPではなくSG同士でつなぐとクラウドらしい設計になる
一言でまとめると、VPC設計は**「AWS上に安全な街を作り、アプリとDBの置き場所と通行ルールを決める作業」**だ。
参考文献・リンク
- AWS Docs: How Amazon VPC works
- AWS Docs: Enable internet access for a VPC using an internet gateway
- AWS Docs: Subnet route tables
- AWS Docs: NAT gateways
- AWS Docs: Gateway endpoints
- AWS Docs: Security group rules