Bitbucket CI/CD部署.NET Core至AWS Elastic Beanstalk失败求助
排查Bitbucket CI/CD部署.NET Core到AWS Elastic Beanstalk失败的问题
我来帮你梳理这个部署失败的问题,从你的bitbucket-pipelines.yml配置来看,确实存在几个可能导致问题的点,结合Elastic Beanstalk的错误提示,我们一步步来修复:
1. 打包方式错误:嵌套ZIP导致EB无法识别应用内容
你当前的打包流程是先把publish目录文件打包成site.zip,再把site.zip和aws-windows-deployment-manifest.json打包成application.zip。这种嵌套ZIP的结构会让Elastic Beanstalk无法正确解析应用文件——EB解压后只会得到一个site.zip,而不是直接获取到应用的可执行文件和配置。
修复方案:直接将publish目录下的所有文件(包括aws-windows-deployment-manifest.json)打包成一个application.zip,不要嵌套。修改打包步骤的脚本:
script: - apt-get update && apt-get install --yes zip - export PROJECT_NAME=$PROJECT_NAME - dotnet restore $PROJECT_NAME - dotnet build $PROJECT_NAME --configuration Release - dotnet publish $PROJECT_NAME --self-contained --runtime win-x64 --configuration Release - cd /opt/atlassian/pipelines/agent/build/{my-project-name}/bin/Release/netcoreapp3.0/win-x64/publish/ - zip -r ../../../../../../application.zip .
这里做了两个关键调整:
- 切换到
Release配置(Debug环境不适合生产部署,还会包含不必要的调试文件) - 直接进入publish目录,将所有内容打包到根目录的
application.zip,确保EB能正确识别应用结构
2. 版本标签的唯一性(可选但重要)
你的版本标签是deploy-WebApi-$BITBUCKET_BUILD_NUMBER,这个本身没问题,但如果之前的部署失败后,EB环境可能残留了部分实例的旧版本,建议在重新部署时确保版本标签是全新的(比如追加时间戳),避免冲突:
VERSION_LABEL: 'deploy-WebApi-$BITBUCKET_BUILD_NUMBER-$(date +%Y%m%d%H%M%S)'
3. 验证AWS权限与EB环境状态
- 确认你的AWS密钥拥有
AWSElasticBeanstalkFullAccess或至少包含以下权限:elasticbeanstalk:CreateApplicationVersion、elasticbeanstalk:UpdateEnvironment、s3:PutObject(因为EB会把包上传到关联的S3桶) - 登录AWS控制台,进入Elastic Beanstalk环境,先终止当前失败的部署任务,确保环境处于"Ready"状态后再重新触发Bitbucket流水线
修复后的完整bitbucket-pipelines.yml示例
image: microsoft/dotnet:3.0-sdk pipelines: default: - step: name: build publish prepare and zip caches: - dotnetcore script: - apt-get update && apt-get install --yes zip - export PROJECT_NAME=$PROJECT_NAME - dotnet restore $PROJECT_NAME - dotnet build $PROJECT_NAME --configuration Release - dotnet publish $PROJECT_NAME --self-contained --runtime win-x64 --configuration Release - cd /opt/atlassian/pipelines/agent/build/{my-project-name}/bin/Release/netcoreapp3.0/win-x64/publish/ - zip -r ../../../../../../application.zip . artifacts: - application.zip - step: name: upload to elasticbeanstalk script: - pipe: atlassian/aws-elasticbeanstalk-deploy:0.5.0 variables: APPLICATION_NAME: $APPLICATION_NAME AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION: $AWS_DEFAULT_REGION ZIP_FILE: 'application.zip' ENVIRONMENT_NAME: $ENVIRONMENT_NAME WAIT: 'true' VERSION_LABEL: 'deploy-WebApi-$BITBUCKET_BUILD_NUMBER-$(date +%Y%m%d%H%M%S)'
内容的提问来源于stack exchange,提问作者XamDev
相关产品推荐
相关产品推荐

