如何将AWS EC2快照查询Shell脚本转换为Python实现
实现方法
AWS CLI的--query参数是客户端侧基于JMESPath实现的结果过滤逻辑,boto3的原生API不内置这层过滤,你只需要拿到接口返回的快照数据后,在Python代码里完成时间过滤、字段提取、排序即可,完全等价原Shell脚本的效果。
核心实现代码
注意:EC2接口返回的StartTime字段是带UTC时区的datetime对象,你定义的时间阈值必须带上时区信息,否则比较时会抛出类型错误。
import boto3 import os from datetime import datetime, timezone # 初始化EC2客户端 ec2_client = boto3.client('ec2') # 替换为你自己的时间阈值,示例为筛选2024年1月1日0点前创建的快照 time_threshold = datetime(2024, 1, 1, tzinfo=timezone.utc) # 调用接口获取指定所有者的快照 resp = ec2_client.describe_snapshots(OwnerIds=[os.environ['AWS_ACCOUNT_ID']]) # 过滤符合时间条件的快照、提取快照ID、按字典序排序,完全匹配原Shell逻辑 sorted_snapshot_ids = sorted( [snap['SnapshotId'] for snap in resp['Snapshots'] if snap['StartTime'] <= time_threshold] ) # 输出结果,和原Shell输出格式一致 for sid in sorted_snapshot_ids: print(sid)
适配大量快照的分页写法
如果账号下快照数量超过1000个,单次接口调用只会返回第一页结果,需要用paginator拉取全量数据:
import boto3 import os from datetime import datetime, timezone ec2_client = boto3.client('ec2') time_threshold = datetime(2024, 1, 1, tzinfo=timezone.utc) # 初始化分页器 paginator = ec2_client.get_paginator('describe_snapshots') page_iter = paginator.paginate(OwnerIds=[os.environ['AWS_ACCOUNT_ID']]) all_matched_ids = [] for page in page_iter: # 逐页过滤,避免一次性加载全量数据占用过多内存 for snap in page['Snapshots']: if snap['StartTime'] <= time_threshold: all_matched_ids.append(snap['SnapshotId']) sorted_snapshot_ids = sorted(all_matched_ids)
可选:直接复用JMESPath查询语法
如果你想完全对齐CLI里的JMESPath查询写法,可以安装jmespath库后直接执行查询表达式:
import boto3 import os import jmespath from datetime import datetime, timezone ec2_client = boto3.client('ec2') time_threshold = datetime(2024, 1, 1, tzinfo=timezone.utc) resp = ec2_client.describe_snapshots(OwnerIds=[os.environ['AWS_ACCOUNT_ID']]) # 直接使用和CLI一致的查询语句 query_expr = f"Snapshots[?(StartTime<='{time_threshold.isoformat()}')].[SnapshotId]" raw_result = jmespath.search(query_expr, resp) # 展平嵌套结果、排序 sorted_snapshot_ids = sorted([item[0] for item in raw_result])
这种写法需要额外安装jmespath依赖,日常使用更推荐原生列表推导的写法,可读性更高、没有额外依赖。
内容的提问来源于stack exchange,提问作者abd
相关产品推荐
相关产品推荐

