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 rm | removedブロック |
|---|---|---|
| 記録 | コマンド履歴のみ | コードに残る |
| レビュー | 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.tfのaws_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. 関連記事
- moved ブロック — stateを安全に移動する — リソース移動の宣言的な方法
- terraform state コマンド完全ガイド — state rmコマンドの使い方
- import ブロック — 既存リソースをTerraform管理下に — importとの組み合わせ
- import ブロック — 既存リソースをTerraform管理下に
- lifecycle — リソースの削除・更新・無視を制御
- state管理とは — tfstateファイルの役割・基本操作
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