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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:24:05