Python调用boto3筛选EC2快照时出现Tags相关KeyError如何解决
问题根因与修复方案
核心错误原因
- 你直接用
instance_snap['Tags']取值:AWS的EC2快照如果没有绑定任何标签,返回的快照数据结构里不会存在Tags字段,方括号直接取不存在的键就会触发KeyError: 'Tags'。你提供的示例是有标签的快照,不能代表所有返回的快照都有这个字段。 - 额外逻辑错误:你写的
if ('ipsm_des_SR1' in d.get('Key') for d in xxx)是生成器表达式,不管内部有没有匹配项,生成器对象本身的布尔值永远为True,所以这个判断条件永远成立,会导致你把所有快照都过滤掉,不符合需求。 - 另外你每次循环里都重新初始化
snapshots = [''],最终也拿不到完整的符合要求的快照ID列表。
修复后的完整代码
import boto3 def filter_the_given_tag(): ec2Client = boto3.client('ec2') ec2_desc = ec2Client.describe_snapshots(OwnerIds=['*********']) # 提前初始化列表存储符合要求的快照ID valid_snapshots = [] for instance_snap in ec2_desc['Snapshots']: # 用get方法取Tags,没有的话默认返回空列表,避免KeyError tags = instance_snap.get('Tags', []) # 提取当前快照所有标签的Key tag_keys = [tag.get('Key') for tag in tags] # 过滤规则:只要标签Key包含指定字符串就跳过 has_forbidden_tag = any(('ipsm_des_SR1' in key or 'ipsm_des_SR2' in key) for key in tag_keys) if has_forbidden_tag: continue # 符合要求的快照ID加入列表 valid_snapshots.append(instance_snap['SnapshotId']) print(valid_snapshots) return valid_snapshots def lambda_handler(event, context): return filter_the_given_tag() if __name__ == '__main__': lambda_handler(None, None)
修复点说明
- 用
instance_snap.get('Tags', [])替代直接取值,没有标签的快照默认返回空列表,完全避免KeyError - 用
any()函数判断生成器的匹配结果,只有确实存在指定标签的时候才会触发跳过逻辑 - 统一初始化快照ID列表,循环结束后统一输出,避免每次覆盖列表的问题
内容的提问来源于stack exchange,提问作者user14927666
相关产品推荐
相关产品推荐

