我需要一种策略来处理 CDK 中的可选 SSM 参数存储参数
Posted
技术标签:
【中文标题】我需要一种策略来处理 CDK 中的可选 SSM 参数存储参数【英文标题】:I need a strategy for handling optional SSM Parameter Store parameters in CDK 【发布时间】:2021-12-17 08:10:55 【问题描述】:在我的堆栈定义中,我从 SSM Parameter Store 中提取了一些参数...
const p1 = ssm.StringParameter.fromStringParameterAttributes( ... )
const p2 = ssm.StringParameter.fromStringParameterAttributes( ... )
然后我将它们作为环境变量传递给相关的 lambda...
environment:
PARAM_ONE: p1.stringValue
PARAM_TWO: p2.stringValue
但是我不希望所有这些参数都是强制性的。我希望将存在的那些作为 env vars 传入,而那些不只是保持未定义的,因为我的应用程序无论如何都有默认值。但是,尝试检查 p1.stringValue 的值只会给我一个 Token,而不是一个值,所以我不能根据它的存在或不存在做任何逻辑:https://docs.aws.amazon.com/cdk/latest/guide/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 参数?
【问题讨论】:
您的要求是违反 AWS 最佳实践 - 您的 CDK 应用程序应在每个环境中合成到相同的 CloudFormation 模板。您不应在 CDK 代码中基于现有环境进行任何测试。 【参考方案1】:我假设您只是在导入中获取管理器,而不是在您的秘密中获取实际值。如果是这种情况,那么您最好的选择是利用 SDK 为您执行此操作 - 使用 SDK 进行简单调用(将在 cdk 部署或 cdk 合成器的合成阶段运行)以查看是否所述 SMM 字段/组存在。如果有,请继续导入它们。
我对 Layers 做了一些非常相似的事情——layers 的 from 方法需要版本号——它可能随时改变。所以我有一个小函数,可以使用 SDK 获取给定层的最新版本号,然后我可以使用它将层定义导入到我的堆栈中。
如果您试图在秘密管理器参数中获取实际秘密......对于大多数情况来说,这更适合在 CDK 之外 - 在您需要秘密的确切位置完成,因此您最终不会在某处的纯文本。
【讨论】:
这违背了最佳实践 - 您的 CDK 应用程序应该是确定性的,并且不应在合成期间进行网络调用。 谢谢。我没有将它用于秘密,仅用于配置参数,我在运行时直接访问的秘密。我对此也很陌生,我想我知道如何使用 sdk 来检查参数,但我不认为你可以更明确地说明代码应该去哪里。我对“在合成器阶段运行”有点困惑。我是否只是将我的 .fromStringParameterAttributes() 调用包装在我的堆栈定义中的 sdk 调用中以检查它们?如果是这样,那就太好了,谢谢! @gshpychka 我的阅读是,这是需要仔细考虑但并非绝对禁止的事情,但是您有更好的方法来完成我想要做的事情吗?更符合最佳做法的东西? @RogerHeathcote 您可以将参数名称传递给 lambda,然后使用 SDK 从 lambda 中读取值。您需要先为 lambda 角色提供适当的访问权限。 @gshpychka - 如果没有版本号,您根本无法将已经存在的层导入新的 CDK 堆栈。为避免这种情况,您必须对版本号进行硬编码。最佳实践都是好的,但在某些情况下,您需要的部分超出了您的控制范围,您必须以这种方式执行。无论如何,使用 SDK 正是基础级别构造所做的事情,并且自己这样做是完全可以接受的做法。以上是关于我需要一种策略来处理 CDK 中的可选 SSM 参数存储参数的主要内容,如果未能解决你的问题,请参考以下文章