仅当 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 之间的区别?