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

如何扩展AWS Lambda Python脚本启动已停止的EC2实例

没问题,我来帮你扩展这个Lambda脚本,实现启动所有已停止的EC2实例。下面是修改后的完整代码,同时我会把关键细节给你讲明白:

修改后的完整Lambda脚本
import boto3

region = 'us-east-1'
ec2 = boto3.resource('ec2', region_name=region)

def lambda_handler(event, context):
    # 筛选所有处于停止状态的EC2实例
    instances = ec2.instances.filter(
        Filters=[{'Name': 'instance-state-name', 'Values': ['stopped']}]
    )
    
    # 收集停止实例的ID到列表中
    stopped_instance_ids = []
    for instance in instances:
        print('已发现停止的EC2实例: 实例ID:', instance.id)
        stopped_instance_ids.append(instance.id)
    
    # 检查是否有需要启动的实例,避免空调用API
    if stopped_instance_ids:
        # 调用start_instances方法,传入实例ID列表
        ec2_client = boto3.client('ec2', region_name=region)
        response = ec2_client.start_instances(InstanceIds=stopped_instance_ids)
        
        print(f"已尝试启动以下实例: {', '.join(stopped_instance_ids)}")
        print("启动操作响应:", response)
    else:
        print("当前没有处于停止状态的EC2实例")

关键细节说明

  • 收集实例ID:我新增了stopped_instance_ids列表,用来存储所有筛选到的停止实例ID。遍历实例时把每个instance.id添加进去,这样就能批量传递给启动API,比逐个启动更高效。
  • 正确调用start_instances:这里用boto3客户端(client)调用启动方法(用资源resource也可以,比如ec2.instances.filter(...).start(),但客户端能更直观看到API响应)。InstanceIds参数必须接收一个字符串类型的实例ID列表,直接把我们收集的stopped_instance_ids传进去就完全符合要求。
  • 空列表判断:一定要先检查列表是否为空再调用启动API,不然AWS会返回参数错误——毕竟没有实例可启动的时候调用API是无意义的。
  • 权限注意:别忘给Lambda的执行角色添加ec2:StartInstances权限,不然脚本会因为权限不足执行失败。你可以在IAM控制台给角色附加AmazonEC2FullAccess(或者更精细的自定义权限)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:34:34