You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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部署阶段

  1. 打开AWS CodePipeline控制台,找到你的目标流水线,点击「Edit」进入编辑模式
  2. 在现有的Dev部署阶段后面,点击「Add stage」,命名为Staging
  3. 点击「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同上

第二步:新增Prod部署阶段(加手动审批更稳妥)

生产环境建议加手动审批,避免误部署:

  1. 在Staging阶段后面新增阶段,命名为Prod
  2. 先加一个审批动作
    • 动作提供者选「AWS CodePipeline」
    • 动作名称设为Approve Prod Deployment
    • 审批人填需要授权的IAM用户/组ARN,还可以配置SNS通知,让审批人收到部署提醒
  3. 审批动作之后,再添加和Staging一样的Generate Prod ChangeSetExecute Prod ChangeSet动作,注意栈名改成my-app-prod,参数设为Environment=prod

3. 调整CloudFormation模板适配多环境

默认的模板可能没考虑多环境,得改一下让它能根据参数输出不同配置:

  1. 打开项目源码仓库里的template.yml文件
  2. 先加一个Environment参数:
Parameters:
  Environment:
    Type: String
    Default: dev
    AllowedValues:
      - dev
      - staging
      - prod
  1. 在Lambda函数的环境变量里引用这个参数,方便代码里区分环境:
Resources:
  LambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      Environment:
        Variables:
          APP_ENV: !Ref Environment
          # 其他业务变量...
  1. 还可以根据环境配置不同的资源规格,比如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

火山引擎 最新活动