首页 > 解决方案 > 我需要一种策略来处理 CDK 中的可选 SSM 参数存储参数

问题描述

在我的堆栈定义中,我从 SSM Parameter Store 中提取了一些参数......

const p1 = ssm.StringParameter.fromStringParameterAttributes( ... )
const p2 = ssm.StringParameter.fromStringParameterAttributes( ... )

然后我将它们作为环境变量传递给相关的 lambdas ......

environment: {
    PARAM_ONE: p1.stringValue
    PARAM_TWO: p2.stringValue
}

但是我不希望所有这些参数都是强制性的。我希望将存在的那些作为 env vars 传入,而那些不只是保持未定义的,因为我的应用程序无论如何都有默认值。但是,尝试检查 p1.stringValue 的值只是给了我一个 Token,而不是一个值,所以我不能根据它的存在或不存在做任何逻辑:https ://docs.aws.amazon.com/cdk/最新/指南/tokens.html

如果我要求参数并且它没有在 SSM 参数存储中定义,那么当它尝试构建变更集并且部署失败时,我会收到一个我无法捕获或忽略的错误......

MyApp: creating CloudFormation changeset...

❌  MyAppStack failed: Error [ValidationError]: Unable to fetch parameters [/myapp/param1,/myapp/param2] from parameter store for this account.

那么如何处理在部署时可能存在或不存在的 SSM 参数?

标签: amazon-web-servicesaws-cdkaws-parameter-store

解决方案


我假设您只是在导入中获取管理器,而不是在您的秘密中获取实际值。如果是这种情况,那么您最好的选择是利用 SDK 为您执行此操作 - 使用 SDK 进行简单调用(将在 cdk 部署或 cdk 合成器的合成阶段运行)以查看是否所述 SMM 字段/组存在。如果他们这样做,请继续导入它们。

我对 Layers 做了一些非常相似的事情——层的 from 方法需要版本号——这可能随时改变。所以我有一个小函数,可以使用 SDK 获取给定层的最新版本号,然后我可以使用它将层定义导入到我的堆栈中。

如果您试图在秘密管理器参数中获取实际秘密......对于大多数情况来说,这更适合在 CDK 之外 - 在您需要秘密的确切位置完成,这样您就不会在某处以纯文本形式获得秘密值.


推荐阅读