🦋

ephemeral リソースの挙動と用途の研究

に公開

背景と概要

結論

  • ephemeral リソースはリソースの一種というよりも、データソースの一種と捉える方が良い。
    • クラウドリソースを作成するような ephemeral リソースは提供されていない。また、 ephemeral リソースの挙動の観点からも、そういう ephemeral リソースが提供されることは考えにくい。
  • こんな用途に使えそう
    • provider に対して設定する秘密情報の取得。
    • シークレットストア間の値のコピー
      • ただし ephemeral リソース単体だと、「1回だけ設定して、更新には追随しない」という挙動になります。
      • シークレットストア間での値を同期したいという場合は、データソースと併用して扱うことになります。
  • Terraform で作成する永続的な認証情報を保存するために使用することはできない。
    • 例えば、AWS のアクセスキー、 Google Cloud のサービスアカウントキーを保存するという用途には使えない。

aws provider / google provider で提供される ephemeral リソース

2026年1月現在。

この一覧からも分かる通り、基本的にクラウドリソースの参照や一時的な認証情報の取得の機能だけに限られています。
クラウドリソースの作成の機能は提供されていません。例えば、 AWS アクセスキーを作成したり、Google サービスアカウントキーを作成したりといった、新規の固定の秘密情報を作成する ephemeral リソースは存在しません。

これらを踏まえると、ephemeral リソースは Terraform の「リソース」の一種というよりも、「データソース」に近いと捉えたほうが理解しやすいように感じます。

ephemeral リソースの挙動

公式ドキュメント

Ephemeral block reference for the Terraform configuration language | Terraform | HashiCorp Developer

  • ステートに値が保存されない。
  • ephemeral リソースの出力が使えるのは以下の場所に限られる:
    • resource ブロックの write only argument
    • 他の ephemeral ブロック内
    • ローカル変数 (locals)
      • 補足: このローカル変数は ephemeral リソースの出力と同じ制約を受けます。
    • ephemeral = true が指定された変数 (variable)
    • サブモジュールのephemeral = true が指定された出力 (output)
      • 補足: つまりルートモジュールの output には使用できません。
    • provider ブロック内
    • provisioner ブロック内
  • ephemeral リソースの出力が必要なときだけ参照される (Terraform opens an ephemeral resource if it needs access to the resource’s result.)。
    • 補足: この「必要なとき」の基準ははっきりしておらず、検証した限りではあまり直感に一致した動作ではなさそう。後述の通り、ephemeral リソースを参照しているリソースが更新を伴わない場合でも ephemeral リソースが open されることを確認しています。

ステートに値が保存されない挙動の検証

※前述の「ephemeral リソースはリソースよりもデータソースに近い」を反映し、比較対象にはデータソースを使用する。

ソースコード全体

# データソースを使ったコピー
data "google_secret_manager_secret_version" "state_test_source_by_datasource" {
  secret = google_secret_manager_secret.state_test_source.id

  depends_on = [google_secret_manager_secret_version.state_test_source]
}

resource "google_secret_manager_secret_version" "state_test_target_nonephemeral" {
  secret = google_secret_manager_secret.state_test_target_nonephemeral.id

  secret_data_wo         = data.google_secret_manager_secret_version.state_test_source_by_datasource.secret_data
  secret_data_wo_version = data.google_secret_manager_secret_version.state_test_source_by_datasource.version
}

# ephemeral リソースを使ったコピー
ephemeral "google_secret_manager_secret_version" "state_test_source_by_ephemeral" {
  secret = google_secret_manager_secret.state_test_source.id

  depends_on = [google_secret_manager_secret_version.state_test_source]
}

resource "google_secret_manager_secret_version" "state_test_target_ephemeral" {
  secret = google_secret_manager_secret.state_test_target_ephemeral.id

  secret_data_wo = ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral.secret_data

  # ephemeral リソースの出力を write-only argument 以外に設定できない。
  secret_data_wo_version = 1
}

上記の Terraform を実行して生成されたステートファイルに対して state_test_source_by_datasourcestate_test_source_by_ephemeral で検索すると、 state_test_source_by_datasource については以下の通りシークレットの値を含んだ状態で記録されているのに対して、 state_test_source_by_ephemeral は何も記録されていない (検索にヒットしない) ことが確認できます (正確には dependencies に出てくるけれども割愛)。また、シークレットの値で検索しても、検索にヒットするのはここだけです:

    {
      "mode": "data",
      "type": "google_secret_manager_secret_version",
      "name": "state_test_source_by_datasource",
      "provider": "provider[\"registry.terraform.io/hashicorp/google\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "create_time": "2026-01-05T00:07:25.025244Z",
            "destroy_time": null,
            "enabled": true,
            "fetch_secret_data": true,
            "id": "projects/(snip)/secrets/ephemeraltest-state-test-source/versions/1",
            "is_secret_data_base64": false,
            "name": "projects/(snip)/secrets/ephemeraltest-state-test-source/versions/1",
            "project": "(snip)",
            "secret": "ephemeraltest-state-test-source",
            "secret_data": "state-test-data",
            "version": "1"
          },
          "sensitive_attributes": [
            [
              {
                "type": "get_attr",
                "value": "secret_data"
              }
            ]
          ],
          "identity_schema_version": 0
        }
      ]
    },

使える場所が限られる挙動の検証

ソースコード全体

write-only argument 以外での利用

resource "google_secret_manager_secret_version" "state_test_target_ephemeral" {
  secret = google_secret_manager_secret.state_test_target_ephemeral.id

  secret_data_wo         = ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral.secret_data
  secret_data_wo_version = ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral.version
}

Error: Invalid use of ephemeral value というエラーになります:


│ Error: Invalid use of ephemeral value

│   with google_secret_manager_secret_version.state_test_target_ephemeral,
│   on valid_contexts.tf line 35, in resource "google_secret_manager_secret_version" "state_test_target_ephemeral":
│   35:   secret_data_wo_version = ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral.version

│ Ephemeral values are not valid for "secret_data_wo_version", because it is not a write-only attribute and must be persisted to state.

ローカル変数経由での利用

locals {
  version = ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral.version
}

resource "google_secret_manager_secret_version" "state_test_target_ephemeral" {
  secret = google_secret_manager_secret.state_test_target_ephemeral.id

  secret_data_wo         = ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral.secret_data
  secret_data_wo_version = "${local.version}0"
}

直接利用と同様にエラーになります:


│ Error: Invalid use of ephemeral value

│   with google_secret_manager_secret_version.state_test_target_ephemeral,
│   on valid_contexts.tf line 39, in resource "google_secret_manager_secret_version" "state_test_target_ephemeral":
│   39:   secret_data_wo_version = "${local.version}0"

│ Ephemeral values are not valid for "secret_data_wo_version", because it is not a write-only attribute and must be persisted to state.

ルートモジュールの output での利用

output "version" {
  value     = ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral.version
  ephemeral = true
}

Error: Ephemeral output not allowed エラーになります:


│ Error: Ephemeral output not allowed

│   on valid_contexts.tf line 31:
│   31: output "version" {

│ Ephemeral outputs are not allowed in context of a root module

必要なときだけ参照される挙動

ソースコード全体

以下のように ephemeral リソースを使って secret を他の secret にコピーする Terraform の挙動を確認します:

# 事前にシークレットを手動作成しておく
ephemeral "google_secret_manager_secret_version" "state_test_source_by_ephemeral" {
  secret = var.source_secret_id
}

resource "google_secret_manager_secret" "state_test_target_ephemeral" {
  secret_id = "${var.basename}-state-test-target-ephemeral"

  replication {
    auto {}
  }
}

resource "google_secret_manager_secret_version" "state_test_target_ephemeral" {
  secret = google_secret_manager_secret.state_test_target_ephemeral.id

  secret_data_wo         = ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral.secret_data
  secret_data_wo_version = 1
}

初回適用時:

$ terraform apply
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening...
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening complete after 1s
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Closing...
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Closing complete after 0s

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following    
symbols:
  + create

Terraform will perform the following actions:

(略)

Plan: 2 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening...
google_secret_manager_secret.state_test_target_ephemeral: Creating...
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening complete after 0s
google_secret_manager_secret.state_test_target_ephemeral: Creation complete after 1s [id=projects/(snip)/secrets/ephemeraltest-state-test-target-ephemeral]
google_secret_manager_secret_version.state_test_target_ephemeral: Creating...
google_secret_manager_secret_version.state_test_target_ephemeral: Creation complete after 4s [id=projects/(snip)/secrets/ephemeraltest-state-test-target-ephemeral/versions/1]
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Closing...
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Closing complete after 0s

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

2 回目適用時:

$ terraform apply
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening...
google_secret_manager_secret.state_test_target_ephemeral: Refreshing state... [id=projects/(snip)/secrets/ephemeraltest-state-test-target-ephemeral]
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening complete after 0s
google_secret_manager_secret_version.state_test_target_ephemeral: Refreshing state... [id=projects/(snip)/secrets/ephemeraltest-state-test-target-ephemeral/versions/1]
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Closing...
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Closing complete after 0s

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.       
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening...
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening complete after 0s
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Closing...
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Closing complete after 0s

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

2 回目適用時はインフラの更新処理がないため、要・不要で言うと ephemeral リソースは使用される必要がありません。
それにもかかわらず、実際には ephemeral リソースが使用されていることが分かります。

実際に、 TF_LOG=debug でデバッグログを出力するとシークレットを取得する API が呼ばれていることも分かります:

デバッグログの抜粋 (長いので折りたたみ)
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening...
...
2026-01-05T06:15:24.679Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: 2026/01/05 06:15:24 [DEBUG] Google API Request Details:
2026-01-05T06:15:24.679Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: ---[ REQUEST ]---------------------------------------
2026-01-05T06:15:24.679Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: GET /v1/projects/(snip)/secrets/ephemeraltest-copy-source/versions/1:access?alt=json HTTP/1.1
2026-01-05T06:15:24.679Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: Host: secretmanager.googleapis.com
2026-01-05T06:15:24.679Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: User-Agent: Terraform/1.14.3 (+https://www.terraform.io) Terraform-Plugin-SDK/2.38.1 terraform-provider-google/7.14.1
2026-01-05T06:15:24.679Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: Content-Type: application/json
2026-01-05T06:15:24.679Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: Accept-Encoding: gzip
2026-01-05T06:15:24.679Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5
2026-01-05T06:15:24.679Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5
2026-01-05T06:15:24.679Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: -----------------------------------------------------
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: 2026/01/05 06:15:24 [DEBUG] Google API Response Details:
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: ---[ RESPONSE ]--------------------------------------
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: HTTP/2.0 200 OK
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: Content-Type: application/json; charset=UTF-8        
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: Date: Mon, 05 Jan 2026 06:15:23 GMT
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: Server: ESF
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: Vary: Origin
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: Vary: X-Origin
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: Vary: Referer
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: X-Content-Type-Options: nosniff
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: X-Frame-Options: SAMEORIGIN
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: X-Xss-Protection: 0
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: {
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5:   "name": "projects/(snip)/secrets/ephemeraltest-copy-source/versions/1",
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5:   "payload": {
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5:     "data": "dGVzdHZhbHVl",
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5:     "dataCrc32c": "1794917085"
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5:   }
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: }
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5
2026-01-05T06:15:24.803Z [DEBUG] provider.terraform-provider-google_v7.14.1_x5: -----------------------------------------------------

考えられる利用パターン

NG: 永続的な認証情報を生成してシークレットストアに保存する

例えば以下のようなパターン:

  • IAM ユーザーを新規作成して、アクセスキーをシークレットマネージャーに保存する。
  • Google サービスアカウントを新規作成して、サービスアカウントキーをシークレットマネージャーに保存する。

クラウドリソースを作成するような ephemeral リソースが提供されていないため、この使い方はできません。

また、仮にクラウドリソースを作成する ephemeral リソースを作ったとしても、applyplan を実行するたびに ephemeral リソースの処理が実行されてクラウドリソースが多重に作成され続ける状況になると見込まれます。
このため、実用的な観点からも、クラウドリソースを作成するような ephemeral リソースが提供されることはないと考えてよいでしょう。

provider に認証情報を与える

Terraformでマルチクラウド環境の認証情報をひとつにまとめる という記事で、 AWS の認証情報を Google Cloud のシークレットマネージャーに格納することで Google Cloud の認証情報だけで AWS のリソースも扱う Terraform について紹介しました。
その記事での課題事項としてステートファイルに認証情報が保存されてしまうことについて言及しましたが、その制限を ephemeral リソースを使うことで解決できます。

ソースコード全体

# GCPのSecret ManagerからAWSの認証情報を取得する。
# ここでは アクセスキーID:シークレットアクセスキー のフォーマットで入れている。
ephemeral "google_secret_manager_secret_version" "aws_key" {
  secret = var.awskey_secret_id
}

provider "aws" {
  region = var.aws_region

  # GCPのSecret Managerから取得した認証情報でアクセスする。
  access_key = split(":", ephemeral.google_secret_manager_secret_version.aws_key.secret_data)[0]
  secret_key = split(":", ephemeral.google_secret_manager_secret_version.aws_key.secret_data)[1]
}

data "aws_caller_identity" "current" {}

output "aws_caller_identity" {
  value = data.aws_caller_identity.current.arn
}

実行すると AWS での認証ができていることが分かります:

$ terraform apply
...
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

aws_caller_identity = "arn:aws:iam::(snip):user/ephemeraltest"

また、ステートファイルにはシークレットマネージャーに保存しているアクセスキーの情報は含まれません。

シークレットストア間の値のコピー

1回だけコピー

ephemeral リソースでシークレットの値を取得し、それを write-only argument に設定することで、シークレットストア間の値のコピーを実現できます。

ソースコード全体

# 事前にシークレットを手動作成しておく
ephemeral "google_secret_manager_secret_version" "state_test_source_by_ephemeral" {
  secret = var.source_secret_id
}

resource "google_secret_manager_secret" "state_test_target_ephemeral" {
  secret_id = "${var.basename}-state-test-target-ephemeral"

  replication {
    auto {}
  }
}

resource "google_secret_manager_secret_version" "state_test_target_ephemeral" {
  secret = google_secret_manager_secret.state_test_target_ephemeral.id

  secret_data_wo         = ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral.secret_data
  secret_data_wo_version = 1
}

ただし、コピーできるのは 1 回だけで、仮にコピー元のシークレットの値が変わっても、その変更が反映されることはありません:

$ terraform apply
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening...
google_secret_manager_secret.state_test_target_ephemeral: Refreshing state... [id=projects/(snip)/secrets/ephemeraltest-state-test-target-ephemeral]
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening complete after 0s
google_secret_manager_secret_version.state_test_target_ephemeral: Refreshing state... [id=projects/(snip)/secrets/ephemeraltest-state-test-target-ephemeral/versions/1]
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Closing...
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Closing complete after 0s

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.       
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening...
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening complete after 1s
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Closing...
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Closing complete after 0s

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Terraform が write-only argument の再適用が必要かどうかの判断に使用する secret_data_wo_version が固定値になっているためです。シークレットの値を再度同期するには、手動で secret_data_wo_version の値を変更してから apply する必要があります。

変更に対して同期させる

terraform apply 時にソースのシークレットが更新されていれば同期先にも反映したい場合、考え方としては secret_data_wo_version に設定する値を ephemeral リソースの出力から持ってくればよいのですが、 secret_data_wo_version は write-only argument ではないため、 ephemeral リソースの出力を直接参照することができません。
このため、データソースと併用する必要があります。

さらに、そのデータソースがシークレットの値を参照してしまうとステートファイルにシークレットが保存されてしまい、 ephemeral リソースを使う意味がなくなってしまいます。
このため、「シークレットのメタデータを参照するが、シークレットの値は参照しない」というデータソースを使用する必要があります。

Google のシークレットマネージャーの場合、 fetch_secret_data という設定項目があるので、これを利用可能です。

AWS のシークレットマネージャーの場合、これに対応する便利な属性がありません。aws_secretsmanager_secret_version だと secret_string / secret_binary を必ず取得してしまうため、代わりにそれらを取得しない aws_secretsmanager_secret_versions を使うのがよいでしょう。

ソースコード全体

# 事前にシークレットを手動作成しておく
ephemeral "google_secret_manager_secret_version" "state_test_source_by_ephemeral" {
  secret = var.source_secret_id
}

data "google_secret_manager_secret_version" "state_test_target_by_datasource" {
  secret = var.source_secret_id

  # これを指定することで、 secret_data が設定されない。
  fetch_secret_data = false
}

resource "google_secret_manager_secret" "state_test_target_ephemeral" {
  secret_id = "${var.basename}-state-test-target-ephemeral"

  replication {
    auto {}
  }
}

resource "google_secret_manager_secret_version" "state_test_target_ephemeral" {
  secret = google_secret_manager_secret.state_test_target_ephemeral.id

  secret_data_wo         = ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral.secret_data
  secret_data_wo_version = data.google_secret_manager_secret_version.state_test_target_by_datasource.version
}

1度実行したあと、ソースのシークレットの値を変更すると、同期先のシークレットの値も変更されます:

$ terraform apply
data.google_secret_manager_secret_version.state_test_target_by_datasource: Reading...
google_secret_manager_secret.state_test_target_ephemeral: Refreshing state... [id=projects/(snip)/secrets/ephemeraltest-state-test-target-ephemeral]
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening...
data.google_secret_manager_secret_version.state_test_target_by_datasource: Read complete after 0s [id=projects/(snip)/secrets/ephemeraltest-copy-source/versions/3]
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening complete after 0s
google_secret_manager_secret_version.state_test_target_ephemeral: Refreshing state... [id=projects/(snip)/secrets/ephemeraltest-state-test-target-ephemeral/versions/1]
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Closing...
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Closing complete after 0s

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following    
symbols:
-/+ destroy and then create replacement

Terraform will perform the following actions:

  # google_secret_manager_secret_version.state_test_target_ephemeral must be replaced
-/+ resource "google_secret_manager_secret_version" "state_test_target_ephemeral" {
      ~ create_time            = "2026-01-05T07:53:21.698109Z" -> (known after apply)
      + destroy_time           = (known after apply)
      ~ id                     = "projects/(snip)/secrets/ephemeraltest-state-test-target-ephemeral/versions/1" -> (known after apply)
      - is_secret_data_base64  = false -> null
      ~ name                   = "projects/(snip)/secrets/ephemeraltest-state-test-target-ephemeral/versions/1" -> (known after apply)
      + project                = (known after apply)
      ~ secret_data_wo_version = 2 -> 3 # forces replacement
      ~ version                = "1" -> (known after apply)
        # (4 unchanged attributes hidden)
    }

Plan: 1 to add, 0 to change, 1 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

google_secret_manager_secret_version.state_test_target_ephemeral: Destroying... [id=projects/(snip)/secrets/ephemeraltest-state-test-target-ephemeral/versions/1]
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening...
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Opening complete after 1s
google_secret_manager_secret_version.state_test_target_ephemeral: Destruction complete after 1s
google_secret_manager_secret_version.state_test_target_ephemeral: Creating...
google_secret_manager_secret_version.state_test_target_ephemeral: Creation complete after 3s [id=projects/(snip)/secrets/ephemeraltest-state-test-target-ephemeral/versions/2]
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Closing...
ephemeral.google_secret_manager_secret_version.state_test_source_by_ephemeral: Closing complete after 0s

Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

Discussion