removed ブロック — stateから安全にリソースを外す(1.7+)

1. 概要

  • removedブロックとは(Terraform 1.7+)
  • terraform state rmとの違い
  • destroy オプション
  • 実際のユースケース

removedブロック(Terraform 1.7+)はstateからリソースを安全に除外するための宣言的な方法です。コードに記録が残るため、terraform state rmコマンドより追跡性が高くなります。


2. removed ブロックの基本

# removed ブロック: stateからリソースを除外する宣言
removed {
  from = aws_instance.legacy

  lifecycle {
    # destroy = false (デフォルト): AWSのリソースは削除しない、stateからのみ除外
    # destroy = true: stateから除外する前にリソースを削除する
    destroy = false
  }
}

3. コマンドとの比較

比較terraform state rmremovedブロック
記録コマンド履歴のみコードに残る
レビューplan前に実行planで確認できる
バージョンすべてのバージョンTerraform 1.7+
AWSリソース削除しないdestroy = trueで可能
CI/CD対応難しいplanで事前確認可能

4. 実践例: モジュールへの移行

terraform {
  required_version = ">= 1.7"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

variable "environment" {
  description = "環境名"
  type        = string
  default     = "dev"
}

# 変更前: ルートモジュールに直書き
# resource "aws_s3_bucket" "app_data" { ... }

# 変更後: moduleに移動
module "storage" {
  source      = "./modules/storage"
  environment = var.environment
}

# removed ブロックで古いリソースをstateから除外(モジュールに移動したため)
# → modules/storage/main.tf に aws_s3_bucket.app_data がある
removed {
  from = aws_s3_bucket.app_data

  lifecycle {
    destroy = false  # バケットは削除しない
  }
}

この後、modules/storage/main.tfaws_s3_bucket.app_dataに対してimportブロックを追加してstateを移行します。


5. リソースを削除しながらstateから除外する

# removed + destroy = true: リソースも削除する
removed {
  from = aws_instance.old_bastion

  lifecycle {
    destroy = true  # EC2インスタンスをAWSから削除してstateからも除外
  }
}

これはterraform destroy -target=aws_instance.old_bastionと同等ですが、コードに意図が記録されます。


6. applyしたらremovedブロックを削除する

removedブロックはapply後に削除します。削除したらterraform planでdiffがゼロになることを確認してください。

# applyが成功したらこのブロックを削除する
# removed {
#   from = aws_instance.legacy
#   lifecycle { destroy = false }
# }

7. 関連記事


8. まとめ

  • removedブロック(Terraform 1.7+)はstateからリソースを除外する宣言的な方法
  • terraform state rmより追跡性が高い(コードに記録が残り、planで確認できる)
  • lifecycle { destroy = false } — AWSリソースは残してstateからのみ除外(デフォルト)
  • lifecycle { destroy = true } — AWSリソースを削除しながらstateからも除外
  • apply後はremovedブロックを削除する

動作確認バージョン: Terraform >= 1.7 公式ドキュメント: https://developer.hashicorp.com/terraform/language/resources/syntax#removing-resources