GitHub Actionsを使って、mainブランチをマージしたら自動でEC2にデプロイされるようにしていました。
しかし、ある日Terraformの設定を再開しようとしたところ、.tfファイルがすべて消えている……!?😭🥀
この記事では、その原因と再発防止策を解説します。
人柱として、記事を読んでくださるみなさんには私と同じ轍を踏まないように原因と対策を共有したいと思います。
環境
- Ubuntu 24.04.2
- Terraform v1.13.3
- GitHub Actions: self-hosted runner on EC2
原因
.ymlに書いてあった原因となった部分を抜粋
BASE=/home/ubuntu
RDIR=$BASE/releases/${{ steps.rel.outputs.REL }}
mkdir -p "$RDIR"
rsync -a --delete --exclude=".git" . "$RDIR/
--delete オプションがポイントです。
これは以下のような動作をします:
「ローカル(GitHub Actionsでcheckoutしたリポジトリ)に存在しないファイルやフォルダを、リモートディレクトリから削除する」
つまり、リポジトリ外のファイル(今回はTerraform関連)まで削除されてしまいました。
私の場合:
- 以前Terraformを置いてたのがアプリケーションフォルダと同じプロジェクトディレクトリ (/home/ubuntu/…) だった
- デプロイ時に /releases/ がまるごと新しい構成に置き換わる
- シンボリックリンク更新時に古い current が消される
→ その中にTerraformフォルダがあった場合、同時に消える
結果、.tfファイルが全て削除されてしまった。
対策
ここでは、場合分けして対策していきます。
| パターン | 対策内容 |
|---|---|
| アプリディレクトリ内でTerraformを運用する場合 |
--exclude=".terraform/" を追加する |
| 別ディレクトリでTerraformを管理する場合 |
/terraform フォルダをアプリ外に移動する |
①アプリディレクトリ内でTerraformを運用する場合
BASE=/home/ubuntu
RDIR=$BASE/releases/${{ steps.rel.outputs.REL }}
mkdir -p "$RDIR"
rsync -a --delete --exclude=".git" --exclude=".terraform/" . "$RDIR/"
.ymlファイル中のrsync行を修正
→ --excludeに.terraform/を追加することでシンボリック更新時に消されないようにする。
②別ディレクトリでTerraformを管理する場合
../
terraform/
├── main.tf
├── variables.tf
├── versions.tf
└── terraform.tfvars
.tfファイル専用のディレクトリを作成
→ アプリケーションフォルダ直下に置かなければworkflowによって削除されることはない。
結果
一通りリカバリはできたと思うので、
terraform initで初期化。
Terraformの初期化に成功した際のログは以下のようになります。

続いて、terraform validateで構成の整合性をチェックします。
これも成功!

まとめ・学び
-
rsyncの--deleteは便利だが、扱いを誤ると重要ファイルを失う
-
.tfや.envなどはリリースディレクトリ外に分離するのが安全
-
自動化は便利だが、デプロイ先の構成を常に確認しよう