CodeDeploy部署报错:修订版本超51200B上限求助
解决CodeDeploy ECS部署报错:The revision size is too large
我一眼就看出问题所在了——你混淆了CodeDeploy针对EC2和ECS部署的修订包要求,导致上传的Zip体积远超限制。下面给你一步步拆解问题和解决方案:
错误原因
CodeDeploy对于ECS部署的修订包(也就是你上传到S3的Zip文件)有严格的体积限制:最大50KB(51200字节)。这是因为ECS部署的修订包根本不需要包含你的应用代码,它只需要存放部署配置文件(appspec.yml和ECS任务定义JSON)。而你现在把整个NodeJS项目打包上传,体积肯定远超过50KB,自然触发了这个错误。
正确的ECS部署流程调整
ECS部署的核心是通过Docker镜像交付应用,CodeDeploy只负责更新ECS服务的任务定义。正确的Travis CI流程应该是:
- 构建NodeJS项目并执行测试
- 构建Docker镜像,推送到AWS ECR(或其他镜像仓库)
- 生成更新后的ECS任务定义JSON(替换镜像地址为当前构建版本)
- 编写ECS专用的
appspec.yml - 把
appspec.yml和任务定义JSON打包成一个小体积Zip - 上传这个Zip到S3,触发CodeDeploy部署
具体配置修改
1. 调整.travis.yml配置
替换你当前的before_deploy和deploy部分,改成如下内容(根据你的实际信息替换占位符):
language: node_js node_js: - '12' before_install: # 安装AWS CLI用于操作ECR和其他AWS服务 - pip install --user awscli - export PATH=$PATH:$HOME/.local/bin # 登录AWS ECR(如果用Docker Hub的话替换为对应登录命令) - aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <你的ECR仓库URI> script: - npm install - npm test # 执行你的测试用例 before_deploy: # 构建Docker镜像并推送到ECR,用Travis构建号作为镜像标签 - docker build -t <你的ECR仓库URI>:$TRAVIS_BUILD_NUMBER . - docker push <你的ECR仓库URI>:$TRAVIS_BUILD_NUMBER # 从模板生成最新的任务定义(先准备一个task-definition.json.tpl模板文件) - sed -e "s/<IMAGE_URI>/<你的ECR仓库URI>:$TRAVIS_BUILD_NUMBER/" task-definition.json.tpl > task-definition.json # 打包部署配置文件(只有appspec.yml和task-definition.json,体积极小) - zip deployment.zip appspec.yml task-definition.json deploy: - provider: s3 bucket: "myBucket" access_key_id: secure: keystuff secret_access_key: secure: keystuff local_dir: . upload_dir: deployments # 可选,在S3中创建一个目录存放部署包 skip_cleanup: true on: branch: develop - provider: codedeploy bucket: "myBucket" key: deployments/deployment.zip # 对应S3中的文件路径 bundle_type: zip application: "myApp" deployment_group: "myDeploymentGroup" region: "us-east-1" access_key_id: secure: keystuff secret_access_key: secure: keystuff on: branch: develop
2. 准备ECS任务定义模板
创建一个task-definition.json.tpl文件,把其中的镜像地址用占位符<IMAGE_URI>代替,示例:
{ "family": "<你的任务定义名>", "networkMode": "awsvpc", "containerDefinitions": [ { "name": "<你的容器名>", "image": "<IMAGE_URI>", "essential": true, "portMappings": [ { "containerPort": 3000, "hostPort": 3000, "protocol": "tcp" } ] } ], "requiresCompatibilities": ["FARGATE"], "cpu": "256", "memory": "512" }
3. 编写ECS专用的appspec.yml
替换你当前的appspec.yml为ECS部署专用的配置,示例:
version: 0.0 os: linux resources: - targetService: type: AWS::ECS::Service properties: clusterName: "<你的ECS集群名>" serviceName: "<你的ECS服务名>" taskDefinition: "<你的任务定义名>" # CodeDeploy会自动使用打包的task-definition.json创建新版本 hooks: # 可选:添加部署前后的钩子脚本,如果不需要可以删除hooks部分 BeforeDeployment: - location: scripts/before-deployment.sh timeout: 300 AfterDeployment: - location: scripts/after-deployment.sh timeout: 300
验证调整
修改完成后重新触发Travis CI构建:
- 构建会自动把Docker镜像推送到ECR
- 生成的
deployment.zip体积应该只有几KB,完全符合CodeDeploy的限制 - CodeDeploy会读取这个Zip中的配置,更新你的ECS服务,完成部署
内容的提问来源于stack exchange,提问作者opticon
相关产品推荐
相关产品推荐

