如何通过CDK遍历SecretManager密钥并注入Express应用环境变量?
解决方案
方式一:预先枚举公司ID(推荐)
如果公司ID是已知且固定的,直接把ID列表列出来循环生成对应的secret配置即可,这也是最符合IaC(基础设施即代码)最佳实践的方式:
// 定义所有需要接入的公司ID列表 const companyIds = ['companyA', 'companyB', 'companyC']; // 初始化基础secrets配置 const secrets: Record<string, string> = { DB_CONN_URL: `{STAGE}/myapp/db:conn-url`, }; // 循环添加每个公司的密钥映射 companyIds.forEach(companyId => { secrets[`${companyId}-key`] = `{STAGE}/myapp/companies/${companyId}:api-key`; }); // 传入栈配置 const ecsApplicationStack = new EcsApplicationStackFactory( this, { containerFolder: resolve(__dirname, `..`, `..`), stackName: SERVICE.name, secrets: secrets, // ...其他配置项 } );
这种方式的优势是栈的定义完全透明,基础设施变更可预测,后续维护也更简单。
方式二:动态读取SecretManager密钥(谨慎使用)
如果公司ID是动态新增的,不想每次加公司都修改CDK代码,可以通过**自定义资源(Custom Resource)**实现:
- 写一个Lambda函数,扫描SecretManager中符合特定前缀(比如
{STAGE}/myapp/companies/)的所有密钥,返回对应的公司ID和密钥ARN。 - 在CDK中创建自定义资源,调用这个Lambda函数获取所有公司密钥的信息。
- 遍历自定义资源返回的结果,把每个
${companyId}-key映射到对应的secret ARN,添加到ECS的secrets配置里。
但这种方式有明显局限:
- CDK部署时只会扫描一次,后续新增的公司密钥不会自动同步,必须重新部署栈。
- 自定义资源会增加栈的复杂度,调试难度更高。
- 要确保Lambda函数有足够权限读取SecretManager的列表和密钥内容。
补充说明
不管用哪种方式,只要最终ECS容器的环境变量里存在${COMPANY_ID}-key格式的键值对,原Express应用中的makeCall函数就能正常工作。
内容的提问来源于stack exchange,提问作者Samuele B.
相关产品推荐
相关产品推荐

