5

我正在使用 terraform 在 AWS Parameter Store 中创建一个参数。

resource "aws_ssm_parameter" "username" {
  name      = "username"
  type      = "SecureString"
  value     = "to_be_defined"
  overwrite = false
}

provider "aws" {
  version = "~> 1.53"
}

当我第一次运行terraform apply时,如果参数不存在 terraform 创建参数。但是,如果我再次运行它(通常使用不同的值),我会收到错误

ParameterAlreadyExists:参数已经存在。要覆盖此值,请将请求中的覆盖选项设置为 true

如果我理解正确,这是由于 AWS Cli 的行为(不是特定于提供商)。

当前的行为overwrite = false

如果参数不存在,则创建它
如果参数存在,则抛出异常

我想要实现的是

如果参数不存在,则创建它
如果参数存在,则不执行任何操作

我没有在AWS CLI 文档中找到实现所需行为的方法。

我想知道是否有任何方法可以使用 terraform(或直接通过 AWS CLI)实现所需的行为

4

1 回答 1

10

我同意@ydaetskcoR 的观点,即您也应该使用 terraform state 来维护该值。

但是,如果您坚持在存在 SSM 密钥的情况下忽略要更新的值,则可以使用生命周期ignore_changeshttps://www.terraform.io/docs/configuration/resources.html#ignore_changes

因此,在您的情况下,您可以将代码更新为

resource "aws_ssm_parameter" "username" {
  name      = "username"
  type      = "SecureString"
  value     = "to_be_defined"
  overwrite = false

  lifecycle {
    ignore_changes = [
      value,
  ]
}

覆盖 - (可选)覆盖现有参数。如果未指定,如果 terraform 尚未创建资源以避免覆盖现有资源,则默认为 false,否则默认为 true ( terraform lifecycle rules should then be used to manage the update behavior)。

顺便说一句,SecureString用 terraform 管理 SSM 键/值并不是一个好的设计,因为它的 tfstate 文件没有加密。

于 2019-06-13T00:06:27.140 回答