有条件地忽略资源更新
Conditionally ignore resource update
我有以下 SSM 资源:
resource aws_ssm_parameter private_key {
name = var.name
type = "SecureString"
value = var.key
overwrite = true
tags = var.tags
}
我无法控制提供的 var.key
的值,并且每次 terraform 运行时它都会更改。但我需要能够根据某些条件(例如,bool 变量 var.overwrite_old_value
)阻止值更新。
我不能使用 overwrite =
属性,因为如果它设置为 false
terraform 将抛出一个异常试图覆盖值
我不能使用 lifecycle { ignore_chanes = [...] }
因为它需要静态属性值并且不接受变量、函数等
有办法实现吗?
这不是 terraform 的工作方式,但您可以直接使用 aws api.
实现此行为
在这种情况下,每次您 运行 您应该输入 var.key
和 var.overwrite
的计划,这是告诉 terraform 脚本是否需要更新密钥的 bool 变量待执行。
resource "null_resource" "update_private_key" {
count = var.overwrite ? 1 : 0
provisioner "local-exec" {
command = "aws ssm put-parameter --name \"mykey\" --type \"SecureString\" --value ${var.key} --overwrite"
}
}
好的我想通了
data aws_ssm_parameter private_key {
name = var.name
}
resource aws_ssm_parameter private_key {
name = var.name
type = "SecureString"
value = var.overwrite_old_values? var.key : data.aws_ssm_parameter.private_key.value
overwrite = true
tags = var.tags
}
如果标志设置为覆盖 - 我正在分配新值,否则来自 SSM 参数本身的值,将其用作数据源(必须添加一些额外的检查,以便在参数设置之前不使用数据源已创建,但有效)。
我有以下 SSM 资源:
resource aws_ssm_parameter private_key {
name = var.name
type = "SecureString"
value = var.key
overwrite = true
tags = var.tags
}
我无法控制提供的 var.key
的值,并且每次 terraform 运行时它都会更改。但我需要能够根据某些条件(例如,bool 变量 var.overwrite_old_value
)阻止值更新。
我不能使用 overwrite =
属性,因为如果它设置为 false
terraform 将抛出一个异常试图覆盖值
我不能使用 lifecycle { ignore_chanes = [...] }
因为它需要静态属性值并且不接受变量、函数等
有办法实现吗?
这不是 terraform 的工作方式,但您可以直接使用 aws api.
实现此行为在这种情况下,每次您 运行 您应该输入 var.key
和 var.overwrite
的计划,这是告诉 terraform 脚本是否需要更新密钥的 bool 变量待执行。
resource "null_resource" "update_private_key" {
count = var.overwrite ? 1 : 0
provisioner "local-exec" {
command = "aws ssm put-parameter --name \"mykey\" --type \"SecureString\" --value ${var.key} --overwrite"
}
}
好的我想通了
data aws_ssm_parameter private_key {
name = var.name
}
resource aws_ssm_parameter private_key {
name = var.name
type = "SecureString"
value = var.overwrite_old_values? var.key : data.aws_ssm_parameter.private_key.value
overwrite = true
tags = var.tags
}
如果标志设置为覆盖 - 我正在分配新值,否则来自 SSM 参数本身的值,将其用作数据源(必须添加一些额外的检查,以便在参数设置之前不使用数据源已创建,但有效)。