前書き
Terraformを使用してインフラを管理していると、一部のリソースがAWSコンソール上で削除されてしまい、Terraformの terraform destroy が失敗することがあります。この記事では、そのような状況に陥った際のいくつかの解決方法と、それぞれの具体的なコマンドを紹介します。
問題の概要
Terraformは管理対象のリソースを terraform.tfstate ファイルで管理しています。しかし、AWSコンソールなどで手動削除されたリソースがあると、Terraformが状態を正しく認識できず、削除時にエラーが発生することがあります。
解決策 ①: terraform state rm コマンドを使用する
Terraformの state rm コマンドを使用することで、手動削除されたリソースを terraform.tfstate から削除できます。これはTerraformの管理対象からリソースを外す方法です。
手順
1. まず、エラーの原因となっているリソースを特定する
terraform plan
2. 問題のリソースをTerraformの状態管理から削除する
terraform state rm aws_instance.example
# aws_instance.example の部分は、エラーで表示されているリソース名に置き換えてください
3. その後、通常通り terraform destroy を実行できる
terraform destroy
解決策 ②: terraform import で再登録する
AWSコンソールで削除されたリソースがまだ必要な場合は、 terraform import を使ってTerraformの管理対象に再登録できます。
手順
1. まず、対象のリソースをTerraformにインポートできるか確認する
terraform state list
2. AWSのリソースIDを確認し、Terraformにインポートする
terraform import aws_instance.example i-xxxxxxxxxxxx
# i-xxxxxxxxxxxx は、AWS上の実際のリソースIDに置き換えてください
3. その後、 terraform destroy が正常に動作するか試す
terraform destroy
解決策 ③: terraform refresh
Terraformの状態ファイルを最新の状態に更新することで、問題が解決する場合があります。
手順
1. terraform refresh コマンドを実行する(Terraform v0.15 以前の場合)
terraform refresh
※Terraform v1.0以降では refresh は非推奨になり、 terraform apply に統合されました。
2. terraform apply を実行し、削除されたリソースを再作成する
terraform apply
解決策 ④: 手動で terraform.tfstate を編集する(最終手段)
terraform state rm で対応できない場合は、 terraform.tfstate を直接編集することもできます。ただし、手作業での編集はリスクが伴うため、事前にバックアップを取ることをおすすめします。
手順
1. terraform.tfstate のバックアップを作成する
cp terraform.tfstate terraform.tfstate.bak
2. terraform.tfstate を手動で開き、削除されたリソースに関連するエントリを削除する
3. 修正後、 terraform apply または terraform destroy を再実行する
terraform destroy
まとめ
Terraformで管理しているリソースがAWSコンソールで削除された場合は、まず state rm や import で対応し、それでも解決しない場合は refresh や tfstate の編集を検討すると良いでしょう。
お役に立てれば幸いです。