コンテナを動かすために、サーバーを用意したり、OS を更新したりする仕事も任せたい。 AWS Fargate は、その実行基盤を AWS が管理するサービスです。 利用者はアプリの設定を渡しますが、実行先のホストへ SSH で入ることはできません。
この章では、自分で EC2 を管理する構成と比べ、Fargate で変わる運用や制約を見ます。 その下で使われる軽量な VM と、ほかのサービスや AI 向けの実行環境での活用にも触れます。
GOAL この章のゴール
- EC2 と Fargate で、利用者に残る仕事の違いを説明できる
- Fargate の実行環境と、使うときの制約が分かる
- 軽量な VM が利用される場面を挙げられる
ECS で動かす場所を選ぶ
2 章目で、ECS をコントロールプレーンとして位置づけました。 タスクが実際に走るデータプレーンには 2 種類あり、ECS ではこの選び方を 起動タイプきどうタイプECS でタスクをどこで動かすかの選び方。利用者の EC2 で動かす EC2 起動タイプと、AWS 管理の VM で動かす Fargate 起動タイプがある (task definition では launch type と呼ぶ)。用語集で見る と呼びます。
EC2 起動タイプでは、タスクは利用者の EC2 で動きます。 その EC2 には ecs-agent と Docker が入っていて、ECS のスケジューラがそこに task を置きます。 スケールや自己復旧の単位も EC2 の流儀 (Auto Scaling Group、capacity provider) です。
Fargate 起動タイプでは、タスクごとに AWS が小さな VM を起動し、その中でコンテナが動きます (この VM の正体は後の節で説明します)。 利用者は task に必要な CPU とメモリを書くだけで、どのホストで動くかを意識しません。 ECS のドキュメントによると、各 task は専用の分離境界を持ち、カーネル、CPU、メモリ、ENI を他の task と共有しません。
ECS のドキュメントは、クラスタの容量として EC2、Fargate、そして AWS が利用者のアカウントの EC2 の調達、パッチ、スケールまで運用する Amazon ECS Managed Instances の 3 つを挙げ、Fargate は変動する負荷や始めたてのときに、EC2 は GPU や特殊なハードウェア、privileged 権限、カスタム AMI が要るときに向くとしています。 この章では、前の 2 つを比べます。
EC2 タイプで手元に残る仕事
EC2 起動タイプでも、「どのホストでどのコンテナを何個起動するか」は ECS が決めてくれます。 それでも、ホストそのものは利用者の手元に残ります。
ホストが残るということは、その上のプロセスも残るということです。 ecs-agent と Docker はホスト上の普通の Linux プロセスなので、これらがエラーで死んだときの対応 (必要なら SSH で入っての手作業) は利用者が行います。 OS のカーネル更新、セキュリティパッチ、Docker のバージョン、ECS 最適化 AMI の更新も利用者の仕事です。
もう一つ残るのが、2 段階のスケーリングです。 task の数は ECS のサービスで決めますが、task を置くための EC2 の台数は別に設計します。 task の cpu / memory の組み合わせに対して無駄の少ないインスタンスタイプを選ぶのも利用者です。
Fargate が解決すること
ECS のドキュメントは Fargate を、「VM のクラスタを用意し、設定し、スケールさせる必要が無くなり、サーバーの種類を選ぶことも、いつクラスタをスケールさせるかを決めることも、クラスタへの詰め込みを最適化することも要らなくなる」技術だと説明しています。 前の節で残った仕事に対応づけると、次の 3 つが消えます。
- インスタンスの選定:task に「必要な CPU とメモリ」を書くだけで、ホストは Fargate が選ぶ。
- スケーリング:VM のスケーリングは AWS が全部やるので、利用者が管理するのはコンテナ (task) の数だけになる。
- インスタンスの管理:コンテナランタイムのバージョン、Linux のバージョン、ホストのセキュリティパッチが全部管理不要になる。
パッチの届け方にも仕組みがあります。 Fargate の実行環境は、カーネルとコンテナランタイムの組み合わせをプラットフォームバージョンとして区切って配ります。 セキュリティ上の問題が見つかると、AWS はパッチ済みの新しい revision を作り、古い revision で動く task に廃止 (retirement) の予定を通知して止めます。 新しく起動する task は、常に最新の revision で動きます。
Fargate の下にある Firecracker
Fargate が task ごとに起動する VM は、microVMマイクロブイエム起動が速く、メモリの消費が小さい軽量な VM。専用のゲストカーネルを持つので、VM の隔離の強さを保てる。用語集で見る と呼ばれる種類のものです。 それを起動しているのが FirecrackerファイアクラッカーAWS が OSS として公開した、KVM を使って microVM を起動する VMM (Rust 製)。用語集で見る で、AWS は Lambda と Fargate のために開発したと説明しています。
Firecracker は、AWS が 2018 年 12 月に Apache 2.0 で公開した、Rust で書かれた VMM (Virtual Machine Monitor) です。 VMM は、VM に見せる CPU、メモリ、ネットワークカードやディスクを用意して VM を起動するプログラムで、QEMU がその例です。 Firecracker は Linux の KVM を呼び出して VM を起動する普通のプロセスで、VM 1 つにつき 1 プロセスが起動し、REST API で設定と起動を受け付けます。
Firecracker は、サーバーレスとコンテナの用途に絞って設計されていて、何でも載せられる汎用 VM を目指していません。 AWS の論文 (NSDI 2020) と設計文書によると、その方針は次の特徴に表れています。
- VM に見せる仮想デバイスを 5 つに絞る (virtio-net、virtio-block、virtio-vsock、シリアルコンソール、VM を止めるためだけの最小限のキーボードコントローラー)。BIOS も PCI も無く、任意のカーネルは起動できない。QEMU が 40 種類以上のデバイスを持つのに対して、攻撃面が小さい。
- 起動が速く、VM あたりのメモリのオーバーヘッドが小さい。アプリのコードが動き始めるまで 125 ms 未満、オーバーヘッドは VM あたり 5 MiB 未満、1 ホストで毎秒 150 台まで起動できる。
- Firecracker 自身が API スレッド、VMM スレッド、vCPU スレッドに分かれ、seccomp で使える syscall を絞る。
- jailer という付属プログラムが、VMM 自体を chroot、pid と network の namespace、cgroup、seccomp (許可する syscall は 24 個) で囲い、VM の隔離が破られたときの第 2 の防御線になる。
- ネットワークの通信の絞り込みは Firecracker が行わないので、ホスト側で行う。
Firecracker の中では普通の Linux ゲストカーネルが動くので、その上に containerd と runc を置けば、コンテナはそのまま動きます。
firecracker-containerd は、containerd のランタイムを runc から Firecracker に差し替え、Pod や task を microVM の中で起動するための AWS のプロジェクトです。
Part 3 の分離レベルの話で出てきた Kata Containers も、VMM の選択肢として Firecracker を使えます。
AWS の外でも使われる Firecracker
Firecracker は AWS の内部だけで使える技術ではありません。 Fly.io の Machines は Firecracker の microVM としてアプリケーションを動かし、API から作成や起動を操作できます。 GMO Flatt Security も、AI エージェント Takumi がコードや攻撃の検証を実行するために、Firecracker を使う自社基盤 Sunaba を開発しています。
共通するのは、利用者ごとに分けた実行環境を必要なときに用意する用途です。 Firecracker が担当するのは VM の実行であり、API、VM の配置、ディスク、通信経路、認証、破棄までを含むサービスは各社が組み立てます。 Lambda のリクエストごとの実行と、エージェントがファイルを編集し続ける作業環境では、保存すべき状態や環境の寿命が違います。 同じ VMM を採用していても、サービスの設計まで同じになるわけではありません。
EKS on Fargate
Fargate は EKS でも使えます。
仕組みは Kubernetes の拡張点を素直に使っています。
EKS のドキュメントによると、EKS のコントロールプレーンには、既定の scheduler と並んで動く Fargate 用の scheduler と、いくつかの mutating / validating admission controller が居ます。
Pod が作られると、admission controller が Fargate profile (namespace と label の条件) に一致するかを判定し、一致する Pod を更新して Fargate 用の scheduler が引き取ります。
scheduler は Fargate に VM を用意し、その中の kubelet が、profile に書いた Pod execution role の権限でクラスタに Node として登録し、Pod を起動します。
kubectl get nodes には fargate-ip-10-0-2-31.ap-northeast-1.compute.internal のような Node が、Pod 1 つにつき 1 つ現れます。
Pod ごとに専用カーネルの VM になるので、構造上できないことがそのまま制約になります。
| 観点 | EC2 ノード (managed node group) | Fargate |
|---|---|---|
| Pod とカーネル | 同じノードの Pod はカーネルを共有 | Pod ごとに専用カーネル (VM) |
| DaemonSet | 使える | 使えない (ノードが Pod 専用なので意味がない。sidecar にする) |
| privileged / hostNetwork / hostPort | 使える | 使えない |
| CNI | VPC CNI、または Cilium など別の CNI | VPC CNI 固定 |
| ストレージ | EBS / EFS / FSx | EFS のみ (静的プロビジョニング) |
| LB のターゲット | instance / ip | ip のみ |
| GPU / Arm / Windows | 使える | 使えない |
| IAM for Pod | Pod Identity / IRSA | IRSA のみ |
| ノードへの SSH | できる | できない (ホスト OS が無い) |
| パッチ | AMI の更新は利用者 | AWS が Pod を退避して実施 |
このほか、Fargate の Pod は private subnet にしか置けず、EC2 のインスタンスメタデータ (IMDS) も使えません。
IAM の資格情報は IRSA で渡し、リージョンや AZ が必要なら Pod の spec に書き込みます。
Fargate profile に一致しない Pod は Pending のままになります。
Job の Pod は完了後も残り、残っているあいだは課金されるので、ttlSecondsAfterFinished で自動削除します。
AWS のドキュメントは、Pod ごとの VM をコンテナからの脱出に対する多層防御と位置づけつつ、アプリを隔てる最も安全な方法は別のクラスタで動かすことだとも書いています。
ECS と EKS の選び方
EKS と ECS はコントロールプレーンの選択肢で、Fargate はデータプレーンの選択肢です。 比べる対象が違うので、EKS か ECS かを決めた後に、Fargate にするかどうかを独立に決められます。
EKS と ECS の違いは、Kubernetes の API を使うかどうかに尽きます。 Helm chart で配布されている OSS を動かしたい、GitOps や Operator を使いたい、複数クラウドで同じ YAML を使いたい、なら Kubernetes の API が要るので EKS です。 AWS の中で閉じていて task definition で足りるなら ECS で、CloudFormation や CodeDeploy のような AWS の他サービスとの連携は ECS のほうが素直です。
ふりかえり
QFargate で DaemonSet が使えない理由として正しいものは?
Fargate では Pod 1 つにつき Node が 1 つ生えます。DaemonSet は「各ノードに 1 つ」を保証する仕組みなので、ノードが Pod 専用なら sidecar で同じことができます。構造上の帰結です。
QFirecracker が QEMU と違う設計方針は?
Firecracker は KVM を使う VMM です。QEMU のように何でも載せられることを目指さず、virtio-net / block / vsock などごく少数のデバイスに絞り、速い起動と小さなオーバーヘッドを実現しています。
QECS と Fargate の関係として正しいものは?
ECS (と EKS) はコントロールプレーンで、Fargate は task / Pod を置く先 (データプレーン) の選択肢です。EKS でも Fargate profile で使えます。
参考
-
Architect your solution for Amazon ECS (Amazon ECS Developer Guide)
-
Architect for AWS Fargate for Amazon ECS (Amazon ECS Developer Guide)
-
Amazon ECS task definition differences for Fargate (Amazon ECS Developer Guide)
-
Fargate task ephemeral storage for Amazon ECS (Amazon ECS Developer Guide)
-
Monitor Amazon ECS containers with ECS Exec (Amazon ECS Developer Guide)
-
AWS Fargate launches platform version 1.4 (AWS Containers Blog, 2020)
-
Firecracker: Lightweight Virtualization for Serverless Applications (NSDI 2020)
-
Simplify compute management with AWS Fargate (Amazon EKS User Guide)
-
Define which Pods use AWS Fargate when launched (Amazon EKS User Guide)
-
Fly.io「Fly Machines」: https://fly.io/machines/
-
GMO Flatt Security「ソフトウェアエンジニア」(Sunaba): https://recruit.flatt.tech/job/newgrads_software_engineer
-
CODE BLUE 2025、GMO Flatt Security「AIエージェントSaaSを安全に提供するための自社サンドボックス基盤」: https://archive.codeblue.jp/2025/program/time-table/day1-t2-opentalks-04/