6

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

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

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

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

4

3 回答 3

3

由于您不能使用查找函数,并且将配置传递给 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 参数存储将其部署在每个环境中。

于 2020-04-26T11:18:20.410 回答
1

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

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

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

但请注意,查找存储在cdk.context.json. 如果您已将该文件提交到您的存储库,则需要cdk context -e ...在 synth/diff/deploy 之前删除该密钥。

于 2020-04-23T07:10:17.663 回答
0

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

但是,我的印象是,也valueForStringParameter应该根据https://aws.amazon.com/blogs/mt/integrating-aws-cloudformation-with-aws-systems-manager-parameter-store处理更新的 ssm 参数值/示例 2:

于 2020-04-23T07:02:32.260 回答