如何根据部署阶段/环境为AWS SAM指定对应加载的配置文件?
按部署阶段加载Lambda多环境配置方案
你之前的判断是对的:build --container-env-var-file 传入的变量仅在构建容器生命周期内生效,不会被注入到Lambda运行时,因此process.env.myVar返回undefined是预期行为。
最轻量化的实现方式是仅传递单个阶段标识变量到Lambda运行时,代码中根据该变量动态加载对应配置文件,不需要拆分复杂JSON配置为单个参数传递,具体实现如下:
第一步:调整代码的配置加载逻辑
替换硬编码的配置引入方式,改为读取运行时环境变量动态加载:
// 读取部署阶段标识,本地运行时默认走dev配置兜底 const deployStage = process.env.DEPLOY_STAGE || 'dev'; const config = require(`./config-${deployStage}.json`); // 后续业务逻辑直接使用config对象即可
注意:
config-dev.json、config-prod.json需要放在函数代码目录下,和app.js保持可被require的相对路径关系,确保构建时会被一并打包进Lambda部署产物。
第二步:部署阶段注入阶段标识到Lambda运行时环境
核心逻辑是在部署模板中给Lambda函数配置运行时环境变量,通过部署参数传入当前阶段值即可,不同部署工具的配置方式如下:
SAM/CloudFormation 部署场景
- 在模板文件中新增阶段参数,同时给Lambda资源绑定环境变量:
# 模板Parameters段新增阶段参数 Parameters: DeployStage: Type: String AllowedValues: [dev, prod] Default: dev Description: 当前部署阶段标识 # Lambda函数资源配置中新增环境变量声明 Resources: AppLambda: Type: AWS::Lambda::Function Properties: # 保留原有Runtime、Role、CodeUri等配置不变 Environment: Variables: DEPLOY_STAGE: !Ref DeployStage
- 流水线执行部署命令时,根据当前部署环境传入对应参数值即可:
# 部署生产环境 sam deploy --parameter-overrides DeployStage=prod # 部署开发环境 sam deploy --parameter-overrides DeployStage=dev
Serverless Framework 部署场景
直接在配置文件中关联stage变量到运行时环境即可,不需要额外定义复杂参数:
provider: name: aws runtime: nodejs18.x stage: ${opt:stage, 'dev'} # 从命令行--stage参数读取阶段,默认dev environment: DEPLOY_STAGE: ${self:provider.stage}
部署时通过--stage参数指定环境即可:sls deploy --stage prod
方案选型说明
- 不推荐用Mappings存储完整配置:Mappings仅适合存储短键值对(如不同环境的资源ID、域名),存储复杂JSON对象维护成本极高,修改配置需要同步调整部署模板,灵活性远低于独立配置文件方案。
- 不推荐构建阶段替换配置文件:该方式会导致构建产物和环境强绑定,同一份构建包无法跨环境部署,本地和流水线构建产物不一致也会提升问题排查成本,运行时动态加载的方式可以实现一次构建、多环境复用,符合多环境部署的通用实践。
内容的提问来源于stack exchange,提问作者SystemCyprus
相关产品推荐
相关产品推荐

