如何使用Boto3停止ECS任务及底层EC2实例(不使用Fargate)
解决方案
要实现停止ECS任务后自动停止或终止关联的EC2实例,你可以通过以下步骤用Boto3完成:
步骤说明
- 更新ECS服务,将
desiredCount设为0,停止所有运行中的任务 - 获取目标ECS集群下的所有容器实例
- 从容器实例数据中提取对应的EC2实例ID
- 调用EC2 API停止或终止这些实例
完整代码示例
import boto3 # 初始化ECS和EC2客户端 ecs_client = boto3.client('ecs') ec2_client = boto3.client('ec2') # 替换为你的集群和服务名称 CLUSTER_NAME = 'my-cluster' SERVICE_NAME = 'my-service' # 1. 停止ECS服务的所有任务 ecs_client.update_service( cluster=CLUSTER_NAME, service=SERVICE_NAME, desiredCount=0 ) # 2. 获取集群中所有容器实例的ARN列表 container_instances_resp = ecs_client.list_container_instances(cluster=CLUSTER_NAME) container_instance_arns = container_instances_resp.get('containerInstanceArns', []) if not container_instance_arns: print("当前集群中没有运行的容器实例") exit() # 3. 获取容器实例对应的EC2实例ID container_details = ecs_client.describe_container_instances( cluster=CLUSTER_NAME, containerInstances=container_instance_arns ) ec2_instance_ids = [inst['ec2InstanceId'] for inst in container_details['containerInstances']] # 4. 停止EC2实例(如需终止,替换为terminate_instances方法) ec2_client.stop_instances(InstanceIds=ec2_instance_ids) print(f"已成功停止EC2实例: {', '.join(ec2_instance_ids)}")
关键注意事项
- 停止 vs 终止:使用
stop_instances会暂停实例(可后续重启),使用terminate_instances会永久删除实例,根据你的需求选择对应方法 - 权限要求:执行代码的IAM身份需要具备以下权限:
ecs:UpdateServiceecs:ListContainerInstancesecs:DescribeContainerInstancesec2:StopInstances(或ec2:TerminateInstances)
- 集群范围:上述代码会停止集群下所有关联的EC2实例,如果只想停止特定服务关联的实例,需要额外过滤容器实例(比如通过服务的任务关联的容器实例来筛选)
内容的提问来源于stack exchange,提问作者Nagaraj
相关产品推荐
相关产品推荐

