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

Tof*_*nov 5 aws-cloudformation ssm aws-parameter-store aws-cdk

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

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

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

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

udo*_*dan 5

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

您可能想使用的是 method valueFromLookup。在合成过程中执行查找,并将结果放入生成的 CFN 模板中。

ssm.StringParameter.valueFromLookup(this, 'param-name');
Run Code Online (Sandbox Code Playgroud)

但请注意,查找存储在cdk.context.json. 如果您已将该文件提交到存储库,则需要cdk context -e ...在合成/差异/部署之前通过删除该密钥。


Ped*_*iro 3

由于您无法使用查找函数,并且将配置传递给 cdk 的最常见方法是通过上下文变量,因此我只能建议肮脏的解决方法。

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

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

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

cdk synth -c deploymentId=$(uuidgen)
Run Code Online (Sandbox Code Playgroud)

如果您可以避免“与环境无关”,syth并且确实需要一个不可变的工件来跨多个环境部署,则可以使用 cdk 中构建的包,例如包含 cdk 的 npm 包。因此,您可以通过覆盖上下文参数而不是使用 ssm 参数存储来将其部署在每个环境中。