Skip to main content

第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つだけ!

  1. コンテナイメージ(すでに作ってある前提)📦
  2. そのイメージを置く レジストリ(おすすめはECR)🏪
  3. 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 definitionsCreate new task definition
  • Launch type / compatibility:Fargate
  • Network modeawsvpc(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だけに絞るのが安全)🛡️

“学習用に外から見えるようにする”ために 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

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=devAPP_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を最小で噛ませる回」も作れるけど、いきなりやる?😆