+ 作るログイン
1 / 31
AWS でサービスを作る ― 知識ゼロから、構成を自分で考えられるまで / 全32章

AWS 16:総まとめ ― 3層の Web 構成を組み上げる

発行
アニメモ公式
版
第2版
改訂
コマ
全31

第1〜15章で集めた部品(VPC・パブリック/プライベートサブネット×2AZ・IGW・NAT・SG・EC2・EBS・ALB・Auto Scaling・RDS Multi-AZ・Route 53・ACM・S3・CloudFront)を、1つの3層の Web 構成に組み上げます。要件から構成を決め、ネットワーク・扉・データ・計算・入口の順に描き足し、利用者のリクエストが DNS から RDS、CloudFront まで通る一生を追いかけます。各部品が防いでいる困りごと、壊れたときの動き、作る順番、月額の目安の考え方、片付けまでを通して、一般的な Web 構成を自分で組めるようになることが目標です。

ここまでに集めた部品を、1つの構成に組み上げる

第1章から第15章まで、1章に1つずつ、部品と「なぜそれが要るのか」を見てきました。図に並べたのが、その部品です。

役割部品(章)
土台リージョンと AZ(第2章)、請求アラート(第1章)、お金の単位(第4章)
つなぐVPC(第5章)、サブネットと IGW(第6章)、NAT(第7章)、ALB(第11章)、Route 53(第14章)、CloudFront(第15章)
計算するEC2(第9章)、Auto Scaling(第12章)
しまうEBS(第10章)、RDS(第13章)、S3(第15章)
守るIAM(第3章)、セキュリティグループ(第8章)、ACM(第14章)

1つずつなら理解できても、「全部をどこに、どうつないで、どの順に作るのか」を一度に考えるのは難しいものです。この章では、これらを1つの構成図にまとめます。

この章のゴールは、実務でいちばんよく見る Web サービスの構成を、理由を説明しながら自分で組めるようになることです。そのために、次の順で進みます。

順番やること
1要件を並べ、構成の形(3層)を決める
2土台から順に、構成図を描き足していく
3利用者のリクエスト1回が、どこをどう通るかを追う
4各部品が防いでいる困りごと、壊れたときの動きを確かめる
5作る順番・確かめ方・お金・片付けをまとめる

※2026年9月時点の情報です。画面・料金・細部は変わることがあります。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 1 / 31
  • ここまでに集めた部品を、1つの構成に組み上げる
  • VPC
  • サブネット
  • IGW
  • NAT
  • SG
  • EC2
  • 第5章
  • 第6章
  • 第6章
  • 第7章
  • 第8章
  • 第9章
  • EBS
  • ALB
  • Auto Scaling
  • RDS
  • Route 53
  • ACM
  • 第10章
  • 第11章
  • 第12章
  • 第13章
  • 第14章
  • 第14章
  • S3
  • CloudFront
  • IAM
  • リージョン・AZ
  • 請求アラート
  • お金の単位
  • 第15章
  • 第15章
  • 第3章
  • 第2章
  • 第1章
  • 第4章
  • この章のゴール:この構成を、理由を説明しながら自分で組めるようになること
  • 部品の名前ではなく「それが無いと何が起きるか」で置き場所を決めていく
  • ひらめき
  • 第1〜15章で、部品と「なぜ要るか」を1つずつ手に入れた。この章でそれを1枚の構成図にまとめる。

まず要件:フォトログに求めること

構成を考えるとき、いきなり部品から選んではいけません。まず要件、つまり「このサービスに何が起きたら困るのか」を言葉にします。部品は、その困りごとへの答えとして後から決まります。

フォトログ(写真を投稿して、一覧を見て、いいねする SNS)の要件を並べます。

要件(困らないために)答える部品
https://example.com で安全に開けるRoute 53・ACM・ALB(第14章)
サーバーが1台壊れても止まらないALB・Auto Scaling(第11・12章)
データセンター(AZ)が1つ止まっても止まらない2つの AZ・RDS Multi-AZ(第2・13章)
混んだら増え、空いたら減るAuto Scaling(第12章)
データを失わず、時刻を指定して戻せるRDS のバックアップ(第13章)
写真を失わず、世界に速く配るS3・CloudFront(第15章)
DB やサーバーを外から直接触らせないプライベートサブネット・SG(第6・8章)

逆に言えば、要件が違えば構成も変わります。たとえば「社内の10人だけが使う」「止まっても翌朝直せばよい」なら、AZ を2つにする必要はないかもしれません(この章の最後で触れます)。

この本のフォトログは、一般公開のサービスとして、1つの故障では止まらないことを目標にします。これが、多くの会社で「本番」と呼べる最低限の水準です。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 2 / 31
  • まず要件:フォトログに求めること
  • 要件(困らないために)
  • 答える部品
  • https://example.com で安全に開ける
  • Route 53・ACM・ALB(第14章)
  • サーバーが1台壊れても止まらない
  • ALB・Auto Scaling(第11・12章)
  • データセンター(AZ)が1つ止まっても止まらない
  • 2つの AZ・RDS Multi-AZ(第2・13章)
  • 混んだら増え、空いたら減る
  • Auto Scaling(第12章)
  • データを失わず、時刻を指定して戻せる
  • RDS のバックアップ(第13章)
  • 写真を失わず、世界に速く配る
  • S3・CloudFront(第15章)
  • DB やサーバーを外から直接触らせない
  • プライベートサブネット・SG(第6・8章)
  • ひらめき
  • 構成は要件から決まる。部品から考えず、「何が起きたら困るか」を先に並べる。

3層構成:入口・計算・データを分ける

要件を満たす形として、3層構成を採ります。第13章で出てきた形です。

層置くもの置く場所外から増やし方扉
1 入口ALBパブリックサブネット受けるAWS が自動で443番だけ
2 計算EC2(アプリ)プライベートサブネット受けない台数を自動で増減ALB からだけ
3 データRDSプライベートサブネット受けない大きさを変える・複製を足すEC2 からだけ

層に分けると、次のことができます。

できること例
層ごとに守り方を変える外に触れるのは入口の層だけ。データの層は二重三重に奥へしまう
層ごとに増やす混んだら計算の層だけ台数を増やす。DB はそのまま
層ごとに入れ替えるアプリを新しい版にしても、入口とデータはそのまま

写真のような大きなファイルは、3層の流れに乗せず、横に置き場を作る(S3+CloudFront)のが定石です。第15章で見たとおり、大きなものを層の中で運ぶと、計算の層が配送係になって重くなるからです。

3層の形は、この本の後半で部品が増えても、ほとんどの構成の背骨として残ります。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 3 / 31
  • 3層構成:入口・計算・データを分ける
  • ネットワーク
  • 入口の層
  • サーバー
  • 計算の層
  • データベース
  • データの層
  • ALB(パブリック)
  • EC2(プライベート)
  • RDS(プライベート)
  • 外から
  • 受ける
  • 外から
  • 受けない
  • 外から
  • 受けない
  • 増減
  • AWS 任せ
  • 増減
  • 自動で台数
  • 増減
  • 大きさを変える
  • 扉
  • 443 だけ
  • 扉
  • ALB からだけ
  • 扉
  • EC2 からだけ
  • 写真のような大きなファイルは3層の横に置く(S3+CloudFront)
  • ひらめき
  • 層ごとに役割と守り方が違う。層を分けると、1つの層だけを増やしたり守ったりできる。

組み立て ①:VPC を1つ、2つの AZ にまたがって作る

ここから、構成図を土台から順に描き足していきます。

最初は VPC(第5章)です。AWS の中に作る、自分専用のネットワークでした。

決めることフォトログの値理由
リージョン東京(ap-northeast-1)利用者の多くが日本にいる(第2章)
アドレスの範囲10.0.0.0/16約6万5千個のアドレス。十分に広く、後で足りなくならない
使う AZAZ-a と AZ-c の2つ1つの AZ が止まっても、もう1つで動かす

/16 は、アドレスの先頭16ビット(10.0)が固定で、残りを自由に使える、という意味でした(第5章)。将来、別の VPC や会社のネットワークとつなぐ可能性があるなら、他と重ならない範囲を選んでおくことも大事です。

図では、VPC(青)の中に AZ-a と AZ-c(灰)を上下に並べています。この先、ほとんどすべての部品を、上の段と下の段に1つずつ置いていきます。「2つの AZ に1つずつ」が、この構成でいちばん大事な原則です。

VPC は、それ自体には料金がかかりません。料金がかかるのは、中に置く部品です。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 4 / 31
  • 組み立て ①:VPC を1つ、2つの AZ にまたがって作る
  • VPC:自分専用のネットワーク(第5章)
  • AZ:独立したデータセンター群(第2章)
  • VPC 10.0.0.0/16
  • AZ-a
  • 人々
  • 利用者
  • AZ-c
  • ひらめき
  • 10.0.0.0/16 の VPC を作り、AZ-a と AZ-c を使う。部品は2つの AZ に1つずつ置く。

組み立て ②:AZ ごとに3種類、合わせて6つのサブネット

次に、VPC をサブネット(第6章)に区切ります。3つの層に合わせて3種類、それを2つの AZ に作るので、合わせて6つです。

サブネットAZ-aAZ-c置くもの
パブリック10.0.0.0/2410.0.1.0/24ALB、NAT
アプリ(プライベート)10.0.10.0/2410.0.11.0/24EC2
DB(プライベート)10.0.20.0/2410.0.21.0/24RDS

/24 は、1つのサブネットに約250個のアドレスです(AWS が予約する5個を除く)。

番号の付け方に注目してください。パブリックは 0 番台、アプリは 10 番台、DB は 20 番台と、層ごとに番号の帯を分けています。こうしておくと、アドレスを見ただけでどの層かがわかり、後で AZ を3つに増やすときも 10.0.2.0/24、10.0.12.0/24 と足すだけで済みます。

図では、パブリックを青、プライベートを白で描いています。ただし第6章で見たとおり、パブリックかプライベートかは名前や色ではなく、ルートテーブルで決まります。次で、その「道」を引きます。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 5 / 31
  • 組み立て ②:AZ ごとに3種類、合わせて6つのサブネット
  • 青=パブリック(外への道がある)
  • 白=プライベート(外への直通なし)
  • VPC 10.0.0.0/16
  • AZ-a
  • パブリック 10.0.0.0/24
  • アプリ 10.0.10.0/24
  • DB 10.0.20.0/24
  • 人々
  • 利用者
  • AZ-c
  • パブリック 10.0.1.0/24
  • アプリ 10.0.11.0/24
  • DB 10.0.21.0/24
  • ひらめき
  • パブリック(入口)・アプリ・DB。住所の範囲は重ならないように、層ごとに番号の帯を分けておく。

組み立て ③:IGW・NAT・ルートテーブルで「道」を引く

サブネットに道を引きます。

部品置き場所役割
IGW(インターネットゲートウェイ)VPC に1つVPC とインターネットの出入り口(第6章)
NAT ゲートウェイ各 AZ のパブリックサブネットに1つずつプライベートから外へ出るための出口(第7章)

そして、サブネットの種類ごとにルートテーブルを作ります。

ルートテーブル0.0.0.0/0(VPC の外すべて)の行き先結果
パブリック用IGW外と行き来できる
アプリ用(AZ ごと)同じ AZ の NAT外へ出られるが、外からは入れない
DB 用なし(VPC の中だけ)外へも出られない

NAT を AZ ごとに置き、アプリのサブネットは同じ AZ の NAT を使うのがポイントです。NAT が1つだけだと、その AZ が止まったとき、もう片方の AZ の EC2 も外へ出られなくなります(NAT が単一障害点になる)。

なお、2025年からは、1つ作るだけで複数の AZ に自動で広がるリージョン型の NAT ゲートウェイも選べるようになりました。仕組みは同じで、置き方の手間が減る選択肢です。

DB のサブネットには外への道を一切引きません。DB は VPC の中の EC2 とだけ話せればよいからです。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 6 / 31
  • 組み立て ③:IGW・NAT・ルートテーブルで「道」を引く
  • ルート表
  • 0.0.0.0/0 の行き先
  • クラウド
  • インターネット
  • パブリック
  • IGW
  • アプリ
  • 同じ AZ の NAT
  • DB
  • なし(VPC の中だけ)
  • VPC 10.0.0.0/16
  • AZ-a
  • パブリック 10.0.0.0/24
  • ルーター
  • アプリ 10.0.10.0/24
  • DB 10.0.20.0/24
  • NAT
  • 人々
  • ルーター
  • 利用者
  • IGW
  • AZ-c
  • パブリック 10.0.1.0/24
  • ルーター
  • アプリ 10.0.11.0/24
  • DB 10.0.21.0/24
  • NAT
  • ひらめき
  • パブリックは IGW へ、アプリは NAT へ、DB はどこへも出さない。道はルートテーブルで決まる。

組み立て ④:セキュリティグループを「鎖」にする

道を引いたら、次は扉です。セキュリティグループ(SG、第8章)を層ごとに3つ作ります。

SG付ける相手受け付ける通信
alb-sgALB443番(と転送用の80番)を 0.0.0.0/0(世界中)から
app-sgEC2アプリのポート(例:80番)を alb-sg から
db-sgRDS5432番(PostgreSQL)を app-sg から

許可の相手に IP アドレスではなく別の SG を書いているのが要です。こうすると、次の図のような鎖になります。

通りたい人通れるか
利用者 → ALB通れる(alb-sg が世界からの443を許す)
利用者 → EC2・RDS通れない(どちらも外からの許可が無い)
ALB → EC2通れる
EC2 → RDS通れる。EC2 が何台に増えても、app-sg を付けていれば通れる

プライベートサブネット(道が無い)と SG(扉が無い)の二重の守りになっている点にも注目してください。どちらか一方の設定を間違えても、もう一方が止めてくれます。これを多層防御と呼びます(第27章)。

EC2 にログインして調べたいときも、SSH の扉(22番)は開けません。Session Manager(第7章)を使えば、扉を開けずに中に入れます。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 7 / 31
  • 組み立て ④:セキュリティグループを「鎖」にする
  • 盾
  • alb-sg
  • 盾
  • app-sg
  • 盾
  • db-sg
  • 443 を 0.0.0.0/0 から
  • 80 を alb-sg から
  • 5432 を app-sg から
  • OK
  • EC2 が何台に増えても、app-sg を付けていれば DB へ通れる
  • OK
  • 利用者は ALB にしか触れない。EC2 と DB には外から1歩も入れない
  • NG
  • db-sg に 0.0.0.0/0 や「VPC 全体」を許すと、鎖が切れる
  • ひらめき
  • alb-sg は世界から、app-sg は alb-sg から、db-sg は app-sg から。相手を SG で指定する。

完成図:一般的な3層の Web 構成

残りの部品を置くと、構成図が完成します。

場所置いたもの
上の帯(VPC の外)CloudFront、S3、ACM、(EC2 が出ていく先の)インターネット
左の柱利用者、Route 53
パブリックサブネットALB(両方の AZ にまたがる)、NAT(AZ ごと)
アプリのサブネットEC2(Auto Scaling グループ。黄色の囲み)
DB のサブネットRDS 本体(AZ-a)と待機系(AZ-c)

図を上下に見比べてください。AZ-a の段にあるものは、ほぼすべて AZ-c の段にもあります。どちらか一方の段が丸ごと消えても、もう一方の段だけで動けるように置いてあるのです。

例外に見えるのは RDS ですが、待機系が控えているので、本体が消えても待機系が本体になります(第13章)。ALB は1つに見えますが、実際には2つの AZ のパブリックサブネットに足を持っていて、AWS が両方を面倒見ています。

VPC の外にある Route 53・CloudFront・S3・ACM は、もともと AWS が複数の AZ や拠点で動かしているサービスです。あなたが AZ を気にする必要はありません。

これで、00章の「この本で作るもの ②」で見た形が、中身の理由まで含めて完成しました。次から、この図の上で、利用者のリクエストを1つ追いかけます。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 8 / 31
  • 完成図:一般的な3層の Web 構成
  • インターネット
  • CloudFront
  • フォルダ
  • S3
  • クラウド
  • インターネット
  • 守られている
  • ACM
  • 黄色の囲み=Auto Scaling グループ
  • EC2 は2台から、混めば増える
  • VPC 10.0.0.0/16
  • AZ-a
  • パブリック 10.0.0.0/24
  • アプリ 10.0.10.0/24
  • DB 10.0.20.0/24
  • ネットワーク
  • ルーター
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 本体
  • 人々
  • Web
  • Multi-AZ
  • ルーター
  • ALB
  • 利用者
  • IGW
  • 両方の AZ
  • AZ-c
  • パブリック 10.0.1.0/24
  • ルーター
  • アプリ 10.0.11.0/24
  • DB 10.0.21.0/24
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 待機系
  • 場所
  • Route 53
  • Web
  • 同期で写す
  • ひらめき
  • 上の帯は VPC の外。VPC の中は2つの AZ に同じ部品を1つずつ。「1つだけ」が無い。

リクエストの一生 ①:名前を調べる(Route 53)

利用者がスマートフォンで https://example.com を開いたとします。そのリクエストが、構成図のどこをどう通るのかを、小包で追います。

最初の一歩は、名前を IP アドレスに直すことです(第14章)。

誰が何をする
ブラウザ「example.com の IP は?」とリゾルバーに聞く
リゾルバールート → .com の係 → Route 53 の順に聞いて回る(覚えていれば省略)
Route 53エイリアスレコードに従い、ALB の今の IP アドレスを答える

図の青い小包がこの問い合わせです。答えはリゾルバーとブラウザが TTL の間だけ覚えておくので、2回目からはこの一歩はほとんど一瞬です。

ここで ALB の IP が返ってくるのは、第14章で example.com の A レコードをエイリアスで ALB に向けておいたからです。ALB の IP は AWS の都合で変わりますが、エイリアスなら Route 53 がいつも今の IP を答えてくれます。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 9 / 31
  • リクエストの一生 ①:名前を調べる(Route 53)
  • インターネット
  • CloudFront
  • フォルダ
  • S3
  • クラウド
  • インターネット
  • 守られている
  • ACM
  • 名前 → ALB の住所
  • VPC 10.0.0.0/16
  • IP は?
  • AZ-a
  • パブリック 10.0.0.0/24
  • アプリ 10.0.10.0/24
  • DB 10.0.20.0/24
  • ネットワーク
  • ルーター
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 本体
  • 人々
  • Web
  • Multi-AZ
  • ルーター
  • ALB
  • 利用者
  • IGW
  • 両方の AZ
  • AZ-c
  • パブリック 10.0.1.0/24
  • ルーター
  • アプリ 10.0.11.0/24
  • DB 10.0.21.0/24
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 待機系
  • 場所
  • Route 53
  • Web
  • 同期で写す
  • ひらめき
  • ブラウザは example.com の IP を聞き、最後に Route 53 が ALB の住所を答える(第14章)。

リクエストの一生 ②:ALB と鍵をかけて話す(HTTPS)

IP アドレスがわかったので、ブラウザは ALB につなぎます。

通るところ起きること
インターネット利用者の回線から AWS まで
IGWVPC の入口。パブリックサブネットの ALB へ(第6章)
alb-sg443番なので通してよい(第8章)
ALB の443番のリスナーACM の証明書を示して、暗号の通り道(TLS)を作る(第14章)

図の緑の小包が、GET /(トップ画面をください)というリクエストです。ここから ALB までは暗号化されているので、途中のカフェの Wi-Fi でも中身は読めません。

もし利用者が http:// で来ていたら、ALB の80番のリスナーが「301:https へどうぞ」と返し、ブラウザがもう一度443番に来ます(第14章)。

ブラウザは証明書を確かめます。名前が example.com で、信頼できる認証局の発行で、期限内です。ACM が自動で更新しているので、期限切れの心配もありません。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 10 / 31
  • リクエストの一生 ②:ALB と鍵をかけて話す(HTTPS)
  • インターネット
  • CloudFront
  • フォルダ
  • S3
  • クラウド
  • インターネット
  • 守られている
  • ACM
  • HTTPS で ALB へ(IGW 経由)
  • VPC 10.0.0.0/16
  • AZ-a
  • パブリック 10.0.0.0/24
  • アプリ 10.0.10.0/24
  • DB 10.0.20.0/24
  • ネットワーク
  • ルーター
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 本体
  • 人々
  • Web
  • Multi-AZ
  • ルーター
  • ALB
  • 利用者
  • IGW
  • 両方の AZ
  • AZ-c
  • パブリック 10.0.1.0/24
  • ルーター
  • アプリ 10.0.11.0/24
  • DB 10.0.21.0/24
  • GET /
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 待機系
  • 場所
  • Route 53
  • Web
  • 同期で写す
  • ひらめき
  • IGW を通って ALB の443番へ。ALB は ACM の証明書で身元を示し、暗号の通り道を作る(第14章)。

リクエストの一生 ③:ALB が元気な EC2 を選んで渡す

ALB は受け取ったリクエストを、ターゲットグループ(第11章)の中の EC2 に渡します。

ALB がすること内容
暗号をほどくTLS の終端は ALB。ここから VPC の中はふつうの HTTP(第14章)
渡す先を選ぶヘルスチェックに合格している EC2 の中から選ぶ(第11章)
扉を通るEC2 の app-sg は「alb-sg からなら通す」

図では AZ-a の EC2 が選ばれました。次のリクエストは AZ-c の EC2 に行くかもしれません。利用者は、自分がどちらの AZ のどの EC2 に当たったかを知りませんし、知る必要もありません。

これが成り立つのは、第12章で EC2 をステートレスにしたからです。どの EC2 も同じアプリで、ログイン状態や写真を自分の中に持っていません。だから、どの EC2 に振られても同じ答えが返ります。

Auto Scaling グループの EC2 は、起動テンプレート(第12章)から作られています。AMI・インスタンスタイプ・app-sg・IAM ロール・起動時の準備(ユーザーデータ)がすべてそこに書いてあるので、新しい EC2 も最初から同じ状態で生まれます。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 11 / 31
  • リクエストの一生 ③:ALB が元気な EC2 を選んで渡す
  • インターネット
  • CloudFront
  • フォルダ
  • S3
  • クラウド
  • インターネット
  • 守られている
  • ACM
  • 元気な EC2 へ(暗号はここまで)
  • VPC 10.0.0.0/16
  • AZ-a
  • パブリック 10.0.0.0/24
  • アプリ 10.0.10.0/24
  • DB 10.0.20.0/24
  • ネットワーク
  • ルーター
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 本体
  • 人々
  • GET /
  • Web
  • Multi-AZ
  • ルーター
  • ALB
  • 利用者
  • IGW
  • 両方の AZ
  • AZ-c
  • パブリック 10.0.1.0/24
  • ルーター
  • アプリ 10.0.11.0/24
  • DB 10.0.21.0/24
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 待機系
  • 場所
  • Route 53
  • Web
  • 同期で写す
  • ひらめき
  • ALB はヘルスチェックに合格した EC2 にだけ振る。どの AZ の EC2 かを利用者は知らない。

リクエストの一生 ④:EC2 が RDS にたずねる

トップ画面には、新しい写真の一覧を出します。EC2 のアプリは、RDS に問い合わせます。

通るところ起きること
RDS のエンドポイント名前で接続する。今の本体の IP が返る(第13章)
db-sg5432番、app-sg からなので通す
RDS 本体(AZ-a)SQL を実行し、写真の一覧(投稿者・説明文・s3_key)を返す

図の小包「SQL」が、この問い合わせです。

もし、いいねを押すような書き込みなら、RDS 本体は待機系(AZ-c)にも同期で写してから「完了」を返します。本体の AZ が突然止まっても、完了と返した書き込みは待機系に残っています。

ここで、AZ-c の EC2 が AZ-a の RDS 本体に話しかけることもある点に気づいたでしょうか。RDS の本体はいつも1つなので、半分の EC2 は別の AZ の DB と話します。AZ をまたぐ通信は少しだけ遅く、わずかに料金もかかりますが、1つのエンドポイントで済むという単純さのほうが大事です。

読み取りが増えて本体が忙しくなったら、リードレプリカ(第13章)やキャッシュ(第25章)を足します。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 12 / 31
  • リクエストの一生 ④:EC2 が RDS にたずねる
  • インターネット
  • CloudFront
  • フォルダ
  • S3
  • クラウド
  • インターネット
  • 守られている
  • ACM
  • EC2 → RDS(db-sg を通る)
  • VPC 10.0.0.0/16
  • AZ-a
  • パブリック 10.0.0.0/24
  • アプリ 10.0.10.0/24
  • DB 10.0.20.0/24
  • ネットワーク
  • ルーター
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 本体
  • 人々
  • Web
  • Multi-AZ
  • SQL
  • ルーター
  • ALB
  • 利用者
  • IGW
  • 両方の AZ
  • AZ-c
  • パブリック 10.0.1.0/24
  • ルーター
  • アプリ 10.0.11.0/24
  • DB 10.0.21.0/24
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 待機系
  • 場所
  • Route 53
  • Web
  • 同期で写す
  • ひらめき
  • アプリはエンドポイントの名前で RDS 本体に SQL を送る。書き込みは待機系にも写る。

リクエストの一生 ⑤:来た道を戻って、HTML が届く

EC2 は、RDS から受け取った一覧を使って、トップ画面の HTML(画面の設計図)を作ります。そして、来た道を逆にたどって返します。

戻り道起きること
EC2 → ALBHTTP で返す
ALB → 利用者暗号をかけ直して、HTTPS で返す

SG は「状態を覚える」門番(第8章)なので、行きに通したリクエストへの返事は、改めて許可を書かなくても通ります。

ここで大事なのは、返した HTML の中身です。HTML には写真そのものは入っていません。入っているのは、写真のURL だけです。

html
<img src="https://img.example.com/thumbs/u123/a1b2.webp" alt="夕焼けの海">

EC2 は、RDS から受け取った s3_key の頭に https://img.example.com/ を付けただけです。数 MB の写真を、EC2 は1バイトも運んでいません。

ブラウザは HTML を読み、<img> を見つけるたびに、その URL を取りに行きます。つまり、写真は別のリクエストとして、別の道を通ります。次にそれを追います。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 13 / 31
  • リクエストの一生 ⑤:来た道を戻って、HTML が届く
  • インターネット
  • CloudFront
  • フォルダ
  • S3
  • クラウド
  • インターネット
  • 守られている
  • ACM
  • 応答:写真の URL が入った HTML
  • VPC 10.0.0.0/16
  • HTML
  • AZ-a
  • パブリック 10.0.0.0/24
  • アプリ 10.0.10.0/24
  • DB 10.0.20.0/24
  • ネットワーク
  • ルーター
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 本体
  • 人々
  • Web
  • Multi-AZ
  • ルーター
  • ALB
  • 利用者
  • IGW
  • 両方の AZ
  • AZ-c
  • パブリック 10.0.1.0/24
  • ルーター
  • アプリ 10.0.11.0/24
  • DB 10.0.21.0/24
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 待機系
  • 場所
  • Route 53
  • Web
  • 同期で写す
  • ひらめき
  • EC2 は HTML を作って ALB へ返し、ALB が暗号をかけ直して利用者へ。写真はまだ無い。

リクエストの一生 ⑥:写真は CloudFront から(2回目以降)

ブラウザは https://img.example.com/… を開きます。この名前も Route 53 にあり、エイリアスで CloudFront を指しています(第14・15章)。

通るところ起きること
Route 53img.example.com → CloudFront の近くのエッジ
CloudFront のエッジこの写真を覚えている(キャッシュヒット)ので、すぐ返す

図の小包は、利用者のいちばん近くのエッジから写真が届くところです。

この道には、VPC も ALB も EC2 も出てきません。写真の配信は、フォトログの通信量の大部分を占めます。その大部分を CloudFront が引き受けているので、EC2 は少ない台数で済み、ALB の処理量も NAT の通信量も増えません。

CloudFront 用の証明書は、ACM のバージニア北部(us-east-1)で作ったものです(第14章)。ALB 用とは別の証明書である点に注意してください。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 14 / 31
  • リクエストの一生 ⑥:写真は CloudFront から(2回目以降)
  • インターネット
  • CloudFront
  • フォルダ
  • S3
  • クラウド
  • インターネット
  • 守られている
  • ACM
  • 写真:近くのエッジから(ヒット)
  • VPC 10.0.0.0/16
  • 写真
  • AZ-a
  • パブリック 10.0.0.0/24
  • アプリ 10.0.10.0/24
  • DB 10.0.20.0/24
  • ネットワーク
  • ルーター
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 本体
  • 人々
  • Web
  • Multi-AZ
  • ルーター
  • ALB
  • 利用者
  • IGW
  • 両方の AZ
  • AZ-c
  • パブリック 10.0.1.0/24
  • ルーター
  • アプリ 10.0.11.0/24
  • DB 10.0.21.0/24
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 待機系
  • 場所
  • Route 53
  • Web
  • 同期で写す
  • ひらめき
  • HTML の中の img.example.com の URL をブラウザが読む。近くのエッジが写しを返す。

リクエストの一生 ⑦:エッジに無ければ S3 から(初回だけ)

投稿されたばかりの写真は、まだどのエッジも覚えていません(キャッシュミス)。そのときだけ、エッジは本体(オリジン)の S3 へ取りに行きます。

通るところ起きること
CloudFront → S3OAC で「このディストリビューションです」と名乗って読む(第15章)
S3 のバケットポリシー自分の CloudFront だけに GetObject を許す
エッジ写真を覚えてから利用者に返す。次からはヒット

S3 は、ブロックパブリックアクセスをオンにしたままです。S3 の URL を直接叩いても読めません。写真を見る道は、CloudFront を通る1本だけです。

S3 から CloudFront への転送は無料で、写真の保存は複数の AZ に分けて保管されています(第15章)。AZ が1つ止まっても写真は消えず、配信も止まりません。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 15 / 31
  • リクエストの一生 ⑦:エッジに無ければ S3 から(初回だけ)
  • インターネット
  • CloudFront
  • フォルダ
  • S3
  • クラウド
  • インターネット
  • 守られている
  • ACM
  • 初回だけ:CloudFront → S3(OAC)
  • 写真
  • VPC 10.0.0.0/16
  • AZ-a
  • パブリック 10.0.0.0/24
  • アプリ 10.0.10.0/24
  • DB 10.0.20.0/24
  • ネットワーク
  • ルーター
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 本体
  • 人々
  • Web
  • Multi-AZ
  • ルーター
  • ALB
  • 利用者
  • IGW
  • 両方の AZ
  • AZ-c
  • パブリック 10.0.1.0/24
  • ルーター
  • アプリ 10.0.11.0/24
  • DB 10.0.21.0/24
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 待機系
  • 場所
  • Route 53
  • Web
  • 同期で写す
  • ひらめき
  • エッジは OAC で名乗って S3 から写真を取り、覚えてから返す。S3 は閉じたまま(第15章)。

リクエストの一生 ⑧:投稿は署名付き URL で S3 へ直接

今度は、利用者が写真を投稿するときの道です(第15章)。

順番通るところ起きること
1利用者 → ALB → EC2「投稿したい」と伝える
2EC2IAM ロールの権限で、キーを決めて署名付き URL を作って返す
3利用者 → S3写真を URL に直接 PUT する(図の黄色の小包)
4利用者 → ALB → EC2 → RDS「置けた」と伝え、EC2 が photos の表にキーと説明文を書く

重い写真は、ALB も EC2 も通りません。EC2 が扱うのは、許可証とキーという小さな文字だけです。

EC2 がアクセスキーを持たずに署名できるのは、起動テンプレートで IAM ロールを付けておいたからです(第3・15章)。ロールの権限は「このバケットに置く・読む」だけに絞ってあります。

大きな写真の縮小画像(thumbs/…)は、この時点ではまだありません。第24章では、S3 に写真が置かれたことをきっかけに、縮小画像を後から自動で作る仕組みを足します。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 16 / 31
  • リクエストの一生 ⑧:投稿は署名付き URL で S3 へ直接
  • インターネット
  • CloudFront
  • フォルダ
  • S3
  • クラウド
  • インターネット
  • 守られている
  • ACM
  • 投稿:写真は S3 へ直接 PUT
  • VPC 10.0.0.0/16
  • 写真 3MB
  • AZ-a
  • パブリック 10.0.0.0/24
  • アプリ 10.0.10.0/24
  • DB 10.0.20.0/24
  • ネットワーク
  • ルーター
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 本体
  • 人々
  • Web
  • Multi-AZ
  • ルーター
  • ALB
  • 利用者
  • IGW
  • 両方の AZ
  • AZ-c
  • パブリック 10.0.1.0/24
  • ルーター
  • アプリ 10.0.11.0/24
  • DB 10.0.21.0/24
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 待機系
  • 場所
  • Route 53
  • Web
  • 同期で写す
  • ひらめき
  • EC2 は署名付き URL を渡すだけ。写真は利用者から S3 へ直接送られ、EC2 はキーを RDS に書く。

リクエストの一生 ⑨:EC2 が外へ出るときは NAT を通る

最後は、利用者からではなく、EC2 から外へ向かう通信です。

例行き先
OS やソフトの更新を取ってくるインターネット上の配布元
外部の API を呼ぶ地図・メール送信などのサービス
AWS のサービスを呼ぶS3、Secrets Manager など

EC2 はプライベートサブネットにいるので、IGW へ直接の道はありません。アプリのルートテーブルに従って、同じ AZ の NAT へ行き、NAT が IGW を通って外へ出ます(第7章)。返事は NAT を通って戻ってきます。

外から EC2 へ入る道は、どこにもありません。NAT は「中から出て、その返事が戻る」だけを通すからです。

1つ気をつけたいのは、S3 への通信です。何もしないと、EC2 から S3 への通信も NAT を通り、NAT の処理量の料金がかかります。VPC に S3 用のゲートウェイエンドポイント(第7章)を付けると、S3 への通信は NAT を通らずに直接届き、エンドポイント自体の料金もかかりません。付けておいて損のない部品です。

これで、リクエストの一生を全部たどりました。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 17 / 31
  • リクエストの一生 ⑨:EC2 が外へ出るときは NAT を通る
  • インターネット
  • CloudFront
  • フォルダ
  • S3
  • クラウド
  • インターネット
  • 守られている
  • ACM
  • EC2 → NAT → IGW → 外
  • VPC 10.0.0.0/16
  • 更新の取得
  • AZ-a
  • パブリック 10.0.0.0/24
  • アプリ 10.0.10.0/24
  • DB 10.0.20.0/24
  • ネットワーク
  • ルーター
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 本体
  • 人々
  • Web
  • Multi-AZ
  • ルーター
  • ALB
  • 利用者
  • IGW
  • 両方の AZ
  • AZ-c
  • パブリック 10.0.1.0/24
  • ルーター
  • アプリ 10.0.11.0/24
  • DB 10.0.21.0/24
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 待機系
  • 場所
  • Route 53
  • Web
  • 同期で写す
  • ひらめき
  • OS の更新や外部の API は、同じ AZ の NAT → IGW で外へ。外から EC2 へ入る道は無い。

各部品が防いでいる困りごと ①:つなぐ・守る

構成図の部品が、それぞれ何を防いでいるのかを表にまとめます。「その部品を外したら、何が起きるか」を言えることが、構成を理解しているということです。

部品無いと起きること章
VPC・サブネットすべてがインターネットにむき出しになり、区切って守れない第5・6章
IGW外から入口(ALB)に届かない第6章
NAT(AZ ごと)EC2 が更新も外部の API も取れない。1つだけなら AZ 障害で全台が外に出られない第7章
SG の鎖DB やサーバーに誰でも接続を試せる第8章
ALB台数を増やしても、どれに送るか決められない。壊れた台にも送り続ける第11章
Route 53長い名前しか無く、ALB を作り直すと URL が変わる第14章
ACM・HTTPSパスワードやログインのクッキーを途中で読まれる第14章
IAM ロールアクセスキーをサーバーに置くことになり、漏れる第3・15章

この表は、構成を人に説明するときにもそのまま使えます。「なぜ NAT が2つあるの?」と聞かれたら、「1つだと、その AZ が止まったとき、もう一方の AZ のサーバーも外へ出られなくなるから」と答えられます。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 18 / 31
  • 各部品が防いでいる困りごと ①:つなぐ・守る
  • 部品
  • 無いと起きること
  • 章
  • VPC・サブネット
  • すべてがインターネットにむき出しになる
  • 第5・6章
  • IGW
  • 外から入口(ALB)に届かない
  • 第6章
  • NAT
  • EC2 が更新も外部の API も取れない
  • 第7章
  • SG の鎖
  • DB やサーバーに誰でも接続を試せる
  • 第8章
  • ALB
  • 台数を増やしても、どこに送るか決められない
  • 第11章
  • Route 53
  • 長い名前しか無く、作り直すと URL が変わる
  • 第14章
  • ACM・HTTPS
  • パスワードやクッキーを途中で読まれる
  • 第14章
  • IAM ロール
  • アクセスキーをサーバーに置き、漏れる
  • 第3・15章
  • ひらめき
  • 部品を外したら何が起きるかを言えれば、その部品を置く理由を説明できる。

各部品が防いでいる困りごと ②:計算・しまう・配る

続きです。

部品無いと起きること章
2つの AZデータセンター1つの障害で全部止まる第2章
Auto Scaling壊れたサーバーが放置され、混雑した日に落ちる第12章
ステートレスサーバーを捨てると、ログイン状態や写真が消える第12章
RDSDB の更新・バックアップ・切り替えを全部自分でやる第13章
Multi-AZDB が単一障害点になる第13章
バックアップ間違って消したデータが戻らない第13章
S3写真がサーバーと一緒に消え、他の台からは見えない第15章
CloudFront遠い利用者に遅く、同じ写真を何万回も運ぶ第15章

2つの表を通して見ると、1つの原則が浮かび上がります。「1つだけ」のものが、構成の弱点になるということです。

1つだけだったもの2つ以上にした方法
サーバーAuto Scaling で2台以上、2つの AZ に
DBMulti-AZ で待機系
NATAZ ごとに1つ
写真の置き場S3 が複数 AZ に保管

構成図を見たら、まず「1つしか無いものはどれか」を探す。これが、後の第29章(可用性と災害対策)につながる考え方です。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 19 / 31
  • 各部品が防いでいる困りごと ②:計算・しまう・配る
  • 部品
  • 無いと起きること
  • 章
  • 2つの AZ
  • データセンター1つの障害で全部止まる
  • 第2章
  • Auto Scaling
  • 壊れたサーバーが放置され、混雑で落ちる
  • 第12章
  • ステートレス
  • サーバーを捨てるとログインや写真が消える
  • 第12章
  • RDS
  • DB の更新・バックアップ・切り替えを全部自分で
  • 第13章
  • Multi-AZ
  • DB が単一障害点になる
  • 第13章
  • バックアップ
  • 間違って消したデータが戻らない
  • 第13章
  • S3
  • 写真がサーバーと一緒に消え、他の台から見えない
  • 第15章
  • CloudFront
  • 遠い利用者に遅く、同じ写真を何万回も運ぶ
  • 第15章
  • ひらめき
  • 「2つの AZ に1つずつ」は全部の部品に通じる原則。1つだけのものが、構成の弱点になる。

壊れたら ①:EC2 が1台倒れる

構成が本当に「止まらない」のかを、壊れた場面で確かめます。まず、AZ-a の EC2 が1台、突然応答しなくなった場合です。

時間の流れ起きること
数十秒ALB のヘルスチェックに続けて失敗し、「不健康」と判定される(第11章)
すぐALB はその EC2 に振るのをやめ、AZ-c の EC2 にだけ振る
数分Auto Scaling が不健康な EC2 を終了し、起動テンプレートから新しい EC2 を立てる(第12章)
新しい EC2 が合格ALB が再び振り始める

図では、倒れた EC2 が赤くなり、ALB からの線が消えています。利用者から見ると、その間も AZ-c の EC2 が答え続けているので、何も起きていないように見えます。

1つ設定を確かめておくことがあります。Auto Scaling グループのヘルスチェックの種類を ELB にしておくことです。既定の EC2 のチェックだけだと、「機械は動いているが、アプリが固まっている」状態を見逃し、入れ替えてくれません。

また、倒れた EC2 の中に何かを置いていたら、それは消えます。ステートレスにしてあるので、失うものは何もありません。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 20 / 31
  • 壊れたら ①:EC2 が1台倒れる
  • インターネット
  • CloudFront
  • フォルダ
  • S3
  • クラウド
  • インターネット
  • 守られている
  • ACM
  • ALB が外す → 新しい EC2 が立つ
  • VPC 10.0.0.0/16
  • AZ-a
  • パブリック 10.0.0.0/24
  • アプリ 10.0.10.0/24
  • NG
  • DB 10.0.20.0/24
  • ネットワーク
  • ルーター
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 本体
  • 人々
  • Web
  • Multi-AZ
  • ルーター
  • ALB
  • 利用者
  • IGW
  • 両方の AZ
  • AZ-c
  • パブリック 10.0.1.0/24
  • ルーター
  • アプリ 10.0.11.0/24
  • DB 10.0.21.0/24
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 待機系
  • 場所
  • Route 53
  • Web
  • 同期で写す
  • ひらめき
  • ALB のヘルスチェックが外し、Auto Scaling が新しい1台を立てる。利用者は気づかない。

壊れたら ②:AZ-a が丸ごと止まる

次は、もっと大きな障害です。AZ-a が丸ごと使えなくなったとします。図の上の段が赤くなりました。

部品起きること
ALBAZ-a の EC2 がヘルスチェックに落ちるので、AZ-c の EC2 にだけ振る
Auto Scaling足りない台数を、残っている AZ-c に立てる
RDS待機系が本体に昇格し、エンドポイントが付け替わる。ふつう1〜2分(第13章)
NATAZ-c の EC2 は AZ-c の NAT を使うので、外へ出られる
S3・CloudFront・Route 53もともと複数の拠点で動いているので影響なし

RDS の切り替わりの1〜2分の間は、DB を使う画面がエラーになることがあります。ただし、アプリがつなぎ直す作りになっていれば、その後は自動で戻ります。人が夜中に起きて作業をしなくても、サービスは AZ-c だけで動き続けます。

ここで、NAT を1つにしていたらどうなったかを考えてみてください。NAT が AZ-a にあれば、AZ-c の EC2 は外へ出られず、外部の API を使う機能が止まっていたはずです。1つだけのものが弱点になる、の実例です。

AZ-a が戻ると、RDS は AZ-a に新しい待機系を作り直し、Auto Scaling も台数を2つの AZ に均し直します。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 21 / 31
  • 壊れたら ②:AZ-a が丸ごと止まる
  • インターネット
  • CloudFront
  • フォルダ
  • S3
  • クラウド
  • インターネット
  • 守られている
  • ACM
  • 残った AZ-c だけで動き続ける
  • VPC 10.0.0.0/16
  • AZ-a
  • パブリック 10.0.0.0/24
  • アプリ 10.0.10.0/24
  • DB 10.0.20.0/24
  • ネットワーク
  • ルーター
  • NAT
  • サーバー
  • EC2
  • データベース
  • 止まった
  • 人々
  • Web
  • Multi-AZ
  • ルーター
  • ALB
  • 利用者
  • IGW
  • 両方の AZ
  • AZ-c
  • パブリック 10.0.1.0/24
  • ルーター
  • アプリ 10.0.11.0/24
  • DB 10.0.21.0/24
  • NAT
  • サーバー
  • EC2
  • データベース
  • 新しい本体
  • 場所
  • Route 53
  • Web
  • 同期で写す
  • ひらめき
  • ALB は AZ-c にだけ振り、RDS は待機系が昇格し、NAT も AZ-c のものを使う。

混んだら:Auto Scaling が EC2 を足す

最後は、壊れたのではなく混んだ場合です。フォトログがテレビで紹介され、利用者が急に増えたとします。

部品起きること
Auto ScalingEC2 の平均 CPU が目標(例:50%)を超えたので、台数を増やす(目標追跡、第12章)
ALB新しい EC2 がヘルスチェックに合格しだい、振り分けに加える
CloudFront写真の配信を引き受ける。人気の写真ほどキャッシュヒットが増える
RDS台数が増えたぶん接続も増える。上限に近づいたら RDS Proxy(第13章)

図では、各 AZ に1台ずつ増えて、2台から4台になりました。Auto Scaling は増やすときも2つの AZ に均等に置きます。

混雑が去れば、Auto Scaling は台数を減らします。空いている時間のぶんは払わない。00章で見た「クラウド」の良さが、ここで実際に効いています。

ただし、DB は自動では増えません。3層のうち、いちばん増やしにくいのがデータの層です。そのため、写真は CloudFront に、よく読むものはキャッシュ(第25章)に、重い処理は後回し(第24章)に、と、DB に届く仕事そのものを減らす工夫を後半の章で重ねていきます。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 22 / 31
  • 混んだら:Auto Scaling が EC2 を足す
  • インターネット
  • CloudFront
  • フォルダ
  • S3
  • クラウド
  • インターネット
  • 守られている
  • ACM
  • 目標追跡で EC2 が 2台 → 4台
  • VPC 10.0.0.0/16
  • AZ-a
  • パブリック 10.0.0.0/24
  • アプリ 10.0.10.0/24
  • +1台
  • DB 10.0.20.0/24
  • ネットワーク
  • ルーター
  • NAT
  • サーバー
  • EC2
  • データベース
  • RDS 本体
  • 人々
  • Web
  • Multi-AZ
  • ルーター
  • ALB
  • 利用者
  • IGW
  • 両方の AZ
  • AZ-c
  • パブリック 10.0.1.0/24
  • ルーター
  • アプリ 10.0.11.0/24
  • DB 10.0.21.0/24
  • NAT
  • +1台
  • サーバー
  • EC2
  • データベース
  • RDS 待機系
  • 場所
  • Route 53
  • Web
  • 同期で写す
  • ひらめき
  • CPU が目標を超えると EC2 が増える。写真は CloudFront が受け止めるので、EC2 は増えすぎない。

作る順番 ①:土台(道・扉・データの置き場)から

構成がわかったら、実際に作ります。順番を間違えると、「この部品を作るには、あの部品が先に要る」と行ったり来たりすることになります。

順番作るもの章なぜこの位置か
1請求アラート第1・4章何より先に。消し忘れの事故を防ぐ
2VPC と6つのサブネット第5・6章すべての部品の置き場所
3IGW・NAT・ルートテーブル第6・7章サブネットに道を引く
4SG を3つ(鎖)第8章部品を作るときに付ける扉が要る
5RDS(DB サブネットグループ・Multi-AZ)第13章作るのに時間がかかるので、先に頼んでおく
6S3 バケット第15章アプリの設定に名前が要る
7EC2 用の IAM ロール第3・9章S3 と Session Manager を使う権限

ここまでが土台です。まだ利用者は1人もつなげません。

土台ができたら、1台の EC2 を手で立てて、プライベートサブネットから NAT 経由で更新が取れるか、RDS に接続できるか、S3 に置けるかを確かめておくと、後で問題が起きたときに切り分けが楽になります(確かめたら、その EC2 は消します)。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 23 / 31
  • 作る順番 ①:土台(道・扉・データの置き場)から
  • 請求アラート
  • 第1・4章
  • なぜこの順か
  • VPC と6つのサブネット
  • 第5・6章
  • サブネットが無いと RDS を置けない
  • SG が無いと RDS に扉を付けられない
  • IGW・NAT・ルート表
  • 第6・7章
  • ロールが無いと起動テンプレートを作れない
  • RDS は作るのに時間がかかるので、
  • 先に頼んでおくと待ち時間が減る
  • SG を3つ(鎖)
  • 第8章
  • RDS(Multi-AZ)
  • 第13章
  • S3 バケット
  • 第15章
  • EC2 用の IAM ロール
  • 第3・9章
  • ひらめき
  • 後の部品は前の部品を使う。道 → 扉 → データ → 権限 の順なら、戻らずに作れる。

作る順番 ②:計算と入口、最後に名前と配り口

続きです。

順番作るもの章ポイント
8起動テンプレート第9・12章AMI・タイプ・app-sg・ロール・ユーザーデータ
9ターゲットグループと ALB第11章まず80番の HTTP で動かす。ヘルスチェックの道(例:/health)
10Auto Scaling グループ第12章アプリのサブネット2つ・最小2台・ターゲットグループにつなぐ・ヘルスチェックは ELB
11ACM・443番・80番の転送第14章証明書を ALB に付け、80番は 301 で https へ
12Route 53 のエイリアス第14章example.com → ALB
13CloudFront+OAC第15章us-east-1 の証明書、img.example.com
14壊して確かめるこの章次の「確かめる」の表のとおり

EC2 は手で立てず、Auto Scaling に作らせるのが大事です。手で立てた EC2 は、壊れても誰も入れ替えてくれません。

9〜10で「ALB の長い名前で、HTTP で動く」ことを確かめてから、11〜12で HTTPS と名前を足します。一度に全部を足さず、1段ずつ動くことを確かめると、動かなかったときに、原因が最後に足した部品にあるとすぐわかります。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 24 / 31
  • 作る順番 ②:計算と入口、最後に名前と配り口
  • 起動テンプレート
  • 第9・12章
  • なぜこの順か
  • ターゲットグループと ALB
  • 第11章
  • ALB のターゲットグループに
  • Auto Scaling をつなぐ
  • Auto Scaling グループ
  • 第12章
  • 証明書の発行には DNS が要る
  • http で動くのを確かめてから
  • https と名前を足すと、原因を切り分けやすい
  • ACM・443番・80番の転送
  • 第14章
  • Route 53 のエイリアス
  • 第14章
  • CloudFront+OAC
  • 第15章
  • 壊して確かめる
  • この章
  • ひらめき
  • EC2 は Auto Scaling に作らせ、手で立てない。最後に必ず壊して試す。

同じ構成をコードで書くと(第18章の予告)

ここまでの手順を画面で1つずつやると、慣れても1〜2時間はかかります。しかも、同じものをもう1つ作る(開発用と本番用など)ときに、同じ手順を間違えずに繰り返すのは大変です。

第18章で学ぶ IaC(構成をコードにする)を使うと、この章の構成の骨組みは、図のような数十行で書けます。AWS CDK(TypeScript)の例です。

ts
const vpc = new ec2.Vpc(this, "Vpc", {
  ipAddresses: ec2.IpAddresses.cidr("10.0.0.0/16"),
  maxAzs: 2, natGateways: 2,
  subnetConfiguration: [
    { name: "public", subnetType: ec2.SubnetType.PUBLIC, cidrMask: 24 },
    { name: "app", subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS, cidrMask: 24 },
    { name: "db", subnetType: ec2.SubnetType.PRIVATE_ISOLATED, cidrMask: 24 },
  ],
});
const db = new rds.DatabaseInstance(this, "Db", {
  engine: rds.DatabaseInstanceEngine.postgres({ version: rds.PostgresEngineVersion.VER_16 }),
  vpc, vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_ISOLATED }, multiAz: true,
});
const asg = new autoscaling.AutoScalingGroup(this, "Web", {
  vpc, instanceType: new ec2.InstanceType("t4g.small"),
  machineImage: ec2.MachineImage.latestAmazonLinux2023({ cpuType: ec2.AmazonLinuxCpuType.ARM_64 }),
  minCapacity: 2, maxCapacity: 6,
});
asg.scaleOnCpuUtilization("Cpu", { targetUtilizationPercent: 50 });
db.connections.allowDefaultPortFrom(asg); // db-sg ← app-sg の鎖
const alb = new elbv2.ApplicationLoadBalancer(this, "Alb", { vpc, internetFacing: true });
alb.addListener("Https", { port: 443, certificates: [cert] })
  .addTargets("Web", { port: 80, targets: [asg], healthCheck: { path: "/health" } });
alb.addRedirect(); // 80 → 443

subnetConfiguration の3行が6つのサブネットに、natGateways: 2 が AZ ごとの NAT に、allowDefaultPortFrom が SG の鎖になっています。この章で1つずつ理由を知った部品が、1行ずつに対応しているのがわかるはずです。

まずは画面で作って仕組みを体で覚え、それからコードにする。これがいちばんの近道です。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 25 / 31
  • 同じ構成をコードで書くと(第18章の予告)
  • const vpc = new ec2.Vpc(this, "Vpc", { maxAzs: 2, natGateways: 2, subnetConfiguration: [
  • { name: "public", subnetType: ec2.SubnetType.PUBLIC },
  • { name: "app", subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS },
  • { name: "db", subnetType: ec2.SubnetType.PRIVATE_ISOLATED } ] });
  • const db = new rds.DatabaseInstance(this, "Db", { engine, vpc, multiAz: true,
  • vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_ISOLATED } });
  • const asg = new autoscaling.AutoScalingGroup(this, "Web", { vpc, instanceType, machineImage,
  • minCapacity: 2, maxCapacity: 6 });
  • asg.scaleOnCpuUtilization("Cpu", { targetUtilizationPercent: 50 });
  • db.connections.allowDefaultPortFrom(asg); // db-sg ← app-sg の鎖
  • const alb = new elbv2.ApplicationLoadBalancer(this, "Alb", { vpc, internetFacing: true });
  • alb.addListener("Https", { port: 443, certificates: [cert] })
  • .addTargets("Web", { port: 80, targets: [asg] });
  • alb.addRedirect(); // 80 → 443
  • ひらめき
  • CDK なら、この構成の骨組みが数十行になる。手で作って仕組みを知ってからコードにする。

できたら、壊して確かめる

構成が完成しても、「止まらないはず」「守れているはず」は、試すまでは仮説です。本番の利用者を迎える前に、わざと壊して動きを見ておきます。

やること期待する結果確かめている部品
http://example.com を開くhttps:// に変わり、鍵のマークが出るALB の転送・ACM
EC2 を1台「終了」する表示は続き、数分で新しい1台が増えるALB・Auto Scaling
RDS を「フェイルオーバーあり」で再起動する1〜2分のエラーの後、元どおり動くMulti-AZ・アプリの再接続
S3 の URL を直接開く拒否されるブロックパブリックアクセス・OAC
DB のエンドポイントに手元のパソコンから接続するつながらないプライベートサブネット・SG
負荷をかける(負荷試験の道具で)EC2 が増え、止めると減るスケーリングポリシー
RDS を別の名前で時刻指定の復元をする新しい DB に、指定した時刻のデータがあるバックアップ

特に、RDS のフェイルオーバーでアプリがちゃんとつなぎ直すかは、試さないとわかりません。切り替わった後もエラーが続くなら、アプリの接続の作りを直します。

これらを定期的に試す習慣は、第29章の「復旧の練習」につながります。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 26 / 31
  • できたら、壊して確かめる
  • やること
  • 期待する結果
  • 確かめている部品
  • http://example.com を開く
  • https:// に変わり、鍵のマーク
  • ALB・ACM
  • EC2 を1台「終了」する
  • 表示は続き、数分で1台増える
  • ALB・Auto Scaling
  • RDS を「フェイルオーバーあり」で再起動
  • 1〜2分の後、元どおり動く
  • Multi-AZ・再接続
  • S3 の URL を直接開く
  • 拒否される
  • ブロック・OAC
  • DB のエンドポイントに手元から接続
  • つながらない
  • プライベート・SG
  • 負荷をかける
  • EC2 が増え、止めると減る
  • スケーリング
  • RDS を別名で時刻指定の復元
  • 新しい DB に昨日のデータ
  • バックアップ
  • ひらめき
  • 「止まらないはず」は試すまで仮説。本番の前に、わざと壊して動きを見ておく。

月額の目安の考え方:「ずっと動くもの」と「使った量」に分ける

この構成の料金を見積もるときは、2つに分けて考えます。

種類部品数え方
ずっと動くもの(時間)RDS Multi-AZ、NAT × 2、ALB、EC2 × 2〜、公開 IPv4 アドレス1時間あたりの合計 × 1か月(約730時間)
使った量(GB・回数)CloudFront、S3、データ転送、Route 53 の問い合わせ、NAT と ALB の処理量利用者数から量を見積もる

公開 IPv4 アドレスは、2024年から、使っているかどうかに関係なく1つごとに時間で課金されるようになりました。ALB や NAT も内部で公開 IPv4 アドレスを使うので、その分も数に入ります。

小さなサービスでは、利用者が少ないうちは「使った量」はわずかで、「ずっと動くもの」がほぼすべてになります。その中でも大きくなりやすいのは、Multi-AZ の RDS(2台分)と、AZ ごとの NAT です。

見積もりは、第4章の Pricing Calculator に部品を1つずつ並べて行います。

手順内容
1表の「ずっと動くもの」を、台数と大きさを決めて入れる
21日の利用者数 × 1人が見る写真の枚数 × 1枚の大きさ で、配信の量を出す
3合計を見て、大きいものから順に「本当に要るか」を考える(次の表)

単価はリージョンや時期で変わるので、この本には書きません。必ず料金ページと Pricing Calculator で確かめてください。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 27 / 31
  • 月額の目安の考え方:「ずっと動くもの」と「使った量」に分ける
  • ずっと動くもの(時間)
  • 使った量(GB・回数)
  • RDS Multi-AZ
  • 2台分。多くの場合いちばん大きい
  • CloudFront
  • 配った量と回数
  • NAT × 2
  • 時間+通った量
  • S3
  • 置いた量・回数
  • ALB
  • 時間+処理量
  • データ転送
  • AZ またぎ・外への通信
  • EC2 × 2〜
  • 台数 × 時間
  • Route 53
  • ゾーン(月)+問い合わせ
  • 公開 IPv4
  • 1つごとに時間
  • バックアップ
  • DB の容量を超えた分
  • Pricing Calculator に部品を並べて見積もる。単価は必ず料金ページで(第4章)
  • ひらめき
  • 時間で課金されるものは1時間の合計 × 約730時間。量のものは利用者数から見積もる。

お金の調整つまみ:安くすると、何を手放すか

料金を下げる方法はいくつもありますが、どれも何かを手放します。つまみと、手放すものを並べます。

つまみ安くなる理由手放すもの
NAT を1つにするNAT の時間料金が半分その AZ が止まると、全 EC2 が外へ出られない
S3 用のゲートウェイエンドポイントS3 への通信が NAT を通らないほぼ無し(エンドポイント自体は無料)
RDS を単一 AZ にDB の時間料金がほぼ半分AZ 障害や DB の故障で止まる
EC2 を小さく・最小1台に台数 × 時間が減る1台壊れた瞬間の余裕
Savings Plans・リザーブド1〜3年の約束で割引(第4章)途中で構成を変えにくい
練習は数時間で消す時間課金そのものが止まる何も無い。これが最強

考え方は、要件と照らし合わせることです。

場面回し方
この章の練習全部を作って試し、その日のうちに消す
開発用の環境NAT 1つ、RDS 単一 AZ、EC2 最小1台。夜は止める
本番(フォトログ)この章の構成どおり。S3 のエンドポイントは付ける

「本番は止まらないこと」が要件なら、NAT や Multi-AZ は削ってはいけない部分です。逆に、止まってもよい開発用なら、削っても困りません。同じ構成でも、要件によって正解の設定が違うのです。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 28 / 31
  • お金の調整つまみ:安くすると、何を手放すか
  • つまみ
  • 安くなる理由
  • 手放すもの
  • NAT を1つにする
  • NAT の時間料金が半分
  • その AZ が止まると外へ出られない
  • S3 用のエンドポイント
  • S3 への通信が NAT を通らない
  • ほぼ無し(無料で付けられる)
  • RDS を単一 AZ に
  • DB の時間料金がほぼ半分
  • AZ 障害で DB が止まる
  • EC2 を小さく・最小1台
  • 台数 × 時間が減る
  • 1台壊れた瞬間の余裕
  • Savings Plans など
  • 1〜3年の約束で割引
  • 途中でやめにくい
  • 練習は数時間で消す
  • 時間課金が止まる
  • (何も無い。これが最強)
  • ひらめき
  • つまみを回すと必ず何かを手放す。練習と本番で、回し方を変える。

片付け:作った順の逆から消す

練習で作った構成は、その日のうちに消します。使われているものは消せないので、作った順の逆、つまり外側(入口)から内側(土台)へ消していきます。

順番消すもの補足
1CloudFront・Route 53 のレコードCloudFront は無効化 → 反映を待って削除(第15章)
2Auto Scaling グループ中の EC2 も一緒に終了する。EC2 を先に手で消しても、すぐ作り直されてしまう
3ALB・ターゲットグループ・起動テンプレート
4RDS・S3RDS は削除保護を外す(第13章)。S3 は空にしてから(第15章)
5NAT ゲートウェイ消したら、付いていた Elastic IP を解放する
6VPCサブネット・ルートテーブル・IGW・SG もまとめて消せる
7証明書・ホストゾーン・IAM ロールドメインを残すならホストゾーンは残す(第14章)

図の右は、消し忘れやすいものです。

消し忘れやすいものなぜ忘れるか
Elastic IPNAT を消しても解放されずに残り、時間課金が続く
RDS の手動スナップショットDB を消しても残る
EBS のスナップショット・自作の AMIEC2 を消しても残る(第10章)
CloudWatch のロググループアプリやサービスが書いたログが残る(第17章)

最後に、翌日の Cost Explorer(第4章)で、この構成の料金が止まったかを確かめます。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 29 / 31
  • 片付け:作った順の逆から消す
  • CloudFront・Route 53 のレコード
  • 消し忘れやすいもの
  • Auto Scaling グループ(EC2 も消える)
  • Elastic IP(付いていなくても課金)
  • RDS の手動スナップショット
  • ALB・ターゲットグループ・起動テンプレート
  • EBS のスナップショット・AMI
  • CloudWatch のロググループ
  • 翌日の Cost Explorer で確認
  • RDS(削除保護を外す)・S3(空にする)
  • NAT(と Elastic IP の解放)
  • VPC(サブネット・IGW・SG ごと)
  • 証明書・ホストゾーン・ロール
  • ひらめき
  • 使われているものは消せない。外側から内側へ。最後に Elastic IP の消し忘れを見る。

この形は、ほかの Web サービスにもそのまま使える

この章の構成は、フォトログのためだけのものではありません。3層+ファイル置き場は、多くの Web サービスの出発点になる形です。

作りたいものこの構成から変えるところ
ブログ・CMSアプリを CMS(WordPress など)に。画像は S3+CloudFront のまま
API サーバーHTML の代わりに JSON を返すだけ。形は同じ
社内ツールALB を内部向けにし、外からの入口を無くす。社内とは VPN などでつなぐ
EC ショップ決済は外部のサービスに任せる。注文は RDS、商品画像は S3
小さな個人サービス1つの AZ・NAT なしから始め、育ったらこの形に戻す
もっと大きく監視(第17章)・非同期(第24章)・キャッシュ(第25章)を足す

変えるのは主に中身(アプリ)と数(台数・大きさ・AZ の数)で、形はほとんど変わりません。

自分で構成を考えるときは、この章と同じ手順を踏みます。

手順問い
要件何が起きたら困るか。どこまで止まってよいか
形入口・計算・データ・ファイル置き場はそれぞれ何か
1つだけのもの単一障害点はどこか。2つにする必要はあるか
扉誰が、どこから、どこへ入れればよいか
お金ずっと動くものは何か。つまみを回すと何を手放すか

この問いの型は、第30章の設計演習でもう一度、何度も使います。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 30 / 31
  • この形は、ほかの Web サービスにもそのまま使える
  • 作りたいもの
  • この構成から変えるところ
  • ブログ・CMS
  • アプリを CMS に。画像は S3+CloudFront のまま
  • API サーバー
  • HTML の代わりに JSON を返すだけ。形は同じ
  • 社内ツール
  • ALB を内部向けにし、外からの入口を無くす
  • EC ショップ
  • 決済は外部サービス。注文は RDS、商品画像は S3
  • 小さな個人サービス
  • 練習どおり1AZ・NAT なしから始め、育ったら戻す
  • もっと大きく
  • キャッシュ(第25章)・非同期(第24章)・監視(第17章)を足す
  • ひらめき
  • 3層+ファイル置き場は多くの Web サービスの出発点。変えるのは「中身」と「数」。

まとめ:部品には、それぞれ防いでいる困りごとがある

この章で見たことをまとめます。

項目内容
3層入口(ALB)・計算(EC2)・データ(RDS)に分け、写真は横の S3+CloudFront へ
2つの AZほぼすべての部品を2つの AZ に1つずつ。1つだけのものを作らない
道パブリックは IGW、アプリは同じ AZ の NAT、DB はどこへも出さない
扉SG の鎖。世界 → ALB → EC2 → RDS の順にしか入れない
リクエストの一生DNS → HTTPS で ALB → 元気な EC2 → RDS → HTML → 写真は CloudFront(初回だけ S3)
壊れたらEC2 は入れ替わり、AZ が止まれば残った AZ だけで動き続ける
作る順番道 → 扉 → データ → 権限 → 計算 → 入口 → 名前 → 壊して確かめる
お金ずっと動くもの(時間)と使った量に分ける。つまみを回すと何かを手放す
片付け逆の順に消す。Elastic IP とスナップショットを見落とさない

ここまで来れば、一般的な Web サービスを AWS 上に、理由を説明しながら組めるようになっています。本の中盤のゴールに到達しました。

でも、1つ大きな問題が残っています。この構成が壊れたとき、あなたはどうやってそれを知るのでしょうか。Auto Scaling が EC2 を入れ替えても、RDS が切り替わっても、誰も教えてくれません。利用者からの「つながらない」という声で初めて気づくのでは遅すぎます。

次の第17章では、CloudWatch で構成を見張り、利用者より先に異常に気づく仕組みを作ります。

  • AWS でサービスを作る 16 ― 総まとめ:3層の Web 構成
  • 31 / 31
  • まとめ:部品には、それぞれ防いでいる困りごとがある
  • 3層
  • 入口(ALB)・計算(EC2)・データ(RDS)を分け、写真は S3 へ
  • 2つの AZ
  • 全部の部品を2つの AZ に1つずつ。1つだけのものを作らない
  • 道
  • パブリックは IGW、アプリは NAT、DB はどこへも出さない
  • 扉
  • SG の鎖:世界 → ALB → EC2 → RDS の順にしか入れない
  • リクエストの一生
  • DNS → HTTPS → ALB → EC2 → RDS → 応答 → CloudFront
  • 作る順番
  • 道 → 扉 → データ → 権限 → 計算 → 入口 → 名前
  • お金
  • ずっと動くもの(時間)と使った量に分けて見積もる
  • 片付け
  • 逆の順に消す。Elastic IP とスナップショットを見落とさない
  • ひらめき
  • 次の第17章:この構成が壊れたとき、利用者より先に気づけるか。監視(CloudWatch)を付ける。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]