有条件地忽略资源更新

时间:2021-03-05 17:03:23

标签: terraform terraform-provider-aws aws-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 = [...] },因为它需要静态属性值并且不接受变量、函数等。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

这不是 terraform 的工作方式,但您可以直接使用 aws api 实现此行为。

在这种情况下,每次运行计划时,您都应该输入 var.keyvar.overwrite,它们是 bool 变量,它告诉 terraform 是否需要执行更新密钥的脚本。

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"
  }
}

答案 1 :(得分:0)

好的,我找到了方法

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