有条件地忽略资源更新

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.keyvar.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 参数本身的值,将其用作数据源(必须添加一些额外的检查,以便在参数设置之前不使用数据源已创建,但有效)。