You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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)**实现:

  1. 写一个Lambda函数,扫描SecretManager中符合特定前缀(比如{STAGE}/myapp/companies/)的所有密钥,返回对应的公司ID和密钥ARN。
  2. 在CDK中创建自定义资源,调用这个Lambda函数获取所有公司密钥的信息。
  3. 遍历自定义资源返回的结果,把每个${companyId}-key映射到对应的secret ARN,添加到ECS的secrets配置里。

但这种方式有明显局限:

  • CDK部署时只会扫描一次,后续新增的公司密钥不会自动同步,必须重新部署栈。
  • 自定义资源会增加栈的复杂度,调试难度更高。
  • 要确保Lambda函数有足够权限读取SecretManager的列表和密钥内容。

补充说明

不管用哪种方式,只要最终ECS容器的环境变量里存在${COMPANY_ID}-key格式的键值对,原Express应用中的makeCall函数就能正常工作。

内容的提问来源于stack exchange,提问作者Samuele B.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:57:14