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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:39:37