TL;DR

Terraform の操作中だけ存在する一時的なリソース。state や plan ファイルに保存されない。v1.10 以降で使える。

なぜ必要か

パスワードや接続情報など、永続化したくないデータを扱うために使う。従来は data source で一時トークンを取得していたが、data source は値を state に保存してしまう。ephemeral resource は永続化しないので、この問題を避けられる。

仕組み

ライフサイクル

Open →(Renew)→ Close の順で処理される。結果が必要になったときに Open で開き、リモートの有効期限を超えて必要なら Renew でプロバイダに更新を頼み、依存するプロバイダの処理が終わったら Close で閉じる。Renew と Close は必須ではない。たとえば Vault のシークレットでは、Open でリースを取得し、Renew で延長し、Close でリースを終了して即時に失効させる。

plan と apply

依存グラフのノードになり、resource や data source と同じように振る舞う。resource や data source が ephemeral の属性に依存していれば、ephemeral を先にプロビジョニングする。入力引数が plan の時点で分からなければ、実行を apply まで遅らせる。apply の作成リソース数には数えられない。

参照できる場所

ephemeral.<TYPE>.<LABEL> の構文で参照する。参照できる場所は、managed resource のwrite-only 引数、別の ephemeral ブロック、locals、ephemeral = true を付けた variable や output、provider の設定などに限られる。locals で参照すると、その locals の値も state と plan に保存されない。メタ引数は count、for_each(どちらか一方)、depends_on、provider、lifecycle(precondition、postcondition)が使える。

例

random_password の ephemeral resource が一時パスワードを作り、password_wo という write-only 引数に渡す。どちらも Terraform の実行の外には残らないので、値は state と plan から除外される。

ephemeral "random_password" "db_password" {
  length           = 16
  override_special = "!#$%&*()-_=+[]{}<>:?"
}
 
resource "aws_db_instance" "example" {
  # ...
  password_wo         = ephemeral.random_password.db_password.result
  password_wo_version = 1
}

注意点

生成した値は保存されないので、失いたくない値は別のリソースに取り込んで保存する。

write-only 引数は ephemeral resource ではなく、managed resource 側の引数である。「state に残さない」点は同じだが別物で、両者を組み合わせて使うのが典型である。

関連

出典