AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

Terraform で import した resource を tfstate から削除する

terraform state rm ${リソース名} で消せる。

aws_route53_zone.default_zone というリソース名でインポートする場合、以下のようになる。

terraform import aws_route53_zone.default_zone ${ゾーンID}

これを取り込んだ tfstate ファイルはだいたい以下のようになる (雰囲気だけ似せてます)。

{
  "version": 4,
  "terraform_version": "1.3.6",
  "serial": 2,
  "lineage": "なんか UUID っぽいやつ",
  "resources": [
    {
      "mode": "managed",
      "type": "aws_route53_zone",
      "name": "default_zone",
      "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "arn": "arn:aws:route53:::hostedzone/01234567890123456789",
            "comment": "デフォルトドメインのホストゾーン",
            "delegation_set_id": "",
            "force_destroy": null,
            "id": "01234567890123456789",
            "name": "example.com",
            "name_servers": [
              "ns-114.example.com",
              "ns-1145.example.com",
              "ns-11451.example.com",
              "ns-114514.example.com"
            ],
            "primary_name_server": "ns-114.example.com",
            "tags": {
              "Name": "example.com"
            },
            "vpc": [],
            "zone_id": "01234567890123456789"
          },
          "sensitive_attributes": [],
          "private": "114514b3ivh4mfj3n4zqdiuobfa810=="
        }
      ]
    }
  ],
  "check_results": null
}

この状態で、コード上から resource "aws_route53_zone" "default_zone {}" の記述を削除して plan を実行すると、以下のようにリソース削除対象として Destroy に計上されてしまう。

Plan: 114514 to add, 0 to change, 1 to destroy.

Changes to Outputs:
以下略

記述を削除してリソースも Terraform の管理対象から外したいけど、AWS 上では残っていてほしい。

「これでは困る……」ということで、そのような場合は state rm を実行することで、 tfstate の内容のみ削除できる。

terraform state rm aws_route53_zone.default_zone

実行後の tfstate ファイルは以下のようになる。

{
  "version": 4,
  "terraform_version": "1.3.6",
  "serial": 3,
  "lineage": "なんか UUID っぽいやつ",
  "resources": [],
  "check_results": null
}

やったぜ、無事 resources が空になった。

このあとマネジメントコンソールからログインして Route53 を確認すれば分かる通り、 import 元のリソースは AWS 上に残留しているので、これで変に削除とかされずめでたしめでたし。

もちろんこれらは route53 で NS 向けているリソースだったので「削除したくない!」という感じだったので、削除していいリソースであれば state rm せずにコード記述を削除して destroy で構わない。

qiita.com