在 AWS CDK 中使用 Parameter Store 值的最佳方式是什么

What's the best way to consume Parameter Store value in AWS CDK

我在 CDK 中使用 SSM valueForStringParameter 方法时遇到问题。它在我第一次部署堆栈时工作,但当我重新部署堆栈时它没有获取参数值的更新,因为 CloudFormation 模板没有更改,因此 CloudFormation 认为没有更新,即使 SSM 参数已更改。

对于上下文,我通过 CodePipeline 部署堆栈,我首先 运行 cdk synth,然后使用 CloudFormationCreateUpdateStackAction 操作部署模板。

有人知道如何解决这个问题吗?我知道唯一可行的其他选项是切换到使用 aws-sdk 调用 SSM 和 returns 值的自定义资源 lambda,但这感觉像是一个过于复杂的选项。

更新 1 我不能使用 ValueFromLookup,因为值仅在 运行 时间更新,作为 cloudformation 部署的一部分由另一个堆栈(我在 CodePipeline 中部署两个堆栈,在 2 个不同的区域),因此综合时间查找会导致陈旧值。

参见https://docs.aws.amazon.com/cdk/latest/guide/get_ssm_value.html,您可以使用方法valueFromLookup在合成时获取参数存储value,当值与前一个不同时,这将触发CF堆栈更新。

然而,我的印象是 valueForStringParameter 也应该在更新的 ssm 参数值上工作,基于 https://aws.amazon.com/blogs/mt/integrating-aws-cloudformation-with-aws-systems-manager-parameter-store/ 示例 2:

所有 valueOf*from* 方法都通过添加 CloudFormation 参数来工作。正如您已经知道的那样,更改参数值不会更改模板,也不会触发任何更改。

您可能想改用方法 valueFromLookup。在合成期间执行查找,并将结果放入生成的 CFN 模板中。

ssm.StringParameter.valueFromLookup(this, 'param-name');

但请注意,查找存储在 cdk.context.json 中。如果您已将该文件提交到您的存储库,则需要在 synth/diff/deploy.

之前通过 cdk context -e ... 删除该密钥

由于您不能使用查找函数,并且将配置传递给 cdk 的最常见方式是通过 context variables,我只能建议肮脏的解决方法。

例如,您可以在堆栈中创建一个虚拟参数,以便在每次部署时进行碰撞。

var deploymentId = new CfnParameter(this, "deploymentId", new CfnParameterProps() { Type = "String", Description = "Deployment Id" });
SetParameterValue(deploymentId, this.Node.GetContext("deploymentId").ToString());

当你合成CF时,你可以生成一个ID:

cdk synth -c deploymentId=$(uuidgen)

如果你可以避免 "environment agnostic" syth 并且你确实需要一个不可变的工件来跨多个环境部署,你可以使用从你的 cdk 构建的包,例如,包含的 npm 包你的CDK。因此,您可以通过覆盖上下文参数而不是使用 ssm 参数存储在每个环境中部署它。