Claude Code で Terraform を動かしたら EC2 のディスクが枯渇した話
AI コーディングツール「Claude Code」に Terraform(テラフォーム)のファイルを作らせていたら、作業中のサーバー(EC2)のディスク(保存領域)が突然「枯渇(こかつ=空き容量がゼロに)」し、接続していた画面ごと切れてしまった――。私は過去に2回、この現象に遭いました。
結論から言うと、原因は .terraform(ドットテラフォーム)というフォルダが、知らないうちにどんどん大きくなっていたことでした。そして対策は以下の3つです。
この記事で紹介する3つの対策
① 無駄なコピーを止める設定を入れる(同じデータを何度も保存しないようにする)
② フックを導入しディスクが枯渇する前に Claude Code を自動で止める仕組みを入れる
③ 放っておくとまた溜まるDocker とキャッシュを削除する
用語メモ
フック(hook)とは、「何かをする前に、決めておいた別の処理を差し込む」仕組みのことです。今回は「コマンドを実行する前に、ディスクの空きをチェックする関所(せきしょ)」を置くイメージです。空きが少なければ、その場で通行止めにします。
この記事は、サーバーやコマンド操作にまだ慣れていない方でも読めるように、専門用語やコマンドの意味を1つずつ説明しながら進めます。必要容量を確保しているのに「なぜかディスクが枯渇して困った」という同じ悩みに対して何かしらの解決策のヒントになれば嬉しいです。
前提となる環境
なぜ自分のPCではなく EC2 を使うのか
自分のPC上で Linux(WSL という機能)を動かすと、その中身はC ドライブの中の仮想ディスクとして保存されます。これは一度大きくなると自動では小さくならないため、PC本体の空き容量をどんどん奪っていきます。それを避けるため、Claude Code を動かす場所は EC2(Amazon Linux 2023)にして、保存領域を EBS 側に分けています。
今回の環境は以下の通りです。
- 作業マシン:EC2(Amazon Linux 2023)。ディスク(EBS)は最初 30GiB(約30GB)
- つなぎ方:自分のPCの VSCode(エディタ)に「Remote-SSH」という拡張機能を入れ、SSH で EC2 に接続
- 使うツール:Claude Code、Terraform、Docker など
- やっていたこと:Claude Code に指示を出し、Terraform のファイルを作ったり実行したりしていた
この構成なら自分のPCの容量は減りません。ところが今度は、EC2 側のディスク(EBS)が枯渇するという別の問題が起きました。
何が起きたのか
ディスク(保存領域)が枯渇すると、パソコンは「ファイルを保存する」という動作を常に行っていますが、空きがゼロになるとその保存が全部失敗します。その後、サーバーを動かしている裏側のプログラムまで次々と止まり、その中のサービスの1つであるsshdも止まり、 SSH接続すら維持できなくなります。
※今回の私の環境では上記の事象が発生しました。
用語メモ
「No space left on device」…… 直訳すると「デバイスに空き領域がありません」。ディスクが枯渇したときに出るエラーメッセージです。専門的には ENOSPC(イーノースペース)とも呼ばれます。
私の場合、ある日のログ(記録)には、以下のような事象が記録されていました。
枯渇したときに起きたこと
- 明け方の時間帯に「No space left on device」というエラーが 543 行も発生
- 時刻合わせやサーバー管理の裏方プログラムが、保存できずに軒並みエラー
- 最終的にサーバーを再起動して、ようやく復旧
同じ「枯渇エラー」は別々の日に合計2回発生しました。そのたびにディスクを手動で増やし、30GiB → 60GiB → 100GiB と拡張していきました。
※今回は1次対応としてディスクを拡張しました。
ただし、容量を増やすのは応急処置にすぎません。実際、翌日にまた Terraform を4回実行したら、60GiB でも足りなくなり、9時間後には 100GiB へ再拡張する羽目になりました。入れ物を大きくしても、容量が減る速さが上回れば同じことになります。なので「そもそも枯渇させないようにする」対策が必要でした。
なぜディスクが枯渇したのか
まず、ディスクを使っていた「容量の大きいもの」を調べてみました。
| 何が | サイズ | 中身 |
|---|---|---|
| .terraform(テラフォーム関連) | 7.6G | 10 個のフォルダ、それぞれ 675〜858MB |
| Docker(ドッカー)関連 | 8.8G | イメージ 3.96G + 一時ファイル 3.5G |
| pnpm(パッケージ保管庫) | 3.2G | プログラム部品の保管場所 |
| VSCode サーバー | 3.8G | エディタが EC2 側に入れる本体と拡張 |
| 各種キャッシュ | 1.4G | ツールが一時的にためた再利用データ |
| その他(Git など) | 3.2G | — |
用語メモ
キャッシュとは、「一度使ったデータを、次に速く使えるように取っておく一時保存」のことです。便利な反面、放っておくと溜まり続けて容量を圧迫します。
いちばんの原因は「.terraform」の作られ方だった
ディスクが枯渇した日と、ぴったりタイミングが一致していたのが .terraform フォルダです。
Terraform を使うときは、最初に terraform init(テラフォーム・イニット)というコマンドを実行して準備をします。このとき、AWS を操作するための「部品一式(プロバイダと呼びます。約 700MB)」がダウンロードされ、.terraform フォルダの中に保存されます。
ここが落とし穴
この部品一式は、初期設定のままだと作業フォルダごとに毎回まるごとコピーされます。つまり、作業する場所(フォルダ)が10個あれば、同じ 700MB のデータが10個分=約7GBもコピーされてしまうのです。中身はほとんど同じです。
実際、フォルダが作られた日付を並べると、ディスクが枯渇した日と重なっているのが分かりました。
2026-08-03 sample-infra/account-a/.terraform 675M 2026-08-04 .../account-b/management/.terraform 709M 2026-08-04 .../account-b/shared-service/.terraform 692M 2026-08-05 .../account-b/connectivity/.terraform 675M 2026-08-05 .../account-b/customers/customer-a/.terraform 692M
作業用のファイル一式をサーバーに持ってきて(clone=コピーして取得)、account-a というフォルダで terraform init を実行しました。その後、残りわずかだった 初期容量30GiB を使い切り、明け方に枯渇しました。翌日さらに4つのフォルダで init したので、60GiB に増やしても足りなくなりました。
Docker も地味に溜まっていた
もう1つの容量食いが Docker(アプリを箱に入れて動かすツール)です。中身はほぼ同じなのに名前だけ違う「イメージ(アプリの入った箱)」がいくつも残り、さらに作業中に出る一時ファイルが 3.5G も溜まっていました。
Docker 自身に「今どれくらい無駄があるか」を聞いてみると、イメージの 93% は削除しても問題ないと判定されました。それだけ不要なデータが溜まっていました。
この「無駄の量」を教えてくれるのが docker system df というコマンドです。実行すると、種類ごとに「使用量」と「回収可能な量(消しても問題ない量)」が一覧で表示されます。
$ docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 12 2 3.96GB 3.68GB (93%) Containers 2 2 0B 0B Local Volumes 3 1 120MB 40MB (33%) Build Cache 40 0 3.5GB 3.5GB (100%)
表の見方
- TYPE:データの種類(Images=イメージ、Build Cache=ビルド中の一時ファイル など)
- SIZE:その種類が今使っている容量
- RECLAIMABLE:そのうち「消しても問題ない量」。上の例ではイメージの 3.68GB(93%)が回収可能=これが記事の「93%」の正体です
ポイント:docker system df は「見るだけ」で何も削除しない安全なコマンドです。まずこれで現状を確認し、そのうえで対策③の docker system prune で実際に削除する、という順番が安心です。
対策①:無駄なコピーを止める
いちばん効果が大きい対策から紹介します。先ほどの「作業フォルダごとに 700MB を毎回コピーする」問題をなくします。
やることは、「部品一式を1か所に置いて、みんなでそれを共有する」設定を入れるだけです。こうすると、各フォルダには実データではなく「シンボリックリンク」だけが置かれ、実体は1つで済みます。10個分で7GBだったものが、約700MBまで減ります。
用語メモ
シンボリックリンク…… ファイルの実体をコピーする代わりに置く「近道の看板」です。看板は容量をほとんど使いません。
ホームディレクトリ(~)…… 自分専用の基点フォルダのこと。コマンドの中の ~ はこの場所を表します。
手順1.まず、共有用のフォルダを作り、設定ファイルにその場所を書き込みます。以下をターミナル(コマンドを打つ画面)に貼り付けて実行してください。
mkdir -p ~/.terraform.d/plugin-cache cat >> ~/.terraformrc <<'EOF' plugin_cache_dir = "$HOME/.terraform.d/plugin-cache" EOF
上のコマンドの意味
mkdir -p ...:共有用のフォルダを作る(mkdirは「フォルダを作る」コマンド)cat >> ~/.terraformrc ...:Terraform の設定ファイルに「共有フォルダを使ってね」という一行を書き足す
手順2.念のため、いつでもこの設定が効くように、以下の一行も設定ファイル(~/.bashrc)の末尾に追加しておきます。
# プロバイダの共有保存先を Terraform に設定する export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache"
手順3.すでに大きくなってしまった古い .terraform フォルダは、いったん削除してから作り直すと効果がはっきり分かります。まず、今どれくらいの大きさか確認します。
# いまの .terraform フォルダの大きさを確認する
find . -type d -name .terraform -prune -exec du -sh {} \;
確認できたら、削除して作り直します。まず作業したいフォルダに移動(cd)してから実行するのが安全です。
# 例:account-a フォルダに移動する cd ~/sample-infra/account-a # 古い .terraform を削除する rm -rf .terraform # 設定を効かせた状態で作り直す terraform init
上のコマンドの意味
cd フォルダ名:そのフォルダに「移動する」コマンド(cd=change directory)rm -rf .terraform:.terraformフォルダを丸ごと削除するterraform init:準備をやり直す。今回は設定のおかげでコピーではなくショートカットになる
注意:rm -rf は「確認なしで完全に削除」する強力なコマンドです。移動先のフォルダが合っているか、消すのが .terraform で間違いないかを必ず確かめてから実行してください。
この設定だけで、約 7.6GB 分の無駄が消えます。今回の枯渇の一番の原因だったので、まず最初にやるべき対策です。
対策②:フックを導入し枯渇する直前で自動的に止める
対策①で無駄なコピーは止まりますが、別の原因でまた容量が減っていくかもしれません。そこで、「ディスクが危ない量まで減ったら、Claude Code の作業を自動でストップする」安全装置を用意します。ここが、この記事のいちばんの目的である「事前に防ぐ」の中心です。
なぜフックが有効かというと、よくある「容量が減ったらメールで知らせる」方法は枯渇した後に気づくのに対し、フックは危険なコマンドをそもそも実行させないからです。だから、SSH が切れる前に止められます。
手順1.まず、ディスクの空きをチェックする小さなプログラム(スクリプト)を作ります。以下の内容を ~/.claude/hooks/disk-guard.sh という名前で保存します。
#!/usr/bin/env bash
threshold_mb=3000 # 空きがこの数字(MB)を下回ったら止める
avail_mb=$(( $(df --output=avail / | tail -1) / 1024 ))
if [ "$avail_mb" -lt "$threshold_mb" ]; then
echo "disk-guard: ディスクの空きが ${avail_mb}MB しかありません(下限 ${threshold_mb}MB)。枯渇を防ぐため中断しました。不要なファイルを削除してから再実行してください。" >&2
exit 2 # 「2」を返すと、この後のコマンドが止まる
fi
exit 0 # 空きが十分なら、そのまま実行を続ける
このスクリプトがやっていること
- いまのディスクの空き容量(MB)を調べる
- 空きが 3000MB(=3GB)を下回っていたら、警告を出して作業を止める
- 十分に空きがあれば、何もせずそのまま通す
手順2.次に、Claude Code が「コマンドを実行する前」に必ずこのスクリプトを通るように設定します。~/.claude/settings.json に以下を書きます。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "bash ~/.claude/hooks/disk-guard.sh" }
]
}
]
}
}
※「PreToolUse」は「ツールを使う前に」、「matcher: Bash」は「コマンド実行のとき」という意味です。つまりコマンドを実行する直前に、必ず空きチェックが入るようになります。
手順3.最後に、作ったスクリプトを「実行してよいファイル」として登録します。
chmod +x ~/.claude/hooks/disk-guard.sh
これで何が起きる?
空きが 3GB を切った状態で Claude Code がコマンドを実行しようとすると、関所で止められ、「空きが足りません」という警告が Claude 側に伝わります。すると Claude は「容量が足りない」と気づき、勝手にディスクを枯渇させてしまう前に手を止めます。止める基準(ここでは 3GB)は、運用に合わせて 3〜5GB くらいで調整してください。
対策③:Docker とキャッシュを削除する
Docker やキャッシュは、放っておくとまた溜まります。すぐにできる対策として、Docker の不要データをまとめて削除するコマンドがあります。
docker system prune -af --volumes
docker system prune は「Docker の不要なゴミをまとめて削除する」コマンドです。使っていないイメージや一時ファイルを削除して、空き容量を取り戻します。
注意:このコマンドは「今使っていないもの」を消します。停止中でも後で使いたいイメージがある場合は消えてしまうので、実行前に本当に不要か確認してください。
より確実にするなら、別のディスク(EBS ボリューム)を増設して Docker やキャッシュをそちらに移し、ルート領域を圧迫しないようにするのが本格的な対策です。まずは上の片付けコマンドを、定期的に実行する習慣をつけるだけでも効果があります。
まとめ
Claude Code に Terraform を動かさせると、初期設定のままでは同じ部品が何度もコピーされ、気づかないうちにディスクが枯渇してしまうことがあります。今回のケースには、次の対策が有効でした。
この記事の要点
- 対策①:共有設定(
TF_PLUGIN_CACHE_DIR)で、無駄なコピー約7.6GBをなくす - 対策②:フック(安全装置)で、枯渇する直前に作業を自動で止める
- 対策③:Docker やキャッシュを定期的に削除する
ディスクを大きくするのは応急処置にすぎません。「無駄を止める設定」と「枯渇前に止める安全装置」をセットで入れておけば、Claude Code に安心して作業を任せられます。
まずは、いま使っているサーバーで次のコマンドを打って、ディスクの空きを確認するところから始めてみてください。
df -h /
df -h / は「ディスクの使用状況を見やすい単位で表示する」コマンドです。空きが少なくなっていたら、対策①から順に試してみましょう。
参考サイト
この記事で登場したツールやサービスの公式ドキュメントです。より詳しく知りたいときの入り口としてご活用ください。
AWS(サーバーとディスク)
開発環境(接続とAIツール)
Terraform
Docker