AWS Lambda获取EC2可用区详情失败问题求助
问题排查:AWS Lambda获取EC2实例AvailabilityZone字段报错
核心原因分析
你遇到的问题大概率是部分EC2实例的Placement.AvailabilityZone字段缺失,导致直接用索引访问时抛出KeyError。
为什么单独测试能成功?因为单独测试时你可能只拉取了运行中(running)的实例,这类实例的可用区字段是完整的;但全量拉取实例时,默认会包含所有状态的实例(比如已终止、正在终止、停止中的实例),部分特殊状态的实例不会返回Placement相关字段。
解决方案
不要直接用instance['Placement']['AvailabilityZone']这种硬索引访问,改用字典的get()方法做安全取值,同时设置默认值避免报错。
修改后的代码示例:
import boto3 def lambda_handler(event, context): ec2_client = boto3.client('ec2') all_instances = ec2_client.describe_instances() total_count = 0 instance_details = [] for reservation in all_instances['Reservations']: for instance in reservation['Instances']: total_count += 1 # 安全获取可用区,缺失时返回默认值 az = instance.get('Placement', {}).get('AvailabilityZone', 'N/A') detail = { '实例ID': instance['InstanceId'], '状态': instance['State']['Name'], '可用区': az, '实例类型': instance['InstanceType'] } instance_details.append(detail) return { '总实例数': total_count, '实例详情': instance_details }
额外建议
如果只需要统计运行中的实例,可以在调用describe_instances时添加过滤条件,减少无效数据处理:
# 只拉取运行中的实例 response = ec2_client.describe_instances(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
内容的提问来源于stack exchange,提问作者Cloud Wanderer
相关产品推荐
相关产品推荐

