You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Boto3停止ECS任务及底层EC2实例(不使用Fargate)

解决方案

要实现停止ECS任务后自动停止或终止关联的EC2实例,你可以通过以下步骤用Boto3完成:

步骤说明

  1. 更新ECS服务,将desiredCount设为0,停止所有运行中的任务
  2. 获取目标ECS集群下的所有容器实例
  3. 从容器实例数据中提取对应的EC2实例ID
  4. 调用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:UpdateService
    • ecs:ListContainerInstances
    • ecs:DescribeContainerInstances
    • ec2:StopInstances(或ec2:TerminateInstances)
  • 集群范围:上述代码会停止集群下所有关联的EC2实例,如果只想停止特定服务关联的实例,需要额外过滤容器实例(比如通过服务的任务关联的容器实例来筛选)

内容的提问来源于stack exchange,提问作者Nagaraj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:12:41