Python3.8 Lambda遍历EC2实例Tags字段触发KeyError报错
问题根因
本次KeyError: 'Tags'报错和代码变更、Lambda运行时版本、AWS API迭代均无关系,核心原因如下:
- AWS EC2
describe_instances接口有固定返回规则:当EC2实例没有绑定任何标签(包括系统标签、自定义标签)时,返回的实例结构体中会直接省略Tags字段,而非返回空数组。 - 函数此前稳定运行多年,说明历史上扫描覆盖的所有EC2实例都至少绑定了1个标签;约5天前你的跨账号扫描范围内新出现了1台无任何标签的EC2实例(常见来源包括临时创建的未打标测试实例、CloudEndure复制流程中尚未完成标签注入的中转实例、其他AWS服务自动拉起的底层资源实例),代码直接通过
instance['Tags']硬索引字段时,就会触发键不存在的错误。
验证方式:在对应账号的
us-east-1区域执行AWS CLI命令aws ec2 describe-instances --query 'Reservations[].Instances[?!not_null(Tags)].InstanceId',返回的实例ID就是触发本次报错的无标签实例。
修复方案
仅需调整标签遍历部分的取值逻辑,使用字典get()方法为不存在Tags字段的场景设置默认空列表即可,无标签实例会直接跳过标签判断流程,不会中断函数执行。
将原代码第23行的标签遍历逻辑做如下修改:
# 原错误写法 # for tag in instance['Tags']: # 修改为 for tag in instance.get('Tags', []):
可选优化(非本次报错强制修复项)
- 原代码未处理
describe_instances接口的分页逻辑,单区域实例数超过1000台时会出现漏扫,建议使用boto3自带的paginator分页器遍历全量结果 - 日志中的拼写错误
Deltetion protection可修正为Deletion protection,不影响功能运行但便于后续日志排查
内容的提问来源于stack exchange,提问作者TIM02144
相关产品推荐
相关产品推荐

