仅在不存在的情况下如何在AWS Parameter Store中创建/覆盖参数?

时间:2019-06-12 16:31:01

标签: terraform aws-cli terraform-provider-aws ssm

我正在使用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 documentation中找到实现所需行为的方法。

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

1 个答案:

答案 0 :(得分:3)

我同意@ydaetskcoR,也应该使用terraform状态来保持该值。

但是,如果在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,
  ]
}
  

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

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