仅当 AWS Parameter Store 中的参数不存在时,如何 create/overwrite 参数?

How to create/overwrite a parameter in AWS Parameter Store only if it does not exist?

我正在使用 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: The parameter already exists. To overwrite this value, set the overwrite option in the request to true

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

overwrite = false 的当前行为是

If the parameter does not exist, create it
If the parameter exists, throw exception

我想达到的是

If the parameter does not exist, create it
If the parameter exists, do nothing

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

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

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

但是如果你坚持忽略要更新的值,如果 SSM 密钥存在,你可以使用生命周期 ignore_changes(https://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 - (Optional) Overwrite an existing parameter. If not specified, will default to false if the resource has not been created by terraform to avoid overwrite of existing resource and will default to true otherwise (terraform lifecycle rules should then be used to manage the update behavior).

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