ざっくりまとめ

  • 機密情報のランダム値などをステートに保存せずに扱えるようになった「Ephemeral Resources」
  • 今までcountでフラグ制御していたリソースを「enabled」で制御できるようになった

所感

Ephemeralは出番が多そうだけど、enabledは今までの方法でも十分かなという印象(※個人の感想です)


※これ以降は、AIにまとめてもらった内容(を自分用に要点だけ抜き出したもの)の転記です

1. Ephemeral Resources / Write-Only Attributes

使用例: ランダムパスワード生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# ランダムパスワードを生成(ステートに保存されない)
ephemeral "random_password" "db_password" {
length = 16
special = true
}

# AWS Secrets Managerに保存(Write-Only属性を使用)
resource "aws_secretsmanager_secret_version" "db_password" {
secret_id = aws_secretsmanager_secret.db.id

# secret_stringはWrite-Only属性
secret_string_wo = ephemeral.random_password.db_password.result

# 更新時はこの値を変更
secret_string_wo_revision = 1
}

2. 既存シークレットの取得と利用

使用例: AWS認証情報の一時取得

1
2
3
4
5
6
7
8
9
10
11
# OpenBaoから一時的なAWS認証情報を取得
ephemeral "openbao_aws_credentials" "temp_creds" {
backend = "aws"
role = "deploy"
}

# 取得した認証情報をAWSプロバイダーに渡す
provider "aws" {
access_key = ephemeral.openbao_aws_credentials.temp_creds.access_key
secret_key = ephemeral.openbao_aws_credentials.temp_creds.secret_key
}

使用例: 既存シークレットの取得

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Secrets Managerから既存のシークレットを取得
ephemeral "aws_secretsmanager_secret_version" "api_key" {
secret_id = "prod/api/key"
}

# 取得したシークレットをプロバイダー設定に使用
provider "some_api" {
api_key = ephemeral.aws_secretsmanager_secret_version.api_key.secret_string
}

# または他のリソースのWrite-Only属性に渡す
resource "kubernetes_secret" "app_config" {
data_wo = {
api_key = ephemeral.aws_secretsmanager_secret_version.api_key.secret_string
}
data_wo_revision = 1
}

Enabled メタ引数

従来の方法 (count使用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
variable "create_instance" {
type = bool
default = true
}

resource "aws_instance" "example" {
count = var.create_instance ? 1 : 0
# ...
}

# 参照時に[0]が必要
output "instance_id" {
value = aws_instance.example[0].id # 配列アクセスが必要
}

問題点:

  • リソース参照時に[0]インデックスが必要
  • コードの可読性が低下
  • リファクタリング時にすべての参照箇所を修正する必要がある

新しい方法 (enabled使用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
variable "create_instance" {
type = bool
default = true
}

resource "aws_instance" "example" {
# ...
lifecycle {
enabled = var.create_instance
}
}

# 直接参照可能(ただしnullチェックが必要)
output "instance_id" {
value = aws_instance.example != null ? aws_instance.example.id : "not-created"
}

改善点:

  • [0]インデックスが不要
  • より直感的で読みやすい
  • 条件付き作成の意図が明確

モジュールでの使用例

1
2
3
4
5
6
7
8
9
10
11
12
13
variable "enable_cluster" {
type = bool
default = false
}

module "servers" {
source = "./app-cluster"
servers = 5

lifecycle {
enabled = var.enable_cluster # モジュール全体を条件付きで作成
}
}

制限事項

  • enabledメタ引数は、countfor_eachと一緒に使用できません。これらは異なる目的を持っているためです。
  • 以下の値は使用できません:
    • 不明な値(apply後まで分からない値)
    • Sensitive値
    • Null値
    • Ephemeral値
    • Boolean以外の値