30〜40の異なるリソースを持つTerraform 0.11プロジェクトがあります。少数を除いてそれらをすべて削除したいと思います。これらの少数は互いに論理的に関連しています。
terraform destroy --except=resource-id
に近いものを探していましたが、もちろん存在しません。
あまりスクリプトを使わずにそれを達成する方法はありますか(Terraform管理者はさまざまなOSを持っています)?モジュールを使用すると、おそらくそのプロセスが簡単になりますか?
現在、terraform destroy
コマンドには既存の機能はありません。あなたが本当にそれをしたい、そしてあなたがあなたが何をすべきかを知っているなら、ここに回避策があります。
# list all resources
terraform state list
# remove that resource you don't want to destroy
# you can add more to be excluded if required
terraform state rm <resource_to_be_deleted>
# destroy the whole stack except above resource(s)
terraform destroy
状態 (* .tfstate)は、Terraformによって実際のリソースを構成にマップし、メタデータを追跡するために使用されます。
terraform state rm
は、状態ファイル(* .tfstate)からのみアイテム(リソース)を削除します。実際のリソースは削除されません。
terraform apply
またはterraform refresh
を実行しないため、terraform state rm
の後で、terraformは除外されたリソースが作成されたことをまったく認識しません。
terraform destroy
を実行すると、そのリソースの状態に関する詳細はなく、破棄されません。それは残りを破壊します。
必要なものを除いて、(データリソースをスキップしながら)各リソースをターゲットにすることがおそらく唯一の方法です。
#! /bin/bash
while read -r resource; do
terraform destroy -target="$resource"
done < <(terraform state list | grep -vE "^data\." | grep -vE "dont_remove|also_important")
ちょっと違う作業があります。 「terraform destroy」で削除したくないリソースは、CLIのプロビジョナーを使用して「null_resource」として作成します。テラフォームでも変数を使用できます。
例(リソースグループを作成しますが、null_resourceのために永続的です)
resource "null_resource" "backend-config" {
provisioner "local-exec" {
command = <<EOT
az group create --location ${var.Location} --name ${var.Resource_group_name} --tags 'LineOfBusiness=${var.Lob}' 'Region=${var.Region}' 'Purpose="Terraform-Primary-Resource-Group-${var.Lob}'
EOT
interpreter = ["Powershell", "-Command"]
}
}
ここで、terraform destroyを使用してリソースを破棄するとします。 null_resourceはそのまま残ります。