如何通过AWS Copilot CLI实现多环境自动部署?
我是AWS新手,现有一个基于HTML/CSS/JS/PNG的静态站点项目,已通过webpack将代码编译到/dist目录,手动执行npm run build和copilot svc deploy可成功部署到development、stage、prod三个环境的S3桶中。
为实现BitBucket主分支提交后自动部署,配置了AWS Copilot Pipeline,但遇到两个问题:
- 流水线未遵循
requires_approval: true配置,直接完成所有部署阶段; - S3桶中的内容完全没有更新。
以下是针对两个问题的排查方向:
问题1:流水线不触发审批流程
检查Pipeline Manifest配置层级
requires_approval必须嵌套在对应阶段的deploy块下,放在stage根层级不会被Copilot识别。正确配置示例:
stages: - name: test test_commands: ["npm test"] - name: staging deploy: requires_approval: true app: my-app env: staging - name: production deploy: requires_approval: true app: my-app env: production
如果之前配置层级错误,执行copilot pipeline update更新配置后重新部署流水线。
验证Copilot版本
旧版本Copilot可能存在审批逻辑的bug,执行copilot --version确认版本,建议升级到最新稳定版:
npm install -g @aws-cdk/core aws-cdk npm install -g aws-copilot-cli
检查CodePipeline控制台
登录AWS CodePipeline控制台,查看生成的流水线结构,确认是否包含审批阶段。如果没有,说明manifest配置未被正确解析,需重新生成流水线。
问题2:S3桶内容未更新
核对buildspec.yml编译与产物配置
确保buildspec正确执行编译并指定产物目录:
phases: install: commands: - npm install build: commands: - npm run build artifacts: files: - '**/*' base-directory: 'dist' # 必须指向webpack编译后的目录
如果base-directory未设置或路径错误,Copilot会打包根目录文件而非编译产物,导致部署无效内容。
检查服务Manifest的静态资源配置
静态站点服务的manifest.yml需正确指定静态资源目录:
name: my-static-site type: Static Site static_assets: directory: dist # 需与buildspec的产物目录一致
目录不匹配会导致Copilot找不到要部署的文件。
分析CodeBuild日志
重点查看以下日志片段:
- Build阶段:确认
npm run build是否执行成功,有无编译报错;检查artifacts上传日志,确认是否包含dist目录下的所有文件。 - Deploy阶段:查看
copilot svc deploy的输出,是否有S3文件上传记录;排查是否存在权限错误(如CodeBuild角色无S3读写权限)。
验证流水线部署命令
确认流水线的部署步骤是否正确调用copilot svc deploy并指定了目标环境,避免因环境参数错误导致部署到了其他未关注的S3桶。
内容的提问来源于stack exchange,提问作者s3c

