web-dev-qa-db-ja.com

Terraform-1つを除くすべてのリソースを削除

30〜40の異なるリソースを持つTerraform 0.11プロジェクトがあります。少数を除いてそれらをすべて削除したいと思います。これらの少数は互いに論理的に関連しています。

terraform destroy --except=resource-idに近いものを探していましたが、もちろん存在しません。

あまりスクリプトを使わずにそれを達成する方法はありますか(Terraform管理者はさまざまなOSを持っています)?モジュールを使用すると、おそらくそのプロセスが簡単になりますか?

10
rath

現在、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を実行すると、そのリソースの状態に関する詳細はなく、破棄されません。それは残りを破壊します。

14
BMW

必要なものを除いて、(データリソースをスキップしながら)各リソースをターゲットにすることがおそらく唯一の方法です。

#! /bin/bash

while read -r resource; do
    terraform destroy -target="$resource"
done < <(terraform state list | grep -vE "^data\." | grep -vE "dont_remove|also_important")
1
Olli K

ちょっと違う作業があります。 「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はそのまま残ります。

0
Pwd9000