第29章:Amazon ECS + Fargate:管理が増える代わりに自由度UP 🧰🔥
この章は「Cloud Runで“最短デプロイ”はできた!」の次に、**“もう少し中身が見える世界”**を体験して、デプロイ理解をガチッと固定する回だよ😆✨ ECS/Fargateは、ざっくり言うと **「コンテナ実行の運営係が増える」**かわりに、ネットワーク/権限/デプロイ方法を細かく調整できる感じ!💪
今日のゴール(到達点)🏁✨
- ECSの基本用語(クラスター / タスク定義 / サービス / タスク)が腹落ちする🧠
- Fargateでコンテナを“最小構成で1個”起動して、ログを見れる👀
- 「Cloud Runと何が違うの?」を一言で説明できるようになる🎤
1) まず用語を“たとえ話”でつかむ 🍙📦
ECSは「コンテナ運用の仕組み」をいくつかの部品に分けてるよ👇
- クラスター(Cluster): “実行する場所のグループ”🏟️(箱の集合)
- タスク定義(Task Definition): “このコンテナをこう起動してね”というレシピ📖(イメージ、CPU/メモリ、環境変数、ポート、ログ先…)
- タスク(Task): レシピから作られた**実行中のインスタンス(実体)**🍳(1回起動したコンテナ)
- サービス(Service): “タスクを常にN個動かしてね”っていう自動維持係🤖(落ちたら起動し直す/ローリング更新…)
Fargateはここに登場する「実行方法」で、EC2(仮想マシン)を自分で面倒みなくていいモードだよ☁️✨ (ECSのコンソールは “/ecs/v2” の画面が基本になってるよ)(AWS ドキュメント)
2) Cloud Runとの“違い”を1枚で理解 🧠🗺️
- Cloud Run: “コンテナを出したい人”に優しい。設定が少ない。スケールも簡単。
- ECS + Fargate: “コンテナ運用をちゃんと設計したい人”向け。ネットワーク/VPC/権限/IAM/ロードバランサなど、触れるつまみが増える。
つまり、ECSは 「自由度が増える=覚えることも増える」 ってこと!😇
3) ハンズオン方針:最短ルートで「動いた!」を作る 🚀🔥
この章は、最初からALB(ロードバランサ)まで全部やると疲れるので、まずは👇でいくよ!
✅ 最小のECS/Fargateサービスを作る ✅ パブリックIPでアクセス(学習用) ✅ CloudWatch Logsでログを見る
⚠️ 現実の本番では、普通は「ALBの後ろに置く」とか「Private subnet + NAT」とかやるよ。 でもこの章は“体験して理解固定”が目的なので、最短でいくよ😉
4) 事前準備(超ミニマム)🧩🔑
必要なのはこの3つだけ!
- コンテナイメージ(すでに作ってある前提)📦
- そのイメージを置く レジストリ(おすすめはECR)🏪
- AWSでECSを触れる権限(IAMユーザー/ロール)🪪
ここまでの章で「ビルド&Push」やってるなら、その成果を使えばOK! もし「ECRにまだPushしてない」なら、まずECRに置くのが一番スムーズだよ🙂
5) ハンズオン:ECS/Fargateで“最小サービス”を作る 🧪🐳
ここからは AWSコンソール中心でいくよ(初心者が迷子になりにくい)🧭✨
Step 1:ECSの画面へ行く 🖥️➡️
- AWSコンソールで ECS(Elastic Container Service) を開く
- 右上で リージョンを選ぶ(最初は1つに固定が安全!)🌏
Step 2:クラスターを作る(最小)🏟️
ECSはまず“箱(クラスター)”を作るよ!
- 左メニュー Clusters
- Create cluster
- Cluster name を入れて作成
この流れはECS公式の基本手順そのものだよ🧱(AWS ドキュメント)
Step 3:タスク定義を作る(= レシピ)📖✨
次に、コンテナ起動レシピを作るよ!
- Task definitions → Create new task definition
- Launch type / compatibility:Fargate
- Network mode:
awsvpc(Fargateの基本)
ここで超重要ポイント👇
awsvpc の場合、ポートは containerPort だけ指定でOK(hostPortは無視される)(AWS ドキュメント)
つまり、初心者が悩みがちな「hostPortどうする?」は、気にしなくていい😆✨
コンテナ設定で入れる代表例👇
- Image:
<あなたのイメージURI> - Port mappings:
containerPort = 3000(例) - Environment variables:必要ならここで(DB URLなど)🧩
- Logging:CloudWatch Logs(awslogs)📜
Step 4:サービスを作る(タスクを維持する係)🤖
次に “サービス” を作るよ!
- Clusters → さっき作ったクラスターを開く
- Create(Service)
- Launch type:Fargate
- Task definition:さっき作ったもの
- Desired tasks:
1
ネットワーク設定(最初はここだけ注意!⚠️)
-
VPC:選ぶ(デフォルトでもOKなこと多い)
-
Subnets:Public subnet を選ぶ(学習用)
-
Auto-assign public IP:ON(学習用)
-
Security group:新規作成 or 既存
- Inbound に
TCP 3000を許可(まずは自分のIPだけに絞るのが安全)🛡️
- Inbound に
“学習用に外から見えるようにする”ために public IP を付けてるよ。 本番はもう少し丁寧に設計するのが普通😉
Step 5:起動確認(タスクがRUNNINGになるまで)✅
- サービス詳細 → Tasks を見る
RUNNINGになったらOK!
もし STOPPED になったら、次の章「つまずきTop」で即回収できるよ😄
Step 6:アクセスして「動いた!」を確認 🌍🎉
タスク詳細から Public IP(またはENIのPublic IPv4)を見つけて、
http://<Public-IP>:3000/
でアクセス!(例は3000だけど自分のポートに合わせてね🔌)
6) ログを見る(ECSやってる感が一気に出る)📜👀
ECSの良さは「運用の目が増える」こと!
- サービス or タスクの画面から Logs へ
- CloudWatch Logs に飛んで、アプリのログが見える✨
「stdout/stderrに出したログが集まる」感覚が持てればOKだよ👍
7) つまずきTop3 😵💫➡️✅(ここ超重要)
① タスクがすぐSTOPPEDになる 🛑
原因あるある👇
- アプリが即終了してる(起動コマンドミス / 例外で落ちてる)
- PORTが違う(3000のつもりが別ポート)
- 環境変数不足(DB接続文字列がない等)
✅ 対策
- タスク詳細の Stopped reason を見る
- CloudWatch Logs を見る(だいたいここに答えがある)📜
② ECRからPullできない(イメージ取得失敗)📦💥
原因あるある👇
- Execution role が足りない(ECR pull権限など)
- レジストリURLやタグが間違い
✅ 対策
- タスク定義の「実行ロール(execution role)」を確認
- イメージURIをコピペで再確認
③ 外からアクセスできない(タイムアウト)🌐🫥
原因あるある👇
- Public IPがOFF
- Security groupでポートが閉じてる
- Subnetがpublicじゃない(ルートが外へ出てない)
✅ 対策
- Serviceのネットワーク設定を見直す
- SGのInboundに
TCP:あなたのポートを追加 - まずは“自分のIPだけ許可”で試す🛡️
8) もう一段だけ理解を深める:awsvpcの直感 🧠🔌
awsvpc って何がうれしいの?
→ タスク(=コンテナの塊)が “独立したネットワークの住人” になる感じ!
- タスクごとにENI(ネットワークIF)が付く
- だから containerPortがそのまま使える
hostPortみたいな“ホスト都合の謎”を気にしなくてよくなる(Fargateだと特に)(AWS ドキュメント)
9) (任意)ECS Exec:コンテナに入って調査する 🕵️♂️🧰
「本番で詰まったとき、コンテナの中を見たい!」ってなるよね。 そのときに便利なのが ECS Exec!
- サービス/タスクで execute command を有効化
- CLIなら
aws ecs execute-command ...で入れる🖥️ 例の雰囲気はこんな感じだよ👇(クラスメソッド発「やってみた」系技術メディア | DevelopersIO)
ECS Execを使うには、CLIやSSMプラグイン、ロール設定など追加の準備が必要になるので、今は「そういう武器がある」だけ覚えればOK!🔫✨ (設定項目の整理は日本語記事も参考になるよ)(NRIネットコムBlog)
10) AI(Copilot/Codex)に投げる“勝ちプロンプト”集 🤖💬
用語の理解
- 「ECSの cluster / task definition / service / task を、飲食店のたとえで説明して🍜」
タスク定義のレビュー
- 「このタスク定義、初心者が事故りやすい点を5つ指摘して。特にネットワークとログ📜」
つまずき診断
- 「ECSタスクがSTOPPEDになった。CloudWatchログがこれ。原因候補と切り分け手順を出して🔍」
11) ミニ課題(やると理解が固定される)📝✨
課題A:同じイメージで環境変数だけ変える🧩
APP_ENV=devとAPP_ENV=prodを切り替えてログに出す → 「イメージは同じ、設定だけ違う」が体験できる👍
課題B:Desired tasks を 1→2 にしてみる👯
- タスクが2つになって、ログが増えるのを観察👀 → “サービスが維持する”感覚が手に入る!
12) 後片付け(課金事故を防ぐやつ)🧹💰
ECSは放置すると地味に課金が続くことがあるから、終わったら消そう!
- Service を削除(Desired tasksが0になってタスクが止まる)
- Cluster を削除
- 使った CloudWatch Logs(ロググループ)も必要なら削除
- ECRに置いたイメージも、要らなければ整理📦
まとめ:この章で得た“強い型”💪🧠
- ECSは 「レシピ(タスク定義)」→「実体(タスク)」→「維持係(サービス)」→「箱(クラスター)」 の世界🏟️🍳🤖
- Fargateは **“サーバ運用(EC2管理)を省略”**できる実行方式☁️
awsvpcでは containerPortだけ意識すればOKが超ラクポイント(AWS ドキュメント)
次は、ここで作ったECS構成を「もうちょい本番寄り」にする方向(例:ALBの後ろに置く、Blue/Green、デプロイ戦略…)にも進めるよ🔥 「この章の続きとして、ALBを最小で噛ませる回」も作れるけど、いきなりやる?😆