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

AWS 21:コンテナ ― ECR・ECS・Fargate でサーバーの世話を減らす

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

第16章の構成では、EC2 の中の OS・ランタイム・ライブラリを自分でそろえて守る必要がありました。アプリを「動く環境ごと」箱に詰めるコンテナの考え方、イメージと ECR、ECS のクラスター・タスク定義・タスク・サービス、Fargate と EC2 の違い、ネットワークとロール、新しい版の届け方、EKS や ECS Express Mode をいつ選ぶかまでを、フォトログを例に説明します。

第16章の構成:サーバーの「中身」の世話が重い

第16章で、フォトログは「ALB + Auto Scaling の EC2 + RDS Multi-AZ + S3/CloudFront + Route 53」という3層の構成になりました。第17〜20章で監視・IaC・CI/CD・秘密の管理も入り、もう立派な本番の構成です。

それでも、運用を続けていると次のような声が出てきます。

困りごと何が起きているか
OS の修正を台数分あてるEC2(第9章)の OS は自分の責任(責任共有モデル、第0章)。重大な脆弱性が出るたびに、全台に修正をあてて AMI(第10章)を作り直す
手元と本番で版が違う開発者のパソコンは Node.js 22、本番の AMI は少し古い版、のようなずれが起きる
作り直しが遅いライブラリを1つ足すだけでも、AMI を作り、起動テンプレート(第12章)を替え、入れ替える。数十分かかる
「手元では動いたのに」本番にだけ入っていない画像処理の部品がある、などで、デプロイ(第19章)した後に初めて壊れる

図の黄色い面は、EC2 1台の「中身」です。一番下の OS の上に、ランタイム(ランタイム=プログラムを動かすための土台。Node.js や Python など)、ライブラリ(他の人が作った部品のプログラム)、そしてフォトログのアプリが積み重なっています。

第12章の Auto Scaling のおかげで、台数は自動で増減するようになりました。でも、1台1台の中身をそろえるのは、まだ自分たちの手作業です。この章では、この「中身」をまるごと1つの箱にして運ぶ コンテナ と、それを AWS で動かす ECR・ECS・Fargate を学びます。

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

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 1 / 20
  • 第16章の構成:サーバーの「中身」の世話が重い
  • サーバー
  • EC2 の中身
  • NG
  • OS の修正を台数分あてる
  • アプリ(フォトログ)
  • ネットワーク
  • NG
  • Node.js の版が手元と本番で違う
  • ランタイム(Node.js 22)
  • ALB
  • NG
  • AMI の作り直しに毎回数十分
  • ライブラリ(画像処理など)
  • OS(Amazon Linux)
  • NG
  • 「手元では動いたのに」が起きる
  • 第12章の Auto Scaling で台数は自動になった。でも1台1台の「中身」は、まだ手で作っている
  • ひらめき
  • EC2 は借りられても、中の OS・ランタイム・ライブラリをそろえて守るのは自分の仕事のまま。

一言でいうと:動く環境ごと箱に詰めて運ぶ

コンテナは、アプリと、そのアプリが動くのに必要なもの(ランタイム・ライブラリ・設定)を、1つの箱に詰めたものです。

名前の由来は、港で見る輸送用のコンテナです。昔の船荷は、樽・袋・木箱と形がばらばらで、積み替えのたびに人手がかかりました。形のそろった鉄の箱に詰めるようになってから、中身が何であっても、同じ船・同じクレーン・同じトラックで運べるようになりました。

ソフトウェアのコンテナも同じです。

コンテナを使わないときコンテナを使うとき
運ぶものアプリだけ(環境は置き場所で用意)アプリ+動く環境をまとめた箱
手元と本番の違い起きやすい同じ箱なので起きにくい
置き場所に求めること正しい版のランタイムやライブラリが入っていることコンテナを動かせること、だけ

図では、EC2 の中にあった「アプリ」「ランタイム」「ライブラリ」の札が、黄色い箱の中に移りました。OS だけは箱の外、つまり置き場所の側に残っています。この点が次に説明する仮想マシンとの大きな違いです。

箱は、開発者のパソコンでも、テスト環境でも、本番の AWS でも、同じ形のまま動きます。「手元では動いたのに」の多くは、ここで消えます。

コンテナを作って動かす道具として最も広く使われているのが Docker(ドッカー)です。この章でも Docker を例に説明します。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 2 / 20
  • 一言でいうと:動く環境ごと箱に詰めて運ぶ
  • コンテナ(箱)
  • 荷物
  • ノートPC
  • 開発者のパソコン
  • アプリ(フォトログ)
  • ランタイム(Node.js 22)
  • 同じ箱のまま運ぶ
  • 画面
  • テスト環境
  • ライブラリ(画像処理など)
  • クラウド
  • 本番(AWS)
  • OS(置き場所の側)
  • 輸送用のコンテナと同じ。中身が何でも、箱の形が決まっていれば同じ船・同じクレーンで運べる
  • ひらめき
  • コンテナは、アプリと動くのに要るものを1つの箱に詰めたもの。どこに置いても同じように動く。

仮想マシンとの違い:OS を持ち歩かない

EC2 は仮想マシンです。1台の物理サーバーを、仮想化のしくみで何台分かに区切り、それぞれが自分専用の OS をまるごと持って動きます(第9章)。

コンテナは、もう一段軽いしくみです。

仮想マシン(EC2)コンテナ
OS1台ごとにまるごと持つ置き場所の OS の中心部分を共有する
大きさOS 込みで数 GB になりやすいアプリと必要な部品だけ。数十〜数百 MB も多い
起動の速さOS の起動から。数十秒〜数分プログラムを1つ起動するのに近い。数秒ほど
分け方の強さ強い(OS ごと別)仮想マシンよりは弱い。AWS の Fargate はこの点も補っている

図の左は、1台の物理サーバーの上に EC2 が2つ載った形です。どちらにも赤い「OS(まるごと)」があります。右はコンテナで、OS は下に1つだけ。その上に、アプリとライブラリだけの小さな箱が3つ載っています。

コンテナが「軽い」「速い」と言われるのは、この OS を持ち歩かない作りのためです。起動が速いので、混んできたときに素早く数を増やせますし、新しい版への入れ替えも短い時間で済みます。

ただし、コンテナもどこかのサーバーの上で動いていることは変わりません。そのサーバー(載せ台)を自分で用意するか、AWS に任せるかが、後で出てくる Fargate の話になります。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 3 / 20
  • 仮想マシンとの違い:OS を持ち歩かない
  • 仮想マシン(EC2)
  • コンテナ
  • 1台ごとに OS を丸ごと持つ
  • OS は置き場所のものを共有する
  • アプリ
  • アプリ
  • ライブラリ
  • ライブラリ
  • アプリ
  • アプリ
  • アプリ
  • OS(まるごと)
  • OS(まるごと)
  • ライブラリ
  • ライブラリ
  • ライブラリ
  • EC2 1
  • EC2 2
  • コンテナを動かすしくみ
  • 仮想化のしくみ(AWS が用意)
  • OS(1つを共有)
  • 物理サーバー
  • サーバー
  • ひらめき
  • EC2(仮想マシン)は OS ごと動かす。コンテナは OS を共有するので軽く、数秒で起動する。

イメージとコンテナ:型と、型から作った実物

コンテナを作るには、まず イメージを作ります。イメージは、コンテナの型です。たい焼きの型と、焼き上がったたい焼きの関係に似ています。

言葉意味たとえ
Dockerfileイメージの作り方を書いた手順書レシピ
イメージ手順どおりに作った、読み取り専用の型たい焼きの型
コンテナイメージから起動した、動いている実物焼けたたい焼き

図の Dockerfile を1行ずつ読んでみます。

FROM node:22-slim        土台にする公式のイメージ(Node.js 22 入り)
WORKDIR /app             作業場所を /app にする
COPY package*.json ./    使う部品の一覧をコピー
RUN npm ci --omit=dev    部品を入れる
COPY . .                 アプリのプログラムをコピー
EXPOSE 3000              3000番のポート(第8章)で待つ
CMD ["node", "server.js"] 起動したら最初に実行する命令

docker build でこの手順書からイメージを作り、docker run でイメージからコンテナを起動します。1つのイメージから、何個でもまったく同じコンテナを起動できます。

大事な約束は、イメージの中身は後から変えないことです。直したいときは Dockerfile かアプリを直して、新しいイメージを作り直します。そうすると「版 1.4.0 のイメージ」と言えば中身が1つに決まり、何が動いているのか・どこへ戻せばいいのかが明確になります。EC2 に SSH で入って手で直していたころとの大きな違いです。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 4 / 20
  • イメージとコンテナ:型と、型から作った実物
  • Dockerfile(作り方の手順書)
  • FROM node:22-slim
  • 荷物
  • コンテナ 1
  • WORKDIR /app
  • COPY package*.json ./
  • 荷物
  • RUN npm ci --omit=dev
  • COPY . .
  • build
  • イメージ
  • 荷物
  • コンテナ 2
  • EXPOSE 3000
  • run
  • 読み取り専用の型
  • CMD ["node", "server.js"]
  • 荷物
  • コンテナ 3
  • イメージは変えない。直すときは Dockerfile を直して、新しいイメージを作り直す
  • だから「どの版のイメージが動いているか」で、中身が一意に決まる
  • ひらめき
  • Dockerfile から「イメージ」(型)を作り、イメージから何個でも同じ「コンテナ」を起動する。

ECR:イメージをしまっておく AWS の倉庫

作ったイメージは、動かす場所から取りに行ける置き場に置く必要があります。この置き場をコンテナレジストリと呼び、AWS では ECR(Elastic Container Registry)が受け持ちます。

言葉意味
リポジトリイメージの種類ごとの棚。フォトログなら photolog-web
タグ同じ棚の中で版を見分ける名札。1.4.0 など
push手元や CI(第19章)からイメージを ECR に上げること
pullECS などの動かす側が ECR からイメージを取ってくること

図の流れは、左の開発者や CI が push し、右の動かす側が pull します。ECR のリポジトリの中には、1.4.0・1.3.2・1.3.1 と過去の版も並んでいます。新しい版に問題があれば、1つ前のタグを指定し直すだけで戻せます。

ECR には次のような特徴があります。

特徴内容
非公開が基本誰が push・pull できるかは IAM(第3章)で決める。GitHub Actions からは OIDC(第19章)で鍵を置かずに push できる
脆弱性の検査push したときに、イメージの中の既知の脆弱性を検査できる。詳しく検査する方式は Amazon Inspector を使う
ライフサイクルルール「最新の10個だけ残す」のように、古いイメージを自動で消せる

タグは必ず版で付けましょう。latest(最新)という名前だけで運ぶと、「いま本番で動いている latest はいつの latest か」が誰にもわからなくなります。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 5 / 20
  • ECR:イメージをしまっておく AWS の倉庫
  • ECR リポジトリ photolog-web
  • 荷物
  • photolog-web : 1.4.0
  • ノートPC
  • 開発者 / CI
  • 荷物
  • 動かす側
  • 第19章の自動化
  • push
  • photolog-web : 1.3.2
  • pull
  • ECS のタスク
  • photolog-web : 1.3.1
  • push したときに脆弱性を検査できる
  • ECR(Elastic Container Registry)は非公開の置き場。誰が push・pull できるかは IAM で決める(第3章)
  • タグは「1.4.0」のように版を付ける。latest だけで運ぶと、何が動いているかわからなくなる
  • ひらめき
  • 作ったイメージは ECR に push(上げる)し、動かす側が pull(取ってくる)。版はタグで見分ける。

ECS の4つの言葉:クラスター・タスク定義・タスク・サービス

イメージを置いただけでは、まだ何も動きません。コンテナを起動し、落ちたら起動し直し、ALB に登録する係が要ります。この「コンテナの世話係」をオーケストレーターと呼び、AWS の標準の世話係が ECS(Elastic Container Service)です。

ECS を使うには、4つの言葉を覚えれば十分です。

言葉意味第16章の EC2 構成でいうと
クラスタータスクやサービスをまとめて管理する箱構成全体の区切り
タスク定義どのイメージを、どれだけの CPU・メモリで、どのポートで動かすかの設計図起動テンプレート
タスクタスク定義から起動した、動いているコンテナ(1つ以上)のまとまりEC2 インスタンス1台
サービス「タスクをいつも N 個動かす」を守り、ALB に登録する係Auto Scaling グループ

図の右の黒い板がタスク定義です。イメージ photolog-web:1.4.0、CPU 0.5 vCPU、メモリ 1 GB、ポート 3000、ログは CloudWatch Logs へ、と書いてあります。この設計図から作られた実物が、左の「タスク 1」「タスク 2」です。

タスク定義には版番号が付きます。イメージのタグを 1.4.0 から 1.5.0 に変えると、タスク定義も「photolog-web の7番目」から「8番目」へと新しい版になります。何をいつ変えたかが、版の並びでそのまま残ります。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 6 / 20
  • ECS の4つの言葉:クラスター・タスク定義・タスク・サービス
  • クラスター(photolog):まとめて管理する箱
  • タスク定義(設計図)
  • サービス(web):タスクをいつも2つ動かす
  • family: photolog-web
  • image: …/photolog-web:1.4.0
  • cpu: 0.5 vCPU
  • memory: 1 GB
  • 荷物
  • タスク 1
  • 荷物
  • タスク 2
  • この型で作る
  • port: 3000
  • web : 1.4.0
  • web : 1.4.0
  • logs: CloudWatch Logs
  • ひらめき
  • ECS はコンテナを動かし続ける係。「何を」はタスク定義、「いくつ」はサービスが受け持つ。

サービスが数を保つ:止まったタスクは自動で入れ替わる

サービスの一番大事な仕事は、望む数を保つことです。

図では、サービスに「タスクをいつも2つ動かす」と書いてあります。タスク 1 がメモリ不足などで止まると(札1)、サービスはすぐに気づき、同じタスク定義からタスク 3 を起動します(札2)。

順番ECS がすること
1タスクが止まる、または ALB のヘルスチェック(第11章)に落ちたことに気づく
2同じタスク定義から新しいタスクを起動する
3新しいタスクを ALB のターゲットグループに登録する
4古いタスクを片付ける

人は何もしません。書いたのは「2つ」という望む数だけです。

これは第12章の Auto Scaling グループの「壊れたら入れ替わる」と同じ考え方です。そして、同じ理由でタスクはステートレスにしておく必要があります(第12章)。ログインの状態や、利用者が上げた写真をタスクの中に置いていると、入れ替わった瞬間に消えます。写真は S3(第15章)、データは RDS(第13章)に置くという第16章の作りは、コンテナになってもそのまま活きます。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 7 / 20
  • サービスが数を保つ:止まったタスクは自動で入れ替わる
  • クラスター(photolog):まとめて管理する箱
  • 1
  • ヘルスチェックに落ちた
  • サービス(web):タスクをいつも2つ動かす
  • 2
  • 新しいタスクを起動
  • 荷物
  • 止まった
  • 荷物
  • タスク 2
  • 荷物
  • タスク 3
  • 3
  • ALB に登録し直す
  • メモリ不足
  • web : 1.4.0
  • web : 1.4.0
  • 4
  • 古いタスクを片付ける
  • 人は何もしない。望む数を書くだけ
  • ひらめき
  • タスクが落ちても、サービスが「2つ動いている」状態に戻す。第12章の Auto Scaling と同じ考え方。

どこで動かすか:EC2・Fargate・Managed Instances

コンテナも、どこかのサーバーの上で動きます。ECS では、その載せ台を3通りから選べます。

選び方載せ台の世話料金の単位向くとき
EC2 で動かす自分で EC2 を並べ、OS 更新や台数も自分で見る載せ台の EC2 の時間載せ台を細かく調整して安くしたい
FargateAWS がすべて持つ。サーバーは見えないタスクの vCPU とメモリの量 × 動いた秒数ほとんどの Web・API・バッチ。まずはここから
ECS Managed InstancesEC2 を使うが、起動・OS の修正・台数を AWS が面倒を見る載せ台の EC2 の時間 + 管理の料金GPU など、特定のインスタンスタイプが要る

Fargate(ファーゲート)は、「サーバーを見ないでコンテナを動かす」方式です。タスク定義に「0.5 vCPU・1 GB」と書くと、AWS がその大きさの置き場を用意してタスクを載せます。OS の修正も、載せ台の台数も、あなたは考えません。

ECS Managed Instances は 2025年に加わった方式で、EC2 の豊富な種類を使いつつ、世話は AWS に任せます。

どれを選んでも、タスク定義・タスク・サービスという考え方は同じです。変わるのは「載せ台の世話を誰がするか」だけです。この本では、特別な理由がなければ Fargate で説明を進めます。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 8 / 20
  • どこで動かすか:EC2・Fargate・Managed Instances
  • サーバー
  • EC2 で動かす
  • クラウド
  • Fargate
  • 設定
  • Managed Instances
  • EC2 を自分で並べる
  • サーバーを見ない
  • EC2 を AWS が世話する
  • 台数・OS 更新:あなた
  • 台数・OS:AWS
  • 台数・OS 更新:AWS
  • 料金:EC2 の時間
  • 料金:タスクの vCPU・メモリ
  • 料金:EC2 + 管理の料金
  • 細かく選べる・安くしやすい
  • いちばん手軽
  • GPU など型を選べる
  • どれを選んでも、タスク定義・サービスの考え方は同じ。変わるのは「コンテナを載せる台」の世話を誰がするか
  • ひらめき
  • コンテナを載せるサーバーを自分で並べるか、AWS に任せるか。迷ったら Fargate から始める。

Fargate のタスクは、1つずつ自分の IP を持つ

ここから、第16章の VPC の舞台にタスクを置いてみます。

Fargate では、タスク1つごとにネットワークの差し口(ENI=Elastic Network Interface。サーバーの LAN ケーブルの差し口のようなもの)が付き、プライベート IP アドレス(第5章)が1つ割り当てられます。このやり方を awsvpc ネットワークモードと呼び、Fargate ではこれしか選べません。

決まりごと意味
タスクごとに IP図のタスクは 10.0.11.25 と 10.0.12.40 を持つ。同じポート 3000 で待っていてもぶつからない
タスクごとに SG赤い盾のように、セキュリティグループ(第8章)をタスクに直接付けられる
ALB のターゲットは「IP」ターゲットグループ(第11章)を作るとき、種類を「インスタンス」ではなく「IP」にする
置き場所タスクはプライベートサブネット(第6章)に置き、2つの AZ(第2章)に分ける

セキュリティグループの書き方は、EC2 のときとまったく同じです。

SG入ってきてよいもの
ALB の SGインターネットから 443 番(HTTPS)
タスクの SGALB の SG から 3000 番だけ
RDS の SGタスクの SG から 5432 番(PostgreSQL の場合)だけ

「SG から SG を許す」(第8章)書き方にしておけば、タスクの IP が入れ替わるたびに変わっても、設定を直す必要はありません。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 9 / 20
  • Fargate のタスクは、1つずつ自分の IP を持つ
  • VPC(2つの AZ)
  • プライベートサブネット
  • 荷物
  • タスク(AZ-a)
  • 盾
  • 人々
  • ネットワーク
  • 10.0.11.25
  • データベース
  • 利用者
  • ALB
  • RDS
  • 荷物
  • タスク(AZ-c)
  • 盾
  • 10.0.12.40
  • タスク1つ1つにネットワークの差し口(ENI)が付き、SG(第8章)もタスクごとに付けられる
  • RDS の SG は「タスクの SG からだけ許す」。EC2 のときと同じ書き方でよい
  • ひらめき
  • タスクごとに IP とセキュリティグループが付く。ALB のターゲットは「IP」で登録する。

混んできたらタスクを増やす:サービスの自動スケーリング

サービスの「望む数」は、自動で増減させることもできます。考え方は第12章の Auto Scaling とまったく同じです。

方式書き方の例
目標追跡「タスクの CPU の平均を 60% に保つ」。一番よく使う
ALB のリクエスト数「タスク1つあたりのリクエスト数を一定に保つ」
予定「毎朝8時に最小を4にする」

図では、CloudWatch(第17章)が CPU 85% を見つけ(札1)、ECS がタスク 3・4 を足しています(札2)。足されたタスクは、ALB に自動で登録されます。

EC2 の Auto Scaling と比べて違うのは、速さです。EC2 は OS の起動から始まるので、使えるようになるまで分単位かかることがあります。Fargate のタスクは、イメージを取ってきてプログラムを起動するだけなので、多くの場合もっと短い時間で使えるようになります(イメージが大きいと遅くなるので、イメージは小さく保ちます)。

最小の数は2以上にしておきましょう。1つだと、そのタスクが入れ替わる間は誰も応答できません。2つ以上にして、2つの AZ に分けておくのが第16章以来の基本です。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 10 / 20
  • 混んできたらタスクを増やす:サービスの自動スケーリング
  • VPC(2つの AZ)
  • プライベートサブネット
  • 荷物
  • タスク 1
  • 荷物
  • タスク 3
  • 人々
  • ネットワーク
  • データベース
  • 利用者
  • ALB
  • RDS
  • 荷物
  • タスク 2
  • 荷物
  • タスク 4
  • 折れ線
  • CPU 85%
  • 1 CloudWatch(第17章)が CPU の高さを見る → 2 ECS がタスクを足す → ALB に自動で登録される
  • 減らすときも同じ。最小の数(例:2)を決めておけば、夜中でも1つの AZ に偏らない
  • ひらめき
  • 目標追跡(第12章)で「CPU 60% を保つ」と書けば、タスクの数が自動で増減する。起動は EC2 より速い。

2つのロール:ECS が準備に使う鍵と、アプリが使う鍵

タスクには、IAM ロール(第3章)を2種類付けます。名前が似ていて混同しやすいので、表で分けておきます。

ロール使うのは誰か何をするか
タスク実行ロールECS(準備係)ECR からイメージを pull する、ログを CloudWatch Logs に書く、Secrets Manager(第20章)から秘密を取ってタスクに渡す
タスクロールタスクの中のアプリフォトログのアプリが S3 に写真を置く、キュー(第24章)にメッセージを送る

図の左の赤い枠がタスク実行ロール、右がタスクロールです。左は「タスクを起動するための準備」、右は「起動したアプリが仕事をするため」と覚えると区別できます。

どちらのロールも、アプリのプログラムからは一時的な鍵が自動で渡されるので、アクセスキーを作ってイメージや環境変数に入れる必要はありません(第3章)。第20章で学んだように、データベースのパスワードは Secrets Manager に置き、タスク定義の secrets の欄で「この秘密を環境変数 DB_PASSWORD として渡して」と書くだけです。

最小権限(第3章)も同じです。タスクロールには「photolog の写真用バケットに置く」だけを許し、他のバケットは触れないようにします。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 11 / 20
  • 2つのロール:ECS が準備に使う鍵と、アプリが使う鍵
  • タスク実行ロール(ECS 用)
  • タスクロール(アプリ用)
  • 荷物
  • ECR から pull
  • 荷物
  • フォルダ
  • S3 に写真を置く
  • 書類
  • ログを書く
  • タスク
  • フォトログの web
  • メール
  • キューへ(第24章)
  • 鍵
  • 秘密を渡す(第20章)
  • どちらもアクセスキーは作らない(第3章)
  • ひらめき
  • 実行ロールは ECS の準備(pull・ログ・秘密)用。タスクロールはアプリ(S3 など)用。

新しい版の届け方:ローリングとブルー/グリーン

新しい版をどう届けるか(第19章)も、ECS が引き受けてくれます。

ローリング(既定)は、図の左のように少しずつ入れ替えるやり方です。

段状態
12つとも 1.3
21.4 のタスクを起動し、ヘルスチェックに通ったら、1.3 を1つ止める
3残りも同じように入れ替えて、2つとも 1.4

一度に何割まで増やしてよいか・減らしてよいかは、サービスの設定(最小ヘルシー率・最大率)で決めます。

ブルー/グリーンは、図の右のように、今の版(ブルー)を動かしたまま新しい版(グリーン)を丸ごと並べて起動し、確かめてから ALB の送り先を切り替えるやり方です。問題があれば、送り先を戻すだけで一瞬で元に戻せます。ECS は 2025年から、このブルー/グリーンをサービスの設定だけで使えるようになり、少しずつ流す量を増やすカナリアや段階的(リニア)な切り替えも選べます。

どちらの場合も、デプロイサーキットブレーカーを有効にしておくと、新しいタスクが起動に失敗し続けたときに ECS が自動で前の版に戻します。CloudWatch のアラーム(第17章)と組み合わせて戻すこともできます。

第19章の GitHub Actions からは、「イメージを build → ECR に push → タスク定義のイメージのタグを替える → サービスを更新」という流れを自動で行います。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 12 / 20
  • 新しい版の届け方:ローリングとブルー/グリーン
  • ローリング(既定)
  • ブルー/グリーン
  • 1
  • web 1.3
  • web 1.3
  • 荷物
  • 今の版 1.3
  • しばらく残す
  • ネットワーク
  • 2
  • web 1.4
  • web 1.3
  • ALB
  • 荷物
  • 新しい版 1.4
  • 3
  • web 1.4
  • web 1.4
  • 確かめてから切替
  • 1つずつ入れ替える。追加の台は少なくて済む
  • 問題があれば、ALB を今の版へ戻すだけ
  • ひらめき
  • 既定は少しずつ入れ替えるローリング。すぐ戻したいならブルー/グリーン。どちらも ECS が面倒を見る。

作り方:5つの手順と、イメージを上げるコマンド

コンソールで作る場合の流れは、左の5つの手順です。

手順することポイント
1ECR にリポジトリを作る名前は photolog-web。タグを上書きできない設定(イミュータブル)にすると、同じ版の上書き事故を防げる
2イメージを build して push右のコマンド。本番では CI(第19章)が行う
3タスク定義を書く起動方式は Fargate、CPU・メモリ、イメージ、ポート、ログ、2つのロール、秘密
4クラスターを作る名前を付けるだけ。Fargate なら中身は空でよい
5サービスを作る望む数、プライベートサブネット、SG、ALB とターゲットグループ(種類は IP)

右のコマンドの $REGISTRY は、123456789012.dkr.ecr.ap-northeast-1.amazonaws.com のような ECR の住所です。

実務では、第18章の IaC で書きます。AWS CDK には「ALB 付きの Fargate サービス」をまとめて作る部品があり、次のように短く書けます。

ts
new ecsPatterns.ApplicationLoadBalancedFargateService(this, "Web", {
  cluster,
  cpu: 512,            // 0.5 vCPU
  memoryLimitMiB: 1024,
  desiredCount: 2,
  taskImageOptions: {
    image: ecs.ContainerImage.fromEcrRepository(repo, "1.4.0"),
    containerPort: 3000,
  },
});

この1つで、ALB・ターゲットグループ・サービス・タスク定義・ロググループまでが作られます。中で何が作られるのかは、ここまでの説明で全部読めるはずです。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 13 / 20
  • 作り方:5つの手順と、イメージを上げるコマンド
  • チェック
  • ECR にリポジトリを作る
  • 手順2:イメージを上げる(CloudShell や CI で)
  • # 1回だけ:ECR にログイン
  • チェック
  • イメージを build して push
  • aws ecr get-login-password | docker login \
  • --username AWS --password-stdin $REGISTRY
  • チェック
  • タスク定義を書く
  • # 作って、版のタグを付けて、上げる
  • docker build -t $REGISTRY/photolog-web:1.4.0 .
  • docker push $REGISTRY/photolog-web:1.4.0
  • チェック
  • クラスターを作る
  • $REGISTRY は「アカウント番号.dkr.ecr.リージョン.amazonaws.com」
  • チェック
  • サービスを作る(ALB・SG)
  • ひらめき
  • ECR → イメージ → タスク定義 → クラスター → サービスの順。実務は IaC(第18章)で。

フォトログでは:EC2 の Auto Scaling を ECS サービスに置き換える

フォトログの構成で変わるのは、「計算する」部品だけです。

部品第16章この章
入口ALBALB(ターゲットの種類を IP に)
Web の処理Auto Scaling の EC2ECS サービス(Fargate)の web タスク
データRDS Multi-AZ・S3変わらない
配信・ドメインCloudFront・Route 53変わらない
中身の作り方AMI とユーザーデータDockerfile とイメージ
版の表し方AMI の IDイメージのタグ(1.4.0)

図の黄色い囲みが ECS サービスです。web タスクを2つ以上、常に動かします。

右の「縮小ジョブ」は、利用者が上げた大きな写真を小さな一覧用の写真にする処理です。Web のタスクの中でやると、その間ほかの利用者を待たせてしまいます。そこで、別のタスク定義にしておき、必要なときだけ起動する使い方ができます。ECS は、サービスとして動かし続けるだけでなく、1回だけタスクを起動して、終わったら止めることもできるのです。

ただ、「写真が上がったときだけ何かを動かす」なら、もっと向いた部品があります。それが次の第22章の Lambda と、第24章のキューです。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 14 / 20
  • フォトログでは:EC2 の Auto Scaling を ECS サービスに置き換える
  • VPC(第16章の構成のまま)
  • ECS サービス(Fargate)
  • 荷物
  • web タスク
  • 人々
  • ネットワーク
  • 縮小ジョブ
  • データベース
  • 写真
  • 利用者
  • ALB
  • 必要なときだけ
  • RDS
  • 荷物
  • web タスク
  • フォルダ
  • S3
  • web を2つ以上のタスクで常に動かす。写真の縮小のような重い処理は、別のタスク定義にして必要なときだけ起動する
  • ユーザーデータのスクリプトも AMI の作り直しも不要になり、「版」はイメージのタグ1つで表せる
  • ひらめき
  • 入口(ALB)・データ(RDS・S3)・配信(CloudFront)はそのまま。「計算する」部品だけが入れ替わる。

EC2 の構成と比べる:いつコンテナを選ぶか

第16章の EC2 構成と、この章の ECS on Fargate を並べます。

EC2 + Auto ScalingECS on Fargate
中身の作り方AMI・ユーザーデータDockerfile → イメージ
OS の更新自分であてるAWS が面倒を見る
起動の速さ分単位になりやすい数十秒ほどが多い
新しい版の配り方AMI と起動テンプレートを替えて入れ替えタグを替えてサービスを更新
料金の単位インスタンスの時間タスクの vCPU・メモリ × 秒
向く場面OS を細かく触る、特殊なソフト、常に高い負荷で安さを詰めるWeb・API・バッチの大半

判断の問いにすると、次のようになります。

問いはい なら
OS の設定やカーネルを細かく触る必要があるかEC2
チームが Dockerfile を書けるか、書く気があるかコンテナ
夜中もずっと、一定の量が来るかどちらでもよい。料金は大きく変わらない
載せ台の世話に人を割けるか割けないなら Fargate

新しく Web アプリを AWS に出すなら、まずは ECS on Fargate を候補にするのが今の定番です。EC2 の知識(VPC・SG・ALB・Auto Scaling)はそのまま使えるので、ここまでの章は無駄になりません。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 15 / 20
  • EC2 の構成と比べる:いつコンテナを選ぶか
  • EC2 + Auto Scaling(第16章)
  • ECS on Fargate
  • 中身の作り方
  • AMI・ユーザーデータ
  • Dockerfile → イメージ
  • OS の更新
  • 自分であてる
  • AWS が面倒を見る
  • 起動の速さ
  • 分単位
  • 数十秒ほど
  • 新しい版の配り方
  • AMI を替えて入れ替え
  • タグを替えてサービス更新
  • 料金の単位
  • インスタンスの時間
  • タスクの vCPU・メモリ×秒
  • 向く場面
  • OS を細かく触る・GPU・常時高負荷
  • Web・API・バッチの大半
  • ひらめき
  • 作るものがはっきりした Web アプリなら、Fargate の ECS がまず候補。EC2 が向く場面も残る。

EKS・ECS Express Mode・App Runner はいつ選ぶか

コンテナを動かす AWS のサービスは、ECS だけではありません。

サービスひとことで選ぶとき
EKSKubernetes(世界で広く使われているコンテナの世話係の標準)を AWS で動かすすでに Kubernetes を使っている、他のクラウドや社内と仕組みをそろえたい
ECS Express Modeイメージを渡すだけで、ALB・HTTPS・自動スケーリングまで一度に作る ECS の使い方小さく素早く Web・API を出したい。中身はふつうの ECS なので、後から細かく直せる
App Runnerイメージやソースから Web サービスを出すサービス2026年4月30日で新しい利用者の受付を終了。既存の利用者は使い続けられるが新機能の予定はなく、AWS は ECS Express Mode への移行を勧めている

EKS は強力ですが、Kubernetes 自体に覚えることがたくさんあり、クラスター1つごとに時間単位の料金もかかります。「Kubernetes を使う理由」がはっきりあるときに選びましょう。理由がなければ ECS で十分です。

ECS Express Mode は、ECS の上で「よくある Web の形」をまとめて作ってくれる入口です。https://サービス名.ecs.リージョン.on.aws のような URL が発行され、証明書(第14章)の更新も任せられます。作られたものは ALB・サービス・タスク定義といった、この章で学んだ部品そのものです。

古い記事では「手軽さなら App Runner」と紹介されていることがありますが、上のとおり状況が変わっています。記事の日付に注意しましょう。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 16 / 20
  • EKS・ECS Express Mode・App Runner はいつ選ぶか
  • 設定
  • ロケット
  • 時計
  • EKS
  • ECS Express Mode
  • App Runner
  • Kubernetes を AWS で動かす
  • イメージを渡すだけで公開
  • 新規の受付を終了
  • OK
  • すでに Kubernetes を使っている
  • OK
  • ALB・HTTPS・自動増減まで一度に作る
  • NG
  • 2026年4月末で新規の受付を終了
  • OK
  • 他のクラウドと仕組みをそろえたい
  • OK
  • 中身はふつうの ECS
  • NG
  • 新機能の予定なし
  • NG
  • 覚えることが多い・料金も別
  • OK
  • 小さく始めたい Web・API
  • OK
  • 移る先は ECS Express Mode
  • ひらめき
  • Kubernetes を使う理由があるなら EKS。とにかく手軽に出したいなら ECS Express Mode。

お金:何に対して払うのか

ECS そのものには料金がかかりません。 払うのは、タスクを動かす載せ台と、周りの部品の分です。

何に課金の単位
Fargateタスクに割り当てた vCPU とメモリの量 × 動いた時間(秒単位、最低1分)。一時的なディスクは一定量までは追加料金なし
EC2 / Managed Instances載せ台の EC2 の時間(Managed Instances は管理の料金も)
ECRイメージの保存量(GB・月)と、リージョンの外へ出す通信
ALB第11章と同じ(時間と処理量)
NAT ゲートウェイプライベートサブネットから NAT 経由で pull すると、その通信量にも課金(第7章)。VPC エンドポイントで減らせる
パブリック IPv4タスクにパブリック IP を付けると、その時間の分(第9章)
CloudWatch Logs書いたログの量と保存期間(第17章)
EKS を選んだ場合クラスター1つごとの時間料金が載せ台とは別にかかる

Fargate の料金は「割り当てた量」に対してかかります。タスクが暇でも、0.5 vCPU・1 GB を確保している間は払い続けます。夜中に誰も使っていなくても、最小の数のタスクは動き続けていることを覚えておいてください。

安くする方法としては、Arm の CPU(Graviton)を選ぶ、止まっても困らない処理に Fargate Spot(空いている能力を割安で使う代わりに、途中で止められることがある)を使う、Savings Plans(第4章)を使う、などがあります。単価はリージョンで違うので、Pricing Calculator(第4章)で試算し、料金ページで確認しましょう。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 17 / 20
  • お金:何に対して払うのか
  • Fargate
  • タスクの vCPU とメモリ × 秒(最低1分)
  • EC2 / Managed Instances
  • 載せ台の EC2 の時間(MI は管理の料金も)
  • ECR
  • イメージの保存量(GB・月)
  • ALB・NAT
  • 第11・7章と同じ。pull の通信に NAT を使うと膨らむ
  • CloudWatch Logs
  • 書いたログの量と保存期間(第17章)
  • EKS を選んだ場合
  • クラスター1つごとの時間料金が別にかかる
  • 単価はリージョンで違う。Pricing Calculator(第4章)で試算し、公式の料金表で確認する
  • 夜も最低の数が動き続ける。使われない時間にも払う点は EC2 と同じ
  • ひらめき
  • ECS そのものは無料。払うのは、タスクの大きさ×時間と、周りの部品(ALB・ログ・通信)の分。

よくある落とし穴

コンテナを始めたばかりのころに、よく起きる事故をまとめます。

落とし穴何が起きるか防ぎ方
ログをコンテナの中のファイルに書くタスクが入れ替わると、ログも一緒に消える標準出力に出し、awslogs の設定で CloudWatch Logs に送る
パスワードをイメージに入れるECR を読める人全員に漏れる。古い版のイメージにも残り続けるSecrets Manager から渡す(第20章)
latest タグだけで運ぶ何が動いているか・どこへ戻せばいいかがわからない版のタグを付け、タグの上書きを禁止する
プライベートサブネットから pull できないタスクが起動せず、止まっては起動し直すを繰り返すNAT ゲートウェイか、ECR・S3・CloudWatch Logs の VPC エンドポイントを用意する(第7章)
手元が Arm の Mac、本番が x86本番でプログラムが起動しないbuild の形式(--platform)とタスク定義の CPU の種類をそろえる
メモリを小さくしすぎる黙って強制終了され、入れ替わりを繰り返すECS の画面で「止まった理由」を見る。CloudWatch でメモリの使い方を見張る
イメージが大きすぎるpull が遅く、増やしたいときに間に合わない小さな土台のイメージを使い、要らないものを入れない

どれも、第16〜20章で学んだこと(ステートレス・秘密の管理・NAT・監視)と地続きの事故です。コンテナになっても、構成を考える原則は変わりません。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 18 / 20
  • よくある落とし穴
  • NG
  • ログをコンテナ内のファイルに書く → タスクと一緒に消える。標準出力に出して CloudWatch Logs へ
  • NG
  • パスワードをイメージに入れる → ECR を読める人に漏れる。Secrets Manager から渡す(第20章)
  • NG
  • latest タグだけで運ぶ → 何が動いているか・どこへ戻すかがわからない
  • NG
  • プライベートサブネットから pull できない → NAT か VPC エンドポイントが要る(第7章)
  • NG
  • 手元が Arm の Mac、本番が x86 → 起動しない。タスク定義と build の形式をそろえる
  • NG
  • メモリを小さくしすぎる → 黙って落ちて入れ替わり続ける。止まった理由を見る
  • ひらめき
  • ログはファイルに書かない・秘密はイメージに入れない・版は latest にしない。この3つで大半を防げる。

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

練習で作ったものは、次の順で消します。

順番すること注意
1サービスの望む数を 0 にして、サービスを削除数が残っていると、消しても作り直そうとする
2クラスターを削除中にサービスやタスクが残っていると消せない
3ALB とターゲットグループを削除ALB は置いておくだけで時間の料金がかかる
4ECR のリポジトリを削除中のイメージも一緒に消す設定を選ぶ
5CloudWatch Logs のロググループを削除保存期間を「無期限」のままにしていると積もり続ける

ほかに、NAT ゲートウェイや VPC エンドポイントを作った場合は、それも忘れずに消します(第7章)。タスク定義は、登録を解除しておけば料金はかかりません。

普段の運用では、ECR のライフサイクルルールを必ず設定しておきましょう。CI が毎日イメージを push していると、古いイメージの保存料が少しずつ積もります。「最新の10個だけ残す」「タグの無いイメージは1日で消す」のように書いておけば、自動で片付きます。

第18章の IaC で作っていれば、スタックを消すだけで全部が消えます。手作業で作ったものほど、消し忘れが出ます。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 19 / 20
  • 片付け:作った順の逆に消す
  • 荷物
  • サービスの数を 0 → 削除
  • 更新
  • ECR のライフサイクルルール
  • 設定
  • クラスターを削除
  • 「最新の10個だけ残す」のように書いておけば、
  • ネットワーク
  • ALB とターゲットグループを削除
  • 古いイメージの保存料が積もらない
  • フォルダ
  • ECR のリポジトリを削除
  • IaC(第18章)なら、スタックを消すだけ
  • 書類
  • ロググループを削除
  • ひらめき
  • サービスの数を0にしてから消す。ECR の古いイメージはライフサイクルルールで自動削除する。

まとめ:「中身」を箱にして、置き場の世話を任せる

この章で学んだことをまとめます。

項目内容
コンテナアプリと動く環境を1つの箱に。どこでも同じように動き、OS を持たないので軽く速い
イメージ・ECRDockerfile から型を作り、版のタグを付けて ECR にしまう。中身は変えず、作り直す
タスク定義・タスク設計図と、そこから起動した実物
サービス望む数を保ち、ALB に登録し、少しずつ(またはブルー/グリーンで)入れ替える
Fargate載せ台のサーバーを見なくてよい起動方式。タスクごとに IP と SG が付く
ロールタスク実行ロールは ECS の準備用、タスクロールはアプリ用
いつ選ぶかWeb・API の大半は ECS on Fargate。Kubernetes が要るなら EKS、手軽さなら ECS Express Mode

コンテナで「中身」の世話は大きく減りました。でも、まだ残っている困りごとがあります。

フォトログの利用者は、昼と夜で数が大きく違います。夜中の3時には、ほとんど誰も写真を上げません。それでも、最小2つのタスクは動き続け、その分の料金がかかっています。「写真が上がったときに縮小する」のような、たまにしか起きない仕事のために、いつも何かを動かしておくのももったいない話です。

使われたときだけ動いて、使われた分だけ払うことはできないでしょうか。次の第22章では、サーバーを持たずにプログラムを動かす Lambda と API Gateway を学びます。

  • AWS でサービスを作る 21 ― コンテナ:ECR・ECS・Fargate
  • 20 / 20
  • まとめ:「中身」を箱にして、置き場の世話を任せる
  • コンテナ
  • アプリと動く環境を1つの箱に。どこでも同じに動く
  • イメージ・ECR
  • 型を作り、版のタグを付けて ECR にしまう
  • タスク定義・タスク
  • 設計図と、そこから起動した実物
  • サービス
  • 望む数を保ち、ALB に登録し、少しずつ入れ替える
  • Fargate
  • 載せ台のサーバーを見なくてよい起動方式
  • いつ選ぶか
  • Web・API の大半。Kubernetes が要るなら EKS
  • 月
  • 次の困りごと:夜中の誰もいない時間にも、タスクの料金を払っている
  • ひらめき
  • でも、夜中に誰も使っていなくてもタスクは動き続ける。「使われた分だけ」にできないか? → 第22章。

0 件のコメント

読み込み中…

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