ephemeral変数 — 一時的な機密値をstateに残さない(1.10+)

1. 概要

  • ephemeral変数とは(Terraform 1.10+)
  • ephemeralリソース / ephemeral output
  • 通常のsensitiveとの違い
  • 実際のユースケース(データベースパスワード・シークレット)

ephemeral(一時的)は、Terraform 1.10で導入された新しいコンセプトです。ephemeralな値はtfstateに一切記録されない点が通常のsensitiveとの最大の違いです。


2. ephemeral変数

ephemeral = trueを指定すると、その変数の値はtfstateに記録されません。apply実行中のみ存在する「一時的な値」として扱われます。

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

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

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

# ephemeral = true: stateに記録されない一時的な変数
variable "db_password" {
  description = "データベースパスワード(stateに記録されない)"
  type        = string
  ephemeral   = true  # tfstateに保存されない
}

# 通常のsensitive変数(stateには記録される・ただし暗号化)
variable "api_key" {
  description = "APIキー(stateに記録される)"
  type        = string
  sensitive   = true
}

3. ephemeral値を使えるリソース

ephemeral値はtfstateに書き込まれないため、使用できる場所が制限されます。

# ✅ ephemeral変数を使えるリソース属性(write_only属性)
resource "aws_db_instance" "main" {
  identifier        = "${var.environment}-main"
  engine            = "postgres"
  engine_version    = "16"
  instance_class    = "db.t3.micro"
  allocated_storage = 20
  storage_encrypted = true

  db_name  = "myapp"
  username = "admin"

  # write_only属性: stateに記録されない(ephemeral変数を使用可能)
  password = var.db_password  # ephemeral変数OK

  skip_final_snapshot = true

  tags = {
    Name        = "${var.environment}-main"
    Environment = var.environment
    ManagedBy   = "terraform"
  }
}

4. ephemeralリソース(ephemeral resource)

Terraform 1.10ではephemeralリソースブロックも導入されました。stateに記録されない一時的なデータソースとして機能します。

# ephemeral リソース: stateに記録されないデータ取得
ephemeral "aws_secretsmanager_secret_version" "db_password" {
  secret_id = "/${var.environment}/db/password"
}

resource "aws_db_instance" "main2" {
  identifier        = "${var.environment}-main2"
  engine            = "postgres"
  engine_version    = "16"
  instance_class    = "db.t3.micro"
  allocated_storage = 20
  storage_encrypted = true
  db_name           = "myapp"
  username          = "admin"

  # Secrets Managerから取得したパスワードをephemeralで渡す
  password = ephemeral.aws_secretsmanager_secret_version.db_password.secret_string

  skip_final_snapshot = true

  tags = {
    Name        = "${var.environment}-main2"
    Environment = var.environment
    ManagedBy   = "terraform"
  }
}

5. sensitiveとephemeralの違い

比較sensitive = trueephemeral = true
tfstateへの保存保存される(暗号化推奨)保存されない
planでの表示(sensitive value)非表示
使用できる場所ほぼどこでもwrite_only属性のみ
Terraform version全バージョン1.10+
ユースケース一般的な機密値パスワード・トークン(stateに残したくない値)

6. 関連記事


7. まとめ

  • ephemeral = true変数はtfstateに一切記録されないsensitiveはstateに記録される)
  • ephemeral値はwrite_only属性(パスワードなど)のみに使用できる
  • ephemeralリソースブロックはstateに記録されないデータソース(Secrets Managerのパスワード取得に最適)
  • Terraform 1.10+の新機能で、データベースパスワードをstateに残さないために設計された

動作確認バージョン: Terraform >= 1.10 公式ドキュメント: https://developer.hashicorp.com/terraform/language/values/variables#ephemeral-variables