AWS ECS执行execute-command报TargetNotConnectedException内部错误如何解决
排查步骤
1. 确认已开启ECS Exec功能
你当前的CDK代码仅定义了集群和任务定义,没有在启动任务/创建服务时显式开启Exec功能,这是最高频的漏项:
- 如果是通过CDK创建Fargate服务,需要在服务配置中添加
enableExecuteCommand: true - 如果是手动调用
aws ecs run-task启动任务,需要加参数--enable-execute-command - 可以用以下命令验证任务是否已开启Exec:
aws ecs describe-tasks --cluster MyEcsCluster --tasks $ECS_TASK_ARN --query "tasks[].enableExecuteCommand"
返回true才代表已开启,返回false需要重新启动开启了Exec的任务。
2. 确认任务执行角色有足够的SSM权限
ECS Exec依赖Session Manager通信,任务执行角色(Task Execution Role)必须包含以下权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" } ] }
你可以在CDK的FargateTaskDefinition初始化参数中,给executionRole附加这个权限策略。
3. 排查网络连通性问题
SSM Agent需要和AWS服务端点通信才能建立会话:
- 如果任务运行在公有子网:确认任务已分配公网IP,且安全组允许出站443端口访问公网
- 如果任务运行在私有子网:需要在VPC中创建三个接口端点:
com.amazonaws.<你的区域>.ssm、com.amazonaws.<你的区域>.ssmmessages、com.amazonaws.<你的区域>.ec2messages,同时安全组允许任务到这三个端点的443端口出站访问。
4. 验证容器内存在指定的shell程序
你当前执行命令指定的是/bin/bash,部分轻量镜像默认没有预装bash,可以先尝试替换为/bin/sh测试:
aws ecs execute-command \ --cluster MyEcsCluster \ --task $ECS_TASK_ARN \ --container MainContainer \ --command "/bin/sh" \ --interactive
5. 确认操作账号有ecs:ExecuteCommand权限
你当前调用aws ecs execute-command的IAM身份,需要附加允许ecs:ExecuteCommand的权限策略,资源匹配你要操作的任务ARN即可。
内容的提问来源于stack exchange,提问作者clay
相关产品推荐
相关产品推荐

