Opentofu v1.10からv1.11にした際の新機能メモ
ざっくりまとめ
- 機密情報のランダム値などをステートに保存せずに扱えるようになった「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メタ引数は、countやfor_eachと一緒に使用できません。これらは異なる目的を持っているためです。
- 以下の値は使用できません:
- 不明な値(apply後まで分からない値)
- Sensitive値
- Null値
- Ephemeral値
- Boolean以外の値