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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:20:41