AWS CDK中消耗参数存储值的最佳方式是什么?

问题描述 投票:1回答:1

我在使用SSM时遇到了问题 valueForStringParameter 方法。在我第一次部署堆栈时,它可以正常工作,但当我重新部署堆栈时,它没有接收到参数值的更新,因为 CloudFormation 模板没有改变,所以 CloudFormation 认为没有更新,即使 SSM 参数已经改变。

就上下文而言,我通过 CodePipeline 部署堆栈,在那里我运行了 cdk synth 先用 CloudFormationCreateUpdateStackAction 动作来部署模板。

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

更新1我不能用 ValueFromLookup因为该值只有在运行时才会更新,作为另一个堆栈部署的一部分(我在CodePipeline中部署了两个堆栈,在2个不同的区域),所以合成时查找会导致该值失效。

amazon-cloudformation aws-cdk ssm aws-parameter-store
1个回答
2
投票

由于你不能使用查找函数,而最常见的将配置传递给cdk的方式是通过 上下文变量我只能建议一些肮脏的变通方法。

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

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)

如果你能避免 "环境不可知" syth 如果你真的需要一个不可改变的工件来跨多个环境部署,你可以使用cdk的内置包,例如,包含cdk的npm包。因此,你可以在每个环境中通过覆盖上下文参数来部署它,而不是使用ssm参数存储。


0
投票

请看 https:/docs.aws.amazon.comcdklatestguideget_ssm_value.html。您可以使用以下方法 valueFromLookup 这让你的参数存储 value 在合成时,当数值与之前的数值不同时,将触发CF栈更新。

但是,我的印象是 valueForStringParameter 应该也能在更新的ssm参数值上工作,依据是 https:/aws.amazon.comlogsmtintegrating-aws-cloudformation-with-aws-systems-manager-parameter-store。 例2:


0
投票

所有 valueOf*from* 方法通过添加CloudFormation参数来工作。正如您已经了解到的,改变参数值不会改变模板,也不会触发任何变化。

您可能希望使用的是方法 valueFromLookup. 在同步过程中,查找会被执行,结果会被放入生成的CFN模板中。

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

但是要注意,查找的结果会存储在 cdk.context.json. 如果您已经将该文件提交到您的repo,您需要通过 cdk context -e ... 在synthdiffdeploy之前。

© www.soinside.com 2019 - 2024. All rights reserved.