1.4.12.1. Ephemeral 资源
临时(Ephemeral)资源是本质上是临时的(Temporary) Terraform 资源。临时资源具有独特的生命周期,Terraform 不会将它们存储在其状态文件中。每个 ephemeral
块描述一个或多个临时资源,例如临时密码或与另一个系统的连接。
ephemeral
块的声明包含了临时资源的类型以及本地名,就像 resource
块那样。 Terraform 使用临时资源的名称来引用同一模块中的该资源,但临时资源的名称在该模块的范围之外没有任何意义。
1.4.12.1.1. 生命周期
ephemeral
的生命周期与 resource
和 data
不同。当 Terraform 创建临时资源时,它会执行以下步骤:
- 如果 Terraform 需要访问临时资源的结果,它将“打开”该临时资源。例如,如果 Terraform “打开”一个包含了 Vault 机密的临时资源,则 Vault 的 Provider 将获取租约并返回一个机密。
- 如果 Terraform 需要访问临时资源的时间比远程系统为机密设置的过期时间还长,Terraform 会要求 Provider 定期续约。例如,如果 Terraform 对包含了 Vault 机密的临时资源续约,则 Vault Provider 程序将调用 Vault 的租约续约 API 来延长到期时间。
- 一旦 Terraform 不再需要临时资源,Terraform 就会将其关闭。这种情况发生在依赖于某个临时资源的 Provider 完成当前 Terraform 运行阶段的所有工作之后。例如,关闭 Vault 机密临时资源意味着 Vault Provider 明确吊销租约,从而使得 Vault 立即撤销相关凭证。
Terraform 对于给定配置中的每个临时资源实例都遵循这些生命周期步骤。
1.4.12.1.2. 依赖图
临时资源对应了 Terraform 依赖关系图中的节点,其交互方式与 resource
和 data
类似。例如,当 resource
或 data
依赖于临时资源的属性时,Terraform 首先自动配置临时资源。
1.4.12.1.3. 临时资源的声明
ephemeral
块中的绝大多数参数是由您正在定义的临时资源类型所决定的。与 resource
和 data
一样,Terraform 注册表中的每个 Provider 程序都包含其支持的临时资源(如果有)的文档。临时资源类型的文档列出了可用的参数以及应如何配置的格式。
临时资源由两部分组成:
- 属性
- 元参数
ephemeral
块的结构如下:
ephemeral "<resource_type>" "<resource_name>" {
<attributes>
<meta-arguments>
}
1.4.12.1.4. 引用临时资源
只允许在特定的临时上下文中引用临时资源,否则 Terraform 会返回错误。以下是可以引用临时资源的上下文:
- 另一个临时资源
- 局部值
- 临时输入变量
- 临时输出值
- 在
provider
块中配置 Provider provisioner
与connection
块
1.4.12.1.5. 元参数
我们可以将在临时资源块内声明以下元参数,来更改这些资源的行为。以下元参数对于资源、数据源和临时资源的工作方式相同:
临时资源不支持 provisioner
元参数。
1.4.12.1.6. 示例
以下示例使用临时资源的凭据配置 postgresql
Provider 程序。由于这些凭据由临时资源管理,因此 Terraform 不会将它们存储在状态或计划文件中。
ephemeral "aws_secretsmanager_secret_version" "db_master" {
secret_id = data.aws_db_instance.example.master_user_secret[0].secret_arn
}
locals {
credentials = jsondecode(ephemeral.aws_secretsmanager_secret_version.db_master.secret_string)
}
provider "postgresql" {
host = data.aws_db_instance.example.address
port = data.aws_db_instance.example.port
username = local.credentials["username"]
password = local.credentials["password"]
}