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の置き場所と通行ルールを決める作業」**だ。


参考文献・リンク