如何扩展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
相关产品推荐
相关产品推荐

