如何在AWS CodeStar与CodePipeline中为Lambda服务配置多环境?
扩展AWS CodeStar Express.js Lambda流水线到多环境(Dev/Staging/Prod)
我明白你现在的处境——用CodeStar的「Express.js Aws Lambda Webservice」模板搭好应用后,默认的CI/CD流水线只覆盖了Dev环境,现在想扩展到Dev、Staging、Prod多环境部署对吧?下面我给你一步步拆解实操方案,亲测有效:
1. 先搞懂默认流水线的部署逻辑
默认的部署阶段核心是两个CloudFormation动作:
GenerateChangeSet:根据项目的CloudFormation模板生成环境变更集ExecuteChangeSet:把变更集应用到Dev环境的CloudFormation栈
要扩展多环境,本质就是给每个环境复制这一组动作,再配上对应的环境配置和触发规则。
2. 给CodePipeline添加Staging和Prod阶段
第一步:新增Staging部署阶段
- 打开AWS CodePipeline控制台,找到你的目标流水线,点击「Edit」进入编辑模式
- 在现有的Dev部署阶段后面,点击「Add stage」,命名为
Staging - 点击「Add action group」,添加两个动作:
- 动作1:Generate Staging ChangeSet
- 动作提供者选「AWS CloudFormation」
- 动作模式选「Create or replace a change set」
- 栈名称设为和Dev区分的名字,比如
my-app-staging - 变更集名称设为
my-app-staging-changeset - 模板路径选择CodeBuild输出到S3的CloudFormation模板(默认路径是
codestar-xxx/build-output/template.yml) - 配置参数里可以加个
Environment=staging,方便后续模板区分环境 - 角色ARN选具备CloudFormation部署权限的角色(可以用CodeStar自动创建的角色,或者新建)
- 动作2:Execute Staging ChangeSet
- 动作提供者选「AWS CloudFormation」
- 动作模式选「Execute a change set」
- 栈名称和变更集名称和上面的Staging配置保持一致
- 角色ARN同上
- 动作1:Generate Staging ChangeSet
第二步:新增Prod部署阶段(加手动审批更稳妥)
生产环境建议加手动审批,避免误部署:
- 在Staging阶段后面新增阶段,命名为
Prod - 先加一个审批动作:
- 动作提供者选「AWS CodePipeline」
- 动作名称设为
Approve Prod Deployment - 审批人填需要授权的IAM用户/组ARN,还可以配置SNS通知,让审批人收到部署提醒
- 审批动作之后,再添加和Staging一样的
Generate Prod ChangeSet和Execute Prod ChangeSet动作,注意栈名改成my-app-prod,参数设为Environment=prod
3. 调整CloudFormation模板适配多环境
默认的模板可能没考虑多环境,得改一下让它能根据参数输出不同配置:
- 打开项目源码仓库里的
template.yml文件 - 先加一个
Environment参数:
Parameters: Environment: Type: String Default: dev AllowedValues: - dev - staging - prod
- 在Lambda函数的环境变量里引用这个参数,方便代码里区分环境:
Resources: LambdaFunction: Type: AWS::Lambda::Function Properties: Environment: Variables: APP_ENV: !Ref Environment # 其他业务变量...
- 还可以根据环境配置不同的资源规格,比如Prod环境给Lambda加内存:
MemorySize: !If - !Equals [!Ref Environment, prod] - 512 - 128
4. 可选:调整CodeBuild适配多环境构建
如果不同环境需要不同的构建产物,比如不同的配置文件,可以修改buildspec.yml:
phases: build: commands: - echo "Building for $ENVIRONMENT environment" - cp config/$ENVIRONMENT.json config/current.json - npm run build
然后在CodePipeline的构建阶段或者各部署阶段,传递ENVIRONMENT环境变量即可。
5. 测试多环境流水线
提交一段代码到源码仓库,触发流水线:
- 先看Dev环境自动部署完成
- 接着Staging环境自动部署
- Staging完成后,等待Prod的审批通知,审批通过后Prod环境开始部署
这样你的流水线就完整覆盖Dev、Staging、Prod三个环境的部署流程了。
内容的提问来源于stack exchange,提问作者Jim




