部署至AWS Elastic Beanstalk的Source Bundle为何加载时出现404错误?
核心原因
Elastic Beanstalk默认会生成指向**elasticbeanstalk-<区域>-<账号ID>**专属存储桶的源码包链接,当你通过CodePipeline将构建产物上传到自定义S3桶时,EB无法自动识别这个自定义路径,导致生成的链接路径错误,触发404。
解决方案
1. 调整CodePipeline部署动作,同步产物到EB专属桶
在CodePipeline的Deploy阶段,添加一个AWS CLI部署动作,将自定义工件桶内的构建产物同步到EB专属存储桶,路径需符合EB命名规范:
aws s3 cp s3://<你的自定义工件桶>/<构建产物路径> s3://elasticbeanstalk-<区域>-<账号ID>/<应用名>/<版本标签>/<产物文件名>
完成同步后再执行EB部署动作,EB就能生成指向专属桶的有效链接。
2. 手动更新应用版本的源码包路径
若不想修改流水线,可通过AWS CLI强制更新应用版本的Source Bundle指向自定义桶的正确路径:
aws elasticbeanstalk update-application-version \ --application-name <你的应用名> \ --version-label <版本标签> \ --source-bundle S3Bucket=<你的自定义工件桶>,S3Key=<构建产物的完整S3路径>
执行后刷新EB的Application Versions页面,链接即可正常跳转。
3. 修正生命周期规则配置
确认自定义工件桶的生命周期规则未提前删除产物;同时检查EB应用版本的生命周期规则,确保**"保留S3中的Source Bundle"**选项指向你的自定义桶(默认是EB专属桶),可在EB控制台的应用版本生命周期设置页面调整存储目标桶。
4. 验证S3桶权限
确保EB服务角色(通常为aws-elasticbeanstalk-service-role)拥有自定义工件桶的s3:GetObject权限,避免因权限问题导致链接404。可在桶的权限策略中添加:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "elasticbeanstalk.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<你的自定义工件桶>/*" } ] }
额外说明
EB的Application Versions页面链接是动态生成的,依赖应用版本创建时指定的Source Bundle路径。如果通过CodePipeline自动创建应用版本,需确保流水线在创建版本时明确指定自定义桶的S3路径,而非让EB默认生成。
内容的提问来源于stack exchange,提问作者Michael Harris

