「Fargateのエフェメラルストレージって、結局なにを保存しているの?」——ECS on Fargateを使い始めると一度はぶつかる疑問です。この記事を読むと、エフェメラルストレージにDockerイメージがどう格納されるのか、そして「書き込み可能なデータ」とは具体的に何を指すのかが、コンテナの内部構造のレベルでスッキリ理解できます。
この記事のゴール
本記事では、次の3点をクリアにします。
- AWS ECS on Fargate のエフェメラルストレージが何に使われるのか
- ECRからプルしたDockerイメージが、そのストレージ上にどう置かれるのか
- 「書き込み可能なデータ」の正体——読み取り専用レイヤーと書き込み可能レイヤーの関係
エフェメラルストレージとは
「エフェメラル(ephemeral)」は「一時的な・つかの間の」という意味の英単語です。その名のとおり、タスク(コンテナ群の実行単位)が動いている間だけ存在し、タスクが停止すると中身ごと消える、使い捨ての一時ストレージを指します。
AWS ECS on Fargate(サーバー管理不要でコンテナを動かすAWSのサービス)では、プラットフォームバージョン1.4.0以降の各タスクに、デフォルトで20GiBのエフェメラルストレージが割り当てられます。必要に応じてタスク定義の ephemeralStorage パラメータで、最大200GiBまで拡張できます。
そしてここが本題です。ECRからプルされたDockerイメージは、このエフェメラルストレージ上に保存されます。AWS公式ドキュメントでも、プルされた圧縮状態のイメージと、展開(解凍)後のイメージの両方がエフェメラルストレージに置かれると明記されています。つまり「イメージを一時的に置く場所」という直感は正しいのですが、もう一歩踏み込むと、より正確な姿が見えてきます。
構成図:1つのストレージにレイヤーが同居する
重要なのは、読み取り専用のイメージレイヤーも、実行中に書き込まれるデータも、同じ20GiBのプール上に同居しているという点です。

たとえばDockerイメージが2GiBを使う場合、書き込み可能なデータ用に残るのは約18GiBです。1つのタスク内で複数コンテナを動かす場合は、この残り容量を各コンテナで分け合うことになります。だからこそ大きなイメージを使うと、その分だけ実際に使える作業領域が削られていきます。
「書き込み可能なデータ」の正体
大前提として、ビルドされたDockerイメージのレイヤーは読み取り専用(イミュータブル=変更不可)です。イメージそのものに直接書き込むことはできません。
コンテナを起動すると、コンテナランタイムがその読み取り専用レイヤーの上に、薄い「書き込み可能レイヤー(writable container layer)」を1枚重ねます。実行中のプロセスが行う書き込みは、すべてこの最上位のレイヤーに記録されます。これが「書き込み可能なデータ」の正体です。
この書き込み可能レイヤーには、大きく2種類のデータが入ります。
| 種類 | 具体例 |
|---|---|
| 実行中に新しく作られるファイル(主目的) | アプリが生成するログファイル、一時ファイル、キャッシュ、ダウンロードデータ、計算中間ファイルなど |
| イメージ由来のファイルを書き換えたときの差分 | コピーオンライト(CoW)により、変更対象ファイルのコピーが書き込み可能レイヤーに作られたもの |
イメージ内の既存ファイルを編集すると、コピーオンライト(Copy-on-Write/CoW)という仕組みが働きます。読み取り専用レイヤーにある元ファイルはそのまま残し、変更対象のファイルだけを書き込み可能レイヤーへコピーしてから、そのコピーに変更を加えます。結果としてイメージ本体は一切変わらず、変更分だけが上のレイヤーに溜まっていきます。
【用語】コピーオンライト(Copy-on-Write/CoW)
「書き込むときに初めてコピーする」方式のこと。読み取り専用レイヤーにある元ファイルはそのまま残し、変更対象のファイルだけを書き込み可能レイヤーへコピーしてから変更を加えます。元のイメージは不変なので、同じイメージから起動した別のコンテナは影響を受けません。
つまり「イメージに書き込んでいる」ように見えても、実態は「変更されたファイルのコピーが別レイヤーに作られている」だけです。これがコンテナを軽量かつ高速に保つ仕組みです。
順序を間違えないために——レイヤーとファイルの関係
よくある誤解は「生成したファイルが書き込み可能レイヤーを作る」という理解です。正しくは順序が逆で、次のようになります。
- コンテナが起動した時点で、ランタイムが空の書き込み可能レイヤーを先に用意する
- その後、コンテナが動く中で生成されるログや一時ファイルが、その用意済みのレイヤーに溜まっていく
「ファイルが先、レイヤーが後」ではなく、「レイヤーが先に用意され、そこにファイルが書き込まれる」というイメージです。
【運用上の注意】
書き込み可能レイヤーは、コンテナ(タスク)が停止すると破棄されます。ログを残したい場合は CloudWatch Logs などの外部に送る、永続データは Amazon EFS(永続ストレージ)をマウントするといった設計が必要です。「コンテナに書いたファイルが再起動で消えた」というトラブルの多くは、この性質を知らないことが原因です。
例え話でイメージをつかむ——「マスター設計図」と「トレーシングペーパー」
Dockerイメージを、建物のマスター設計図だと考えてみてください。これは完成済みで、誰も直接書き込んではいけない読み取り専用の原本です。
コンテナを起動するとは、設計士(コンテナ)がこの設計図の上に透明なトレーシングペーパーを1枚重ねるようなもの。設計士が書き込む変更やメモ(=ログや一時ファイル)は、すべてこのトレーシングペーパー側に書かれます。原本の設計図はまったく汚れません。
何人もの設計士が同じ原本を共有しても、各自が自分のトレーシングペーパーを持つので互いに干渉しません。そして作業が終われば(コンテナが停止すれば)、トレーシングペーパーは捨てられ、原本だけが残ります。これがコンテナの「使い捨て」の正体です。
まとめ
- Fargateのエフェメラルストレージは、タスク実行中だけ存在する使い捨ての一時ストレージ(デフォルト20GiB、最大200GiB)
- ECRからプルしたDockerイメージ(圧縮・展開後の両方)は、このストレージ上に格納される
- イメージレイヤーは読み取り専用。コンテナ起動時に、その上へ書き込み可能レイヤーが1枚重ねられる
- ログや一時ファイルは書き込み可能レイヤーに溜まる。イメージ由来ファイルの編集はコピーオンライトで差分だけが記録され、イメージ本体は不変
- 書き込み可能レイヤーはタスク停止で消えるため、永続化が必要ならEFSやCloudWatch Logsを併用する
「イメージの一時置き場」という入口の理解から一歩進んで、読み取り専用レイヤー+書き込み可能レイヤーという二層構造まで押さえておくと、Fargateの容量設計やトラブルシュートがぐっとやりやすくなります。
参考リソース
- Fargate task ephemeral storage for Amazon ECS(AWS公式ドキュメント)——エフェメラルストレージの容量や、イメージがストレージ上に保存される仕様の一次情報
- AWS Fargate FAQs(AWS公式)——ストレージの拡張上限やEFS併用など、Fargate全般のよくある質問
- Storage drivers(Docker公式ドキュメント)——レイヤー構造・書き込み可能レイヤー・コピーオンライトの仕組みを公式が解説


コメント