仅当 AWS Parameter Store 中的参数不存在时,如何创建/覆盖该参数?

Posted

技术标签:

【中文标题】仅当 AWS Parameter Store 中的参数不存在时,如何创建/覆盖该参数?【英文标题】:How to create/overwrite a parameter in AWS Parameter Store only if it does not exist? 【发布时间】:2019-10-27 05:39:52 【问题描述】:

我正在使用 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)实现所需的行为

【问题讨论】:

你为什么要让它什么都不做?处于 Terraform 状态的资源的全部意义在于对其进行管理并将其更新为预期值,从而可能纠正漂移。如果您不希望这样,那么您不应该使用 Terraform 来创建/管理资源。 好点@ydaetskcoR。我想我在构建过程中试图破解 terraform 不是为了它设计的东西。我会看看我是否可以使用 terraform 来做预期的事情;存储状态。 【参考方案1】:

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

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

【讨论】:

谢谢。我想我会看看我是否可以使用 terraform 来表示@ydaetskcoR 建议的状态。关于国家安全的好点。但是,我将状态存储在 S3 中并使用 kms 密钥对其进行加密。 任何时候我需要使用ignore_changes 通常都是一个很大的危险信号,表明我做错了,或者 Terraform 不是适合这项工作的工具。事实上,我在相当大的 Terraform 代码库中拥有ignore_changes 的唯一两个地方是处理 AWS 提供商中的几个错误。 任何时候我需要使用ignore_changes 通常都是一个很大的危险信号,表明我做错了,或者 Terraform 不是适合这项工作的工具。事实上,我在相当大的 Terraform 代码库中拥有ignore_changes 的唯一两个地方是处理 AWS 提供商中的几个错误。 如果你在自动缩放组中处理desired capacity,你肯定需要忽略对它的更改。还有其他几个用例。

以上是关于仅当 AWS Parameter Store 中的参数不存在时,如何创建/覆盖该参数?的主要内容,如果未能解决你的问题,请参考以下文章

在 CloudFormation 模板中引用 AWS Parameter Store 的安全字符串

AWS Parameter Store IAM 策略无法正常工作

AWS Cloudformation - Parameter Store

使用 powershell 创建 AWS Parameter Store 键/值对

AWS Systems Manager Parameter Store 和 AWS Secrets Manager 之间的区别?

AWS Lambda 内部的 Parameter Store 请求超时