如何通过Github Actions将AWS ECR的Docker镜像部署到Elastic Beanstalk
问题解决:ECR镜像部署到Elastic Beanstalk的Github Actions配置
核心问题原因
你之前的代码仅创建了应用版本,但未给Elastic Beanstalk提供镜像引用配置——EB不知道要拉取哪个ECR镜像,因此即使版本显示生成成功,环境也不会更新内容。
必须的配置文件:Dockerrun.aws.json
是的,你需要Dockerrun.aws.json文件,它是EB容器环境的核心配置文件,用来指定ECR镜像地址、端口映射、环境变量等。单容器部署的基础配置如下:
{ "AWSEBDockerrunVersion": "1", "Image": { "Name": "<ECR_IMAGE_URI>", "Update": "true" }, "Ports": [ { "ContainerPort": "3000" } ] }
(注:Next.js默认端口为3000,可根据实际配置调整)
Github Workflow部署步骤的正确写法
部署流程需完成:生成包含Dockerrun.aws.json的zip包、上传到S3、创建关联该zip的应用版本、更新环境。完整代码如下:
- name: Deploy to Elastic Beanstalk run: | # 获取ECR镜像URI ECR_REGISTRY="${{ steps.login-ecr.outputs.registry }}" ECR_REPOSITORY=<你的仓库名> IMAGE_TAG="${{ github.sha }}" ECR_IMAGE_URI="$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" # 生成版本标签(避免特殊字符) VERSION_LABEL="deploy-${{ github.sha }}" # 创建临时目录并生成Dockerrun.aws.json mkdir -p eb-deploy cat > eb-deploy/Dockerrun.aws.json << EOF { "AWSEBDockerrunVersion": "1", "Image": { "Name": "$ECR_IMAGE_URI", "Update": "true" }, "Ports": [ { "ContainerPort": "3000" } ] } EOF # 打包成zip文件 zip -r eb-deploy.zip eb-deploy/ # 上传zip到S3(可使用EB默认存储桶或自行创建) S3_BUCKET="<你的S3桶名>" aws s3 cp eb-deploy.zip s3://$S3_BUCKET/eb-deploy/$VERSION_LABEL.zip # 创建应用版本,关联S3中的zip包 aws elasticbeanstalk create-application-version \ --application-name <你的应用名> \ --version-label $VERSION_LABEL \ --source-bundle S3Bucket=$S3_BUCKET,S3Key=eb-deploy/$VERSION_LABEL.zip \ --auto-create-application # 更新EB环境使用新版本 aws elasticbeanstalk update-environment \ --environment-name <你的环境名> \ --version-label $VERSION_LABEL
关键注意事项
- AWS权限:确保Github Actions使用的IAM角色拥有
S3:PutObject(S3上传)、elasticbeanstalk:CreateApplicationVersion、elasticbeanstalk:UpdateEnvironment权限,同时EB环境的实例角色需具备ECR镜像拉取权限。 - S3桶:可使用EB自动创建的默认存储桶(命名格式一般为
elasticbeanstalk-<区域>-<账号ID>),也可自行创建。 - 端口配置:若Next.js应用使用非3000端口,需修改
Dockerrun.aws.json中的ContainerPort,并确保EB环境安全组开放对应端口。
内容的提问来源于stack exchange,提问作者ejdzey
相关产品推荐
相关产品推荐

