おはようございます、YASUです。
これまでtfstateやリモートステートの話をしてきましたが、今日は原点に戻って、Terraformを触る時に必ず使う2つのコマンド、terraform planとterraform applyの違いを整理します。何となく毎回打っているコマンドですが、それぞれの役割をちゃんと言葉にできるかというと、意外と怪しかったりします。
結論
planは「これから何が起きるかを予告してくれるだけ」のコマンドで、実際には何も変更しません。実際にAWS上のリソースを作ったり変更したりするのはapplyの役目です。この2段階に分かれているおかげで、いきなり本番環境を壊す事故を防げます。
terraform plan:予告編を見るコマンド
terraform plan
これを実行すると、Terraformは今のコードの内容と、実際のAWS上の状態(tfstateに記録されている情報)を見比べて、「このコードを適用したら、こういう変更が起きますよ」という差分を教えてくれます。
+ aws_instance.web will be created
~ aws_security_group.web will be updated in-place
- aws_subnet.old will be destroyed
この + ~ - の記号がポイントです。
+:新しく作られるリソース~:既存のリソースが変更される-:リソースが削除される
この時点では、あくまで「予告」であって、AWS上には何一つ変更が加えられていません。何度実行しても安全なコマンドです。
terraform apply:実際に実行するコマンド
terraform apply
こちらを実行すると、planと同じ差分が表示された後、確認を求められます。
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:
ここで yes と入力して初めて、実際にAWS上でリソースの作成・変更・削除が実行されます。つまりapplyは「予告編を見せた上で、本当に実行していいか最終確認してから実行する」という、2段階の安全装置付きのコマンドです。
なぜ2つに分かれているのか
もしplanが無く、applyだけでいきなり変更が実行される仕様だったらどうなるでしょうか。コードにちょっとしたミスがあった場合、それに気づかないまま本番のリソースを削除してしまう、といった事故が起きかねません。
plan→applyという2段階になっていることで、
- 「削除」の記号(
-)が意図しない場所に出ていないか、事前にチェックできる - チームで作業している場合、planの結果を他のメンバーに見せてレビューしてもらってからapplyする、という運用ができる
という安全網が働きます。実務では、CI/CDの仕組みと連携させて「PRを出すと自動でplanの結果がコメントされ、それをレビューしてからマージ・applyする」という運用も一般的です。以前Gitの話でPRレビューについて触れましたが、Terraformの世界でも根本にある考え方は同じで、「いきなり本番に反映せず、必ず誰かの目を通してから実行する」という点が共通しています。
おまけ:terraform destroy
ついでによく使うもう一つのコマンドにも触れておきます。
terraform destroy
これは、これまで作ったリソースを全部削除するコマンドです。検証環境を作って壊して、を繰り返す練習ではよく使いますが、当然ながら本番環境では取り扱い注意なコマンドです。こちらもapplyと同様、実行前に確認プロンプトが出ます。
まとめ
- terraform plan:何が変わるかを予告するだけ。実際の変更は起きない
- terraform apply:planの内容を確認した上で、実際にAWS上へ反映する
- 2段階に分かれていることで、意図しない変更や削除を事前にチェックできる
- terraform destroy:作ったリソースを全部削除する、取り扱い注意のコマンド
普段何気なく打っているコマンドも、改めて「なぜこの2段階なのか」を言葉にしてみると、Terraformの設計思想が少し見えてくる気がします。それでは、また明日!

コメント