求助:GitHub Action部署Spring Java应用至AWS ECS遇阻塞问题
排查ECS部署停滞与EC2连接问题的实操步骤
一、先搞定EC2 Instance Connect无法连接的问题(这是ECS任务运行的基础)
- 检查EC2实例安全组:入站规则必须允许EC2 Instance Connect服务的SSH流量(端口22,来源选对应区域的EC2 Instance Connect前缀列表,比如
com.amazonaws.us-east-1.ec2-instance-connect);出站规则要允许访问互联网(拉取ECR镜像、连接AWS服务都需要)。 - 核对实例IAM角色:确保实例绑定的IAM角色包含
EC2InstanceConnect相关权限,比如直接附加AmazonEC2InstanceConnectFullAccess策略,或者自定义策略允许ec2-instance-connect:SendSSHPublicKey操作。 - 确认实例网络配置:实例必须在公有子网且分配了公有IP,或者所在子网有NAT网关能访问互联网(Instance Connect需要实例能对接AWS服务端点)。
- 控制台直接测试:在AWS控制台用EC2 Instance Connect尝试连接,看具体报错提示(比如权限不足、实例无公网IP),直接定位问题。
二、排查ECS任务一直处于Provisioning状态的问题
- 检查ECS容器实例状态:在ECS控制台→集群→「ECS实例」页面,确认实例状态是
ACTIVE,如果是DRAINING或INACTIVE,说明实例无法接收新任务,需要替换或修复实例。 - 验证镜像拉取权限:ECS任务执行角色必须有
AmazonEC2ContainerRegistryReadOnly权限;另外手动在EC2实例上测试拉取镜像:
看是否能成功拉取,排除镜像不存在或权限问题。aws ecr get-login-password | docker login --username AWS --password-stdin <你的账号ID>.dkr.ecr.<区域>.amazonaws.com docker pull <你的镜像地址>:<标签> - 核对任务资源配置:任务定义里的CPU、内存配额不能超过EC2实例的可用资源(比如t2.micro实例最多只能分配1vCPU+1GB内存),去ECS控制台任务详情的「事件」标签,看是否有资源不足的报错。
- 检查任务网络配置:如果用awsvpc模式,任务安全组要允许Spring应用端口的流量,以及容器到ECR、AWS服务的出站流量;用bridge模式的话,确认实例Docker网络配置正常。
- 查看任务日志:在任务定义里配置
awslogs日志驱动,指定CloudWatch日志组,然后去CloudWatch看具体报错(比如Spring应用启动失败、端口冲突、依赖缺失等)。
三、解决GitHub Action部署步骤停滞的问题
- 检查AWS凭证权限:GitHub Secrets里的
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY必须有足够权限,比如附加AmazonECSFullAccess策略,至少要包含ecs:RegisterTaskDefinition、ecs:UpdateService、ecr:GetDownloadUrlForLayer等操作权限。 - 查看Action步骤日志:在GitHub仓库的Actions页面,点开停滞的「Deploy Amazon ECS task definition」步骤,展开日志看具体报错(比如权限不足、无法连接AWS ECS服务)。
- 本地手动测试部署:用相同的AWS凭证在本地执行命令:
看是否能成功,以此判断是GitHub Action的问题还是AWS侧的问题。aws ecs update-service --cluster <集群名称> --service <服务名称> --task-definition <任务定义ARN>
四、其他可能的排查点
- 检查ECS集群容量提供者:如果用了容量提供者,确认自动扩缩容配置正常,实例能自动创建并加入集群。
- 测试Spring容器启动:本地手动运行容器
docker run -p 8080:8080 <你的镜像名>,看应用是否能正常启动、访问,排除应用本身的问题。 - 核对AWS区域:确保GitHub Action里指定的AWS区域和ECS集群、ECR仓库的区域完全一致,跨区域会导致网络或权限问题。
内容的提问来源于stack exchange,提问作者Maksym Matveichuk
相关产品推荐
相关产品推荐

