文章介绍了 Terraform v1.10 新增的 ephemeral resources(临时资源)机制,核心目标是解决密钥、Token、证书等敏感信息在 plan/state 文件中明文落盘的安全问题。
发布于 2025 年 2 月 5 日,星期三

TL;DR: Terraform v1.10 的 ephemeral resources 是不会持久化到 state/plan 文件中的临时资源。它们只在执行期间存在,非常适合处理 secrets、动态 token 或任何不应被存储的数据。目前已由 Infisical、AWS、Azure、GCP 和 Kubernetes provider 支持。
无论你是使用 Terraform 管理云基础设施还是本地资源,很可能都遇到过如何安全管理 secrets 的挑战。诸如私钥、证书和 API token 之类的 secrets,对于运行你的基础设施至关重要——无论是与云 provider 进行身份验证、访问受保护资源,还是在服务之间建立安全连接。
直到现在,Terraform 中的这些 secrets 一直以明文形式存储在 plan 和 state 文件中;如果这些文件被泄露或意外暴露,就会带来严重的安全风险。
Ephemeral resources, 是 Terraform v1.10 中引入的一个新概念,旨在解决这些安全问题。顾名思义,它们永远不会存储在任何 artifact 中,解决了 secret 值以明文形式持久化这一长期存在的问题,并减少了你的攻击面。
虽然目前只有少数 provider 支持这一特性,包括 Infisical,但它代表着基础设施安全向前迈出的重要一步。
让我们来了解这一重要的安全进展,并通过一个实用示例帮助你增强安全态势。
Ephemeral resources 是在 Terraform v1.10 中引入的临时 Terraform 管理实体。与标准 resource 或 data source 不同,它们永远不会被持久化到 Terraform state 文件中,因此非常适合处理 secrets、临时凭证或动态 token 等敏感或短生命周期数据。实际上,有两种语言结构可以是“ephemeral”:
ephemeral = true 时,它的值只会临时存在,例如短生命周期 token 或 session 标识符。这意味着相应的值不会以明文形式出现在 state 文件中。locals、provider 设置或其他 ephemeral resources。正如 DevOps 和平台工程师已经习惯了“ephemeral”环境带来的运维收益一样,ephemeral resources 也采用了同样的“用完即弃”方式。这一策略帮助团队在保持 Terraform 强大的自动化能力和效率的同时,实施稳健的安全实践。它是 Terraform 安全模型中的一次范式转变,从多个方面增强了你的 infrastructure-as-code 实践:
阅读我们的 GitOps Secrets Management Best Practices
以下示例演示了如何通过 Infisical provider 使用一个 ephemeral resource 动态获取数据库密码,并在不将 secrets 持久化到 state 的情况下配置 PostgreSQL provider:
## 配置 Infisical provider
terraform {
required_providers {
infisical = {
source = "infisical/infisical"
}
}
}
provider "infisical" {
# 认证通过例如 GitHub Actions OIDC 处理
}
## 以 ephemeral 方式获取 secret
ephemeral "infisical_secret" "db_creds" {
name = "DB_CREDENTIALS"
env_slug = "prod"
workspace_id = var.infisical_workspace_id
folder_path = "/"
}
## 解码 secret 并配置 PostgreSQL provider
locals {
credentials = jsondecode(ephemeral.infisical_secret.db_creds.value)
}
provider "postgresql" {
host = data.aws_db_instance.example.address
port = data.aws_db_instance.example.port
username = local.credentials["username"]
password = local.credentials["password"]
}
## 在基础设施中使用该 secret(例如 RDS)
resource "aws_db_instance" "example" {
password = local.credentials["password"]
# ...
}
ephemeral block 会在 Terraform 执行期间从 Infisical 获取 secret DB_CREDENTIALS。local 值,而这个值也会因关联而成为 ephemeral。作为额外的好处,使用 Infisical 的 OIDC 集成可确保凭证是短生命周期的,并且永远不会持久化到 CI/CD logs 中。包含 GitHub Action OIDC 认证的完整示例可在这里查看。
由于这项功能相对较新,目前只有少数 provider(如 Infisical)支持这些 resources。以下是你可以用来创建 ephemeral resources 的主要 provider 列表:
| Provider | Ephemeral Resources |
|---|---|
| Infisical | infisical_secret |
| AWS | aws_secretsmanager_secret_version, aws_lambda_invocation, aws_kms_secrets, aws_cognito_identity_openid_token_for_developer_identity |
| Azure | azurerm_key_vault_secret, azurerm_key_vault_certificate |
| Google Cloud | google_service_account_access_token, google_service_account_id_token, google_service_account_jwt, google_service_account_key |
| Kubernetes | kubernetes_token_request, kubernetes_certificate_signing_request_v1 |
provider blocks、locals)。Ephemeral resources 通过支持临时且不写入 state 的数据处理方式,解决了 Terraform 中关键的安全和运维缺口。正如 Infisical 示例所展示的那样,它们在 GitOps 工作流中的 secrets 管理方面尤为强大。随着越来越多的 provider 采用这一特性,ephemeral resources 将成为安全、动态 infrastructure-as-code 实践的基石。
如需更多细节,请参考 Terraform 的官方文档或 Infisical 的集成指南。

技术作者,Infisical
- 原文链接: infisical.com/blog/terra...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!
作者暂未设置收款二维码