【実務・中級編】Terraformで構築する「検証用サンドボックス」の自動クリーンアップ:TTL付きインフラの作成とリソース削除のライフサイクル管理 – インフラ構成管理(IaC)活用バイブル

ゾンビインフラを根絶せよ:Terraformで構築する「自己消滅型」サンドボックスの設計思想

検証環境を作ったはいいが、誰が作ったか不明なEC2インスタンスや、使われていないRDSがAWSの請求書で「墓標」のように並んでいる……そんな惨状に心当たりはないか?

SREの現場において、「環境を構築する能力」よりも「環境を正しく廃棄する能力」の方が、長期的には遥かに高い価値を持つ。 今日は、Terraformで作成したリソースにTTL(存続期間)という命を吹き込み、自動的に墓場へ送る「自己消滅型サンドボックス」の構築手法を伝授する。

—

1. なぜ「TTL」をTerraformに埋め込むべきか

手動で環境を消す運用は、必ず破綻する。人間は忘れる生き物だからだ。
Terraformの `tags` を利用し、リソース自体に `DeleteAfter` というメタデータを持たせるのが最も堅牢だ。

実用的な設定:TTLタグの埋め込み

まずは、すべてのモジュールで以下のタグを強制するルールを `locals` で定義する。

locals {
# 現在時刻から3時間後のタイムスタンプを計算
# 破壊的変更を防ぐため、CI/CDの実行時刻を基準にするのが鉄則
ttl_timestamp = timeadd(timestamp(), “3h”)

default_tags = {
Environment = “sandbox”
ManagedBy = “terraform”
DeleteAfter = local.ttl_timestamp # ここが重要
}
}

resource “aws_instance” “sandbox” {
ami = “ami-xxxxxxxx”
instance_type = “t3.micro”
tags = merge(local.default_tags, { Name = “tmp-workload” })
}

—

2. 墓守の自動化:EventBridge × Lambdaによる「掃除」

Terraformでタグを付与したら、次はそれを監視する「掃除屋」を動かす。EventBridgeでスケジュール実行し、Lambdaで `DeleteAfter` を過ぎたリソースを抹殺する。

思考のポイント:
全リソースを破壊するのではなく、`DeleteAfter` タグを持つリソースのみをフィルタリングするのが肝だ。

掃除屋Lambdaのロジック概要 (Python)
import boto3
from datetime import datetime, timezone

def lambda_handler(event, context):
ec2 = boto3.client(‘ec2’)
# 現在時刻をUTCで取得
now = datetime.now(timezone.utc)

# DeleteAfterタグが現在時刻より前のリソースを抽出
# … (describe_instancesでタグをフィルタリング)

# 削除実行
ec2.terminate_instances(InstanceIds=[…])

—

3. 生産性を劇的に引き上げる「プロの武器」

現場で消耗しないための、エンジニアとしての「武装」を共有しておく。

神プラグイン:Terraformの操作性を変える

  • [Terraform Lens](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-terraform-ls): VSCodeで必須。リソース間の依存関係を補完し、記述ミスを未然に防ぐ。
  • [TFLint](https://github.com/terraform-linters/tflint): 単なるシンタックスチェックを超え、クラウド固有の推奨事項を突きつけてくる。これを入れていない環境は「素人」の証明だ。

隠れたキーボードショートカット

  • `Cmd + Shift + P` -> `Terraform: Format` (保存時に自動フォーマットされるよう設定せよ)
  • `Cmd + Shift + K` (VSCode): Terraformファイル内の不要なリソースブロックを瞬時に消し飛ばす。

—

4. チーム開発における「絶対ルール」

設定ファイル(`tfvars` や `hcl`)を散らかすな。以下の構成をテンプレートとして固定しろ。

├── modules/ # 再利用可能なコンポーネント
├── environments/ # 各環境の設定
│ ├── dev/
│ │ ├── main.tf # モジュール呼び出しのみ
│ │ └── variables.tf
│ └── sandbox/ # ここにTTL付き環境を定義
│ └── backend.tf

【重要】チームでの共有化ルール:
1. tfvarsはGit管理し、機密情報は必ずSecrets Managerへ逃がせ。
2. `terraform plan` の結果をGitHubのPRにコメントするワークフローを導入せよ(`tfcmt` を使うのが業界標準だ)。
3. `terraform destroy` を手動で実行させるな。 CI/CDパイプラインを経由させることで、監査ログを確実に残せ。

—

結び:インフラは「使い捨て」であるべきだ

「一度作ったものを一生守り続ける」のはレガシーな発想だ。
TerraformでTTLを設計し、自動で消滅させる仕組みを作ることは、「いつでもスクラップ&ビルドできる」という圧倒的な心理的安全性をチームに与える。

検証環境が放置されているなら、それはあなたの設計がまだ「人間頼み」だからだ。今すぐコードを書き換え、インフラに死期を告げるロジックを組み込め。それが、真にモダンなSREへの第一歩だ。

健闘を祈る。

タイトルとURLをコピーしました