使用CDK部署ECS服务失败:实例无法联网且无法注册集群
ECS容器实例无法注册、服务无法放置任务的排查与修复方案
针对部署ClickHouse(用于Plausible Analytics托管)时遇到的ECS容器实例无法注册、服务无法放置任务的问题,按以下步骤逐一排查修复:
1. 修正容器实例角色配置
- 确认ASG启动模板/配置已绑定正确的实例配置文件:实例配置文件必须关联排查工具指出的角色
PlausibleStack-ClickHouseAutoScalingGroupInxxxxxx3c1Rx5YEV,且ASG创建的实例已成功获取该角色。 - 验证角色权限:确保所需的ECS权限(
ecs:RegisterContainerInstance,ecs:DeregisterContainerInstance,ecs:Poll,ecs:StartTelemetrySession,ecs:UpdateContainerInstancesState,ecs:SubmitAttachmentStateChange,ecs:SubmitContainerStateChange,ecs:SubmitTaskStateChange)已直接附加到角色,且无IAM权限边界限制这些权限。 - 检查信任关系:角色的信任策略必须允许EC2服务扮演,确认策略内容为:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
2. 修复VPC通信问题
- 检查ECS接口端点:
- 确认已创建
com.amazonaws.<region>.ecs-agent、com.amazonaws.<region>.ecs-telemetry、com.amazonaws.<region>.ecs三个VPC接口端点,且均启用了私有DNS(这是实例能通过默认域名访问ECS服务的关键)。 - 端点的安全组需允许容器实例所在子网的TCP 443入站流量。
- 确认已创建
- 验证路由配置:
- 使用NAT网关的话,私有子网路由表必须有0.0.0.0/0指向NAT网关的路由,且NAT网关所在公有子网有互联网网关路由。
- 仅使用接口端点的话,确保所有依赖服务(ECS、CloudWatch、ECR)的接口端点都已配置,且实例无需访问公网。
3. 修正UserData执行顺序
你的UserData执行顺序错误,导致ECS服务重启时还没读取到指定集群名称,实例会注册到默认集群而非目标集群。修正后的脚本如下:
#!/bin/bash # 先写入ECS集群配置,确保重启服务时能读取到 echo ECS_CLUSTER=PlausibleStack-ClusterEB038xxxxxARS3re >> /etc/ecs/ecs.config # 配置IMDS阻断(按需保留) echo ECS_AWSVPC_BLOCK_IMDS=true >> /etc/ecs/ecs.config # 安装RexRay插件,加容错避免安装失败卡住流程 docker plugin install rexray/ebs REXRAY_PREEMPT=true EBS_REGION=eu-central-1 --grant-all-permissions || echo "RexRay插件安装失败,不影响ECS注册" # 最后重启ECS服务加载新配置 systemctl restart ecs # 配置iptables规则(按需保留,确认不会阻断ECS通信) sudo iptables --insert FORWARD 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP sudo service iptables save
4. 验证实例注册状态
- 登录容器实例,执行
journalctl -u ecs查看ECS代理日志,检查是否有Registered container instance的成功日志,或定位具体错误(比如权限不足、连接超时)。 - 到ECS控制台查看目标集群的容器实例列表,确认实例是否已成功注册。
内容的提问来源于stack exchange,提问作者Nikola-Milovic
相关产品推荐
相关产品推荐

