如何使用Python boto3查询AWS账号下最近1小时创建的AMI列表
解决方案:查询AWS账号下最近1小时创建的AMI列表
现有代码核心问题
- 时间计算逻辑错位:原
ami_days_old函数接收了AMI创建时间参数但未做任何解析计算,直接返回1小时前的时间点,完全无法实现时间差对比 - 缺少时区适配:AWS返回的
CreationDate为UTC时区的ISO格式字符串,直接和本地时间对比会出现时区偏移误差 - 无AMI创建状态校验:部署前需要确认所有AMI创建完成,因此需要额外判断
State字段是否为available
修正后可直接运行代码
#!/usr/bin/env python3 import boto3 import datetime from datetime import timezone # 配置项:查询最近N小时内的AMI SEARCH_HOURS = 1 aws_profile_name = 'default' # 初始化boto3客户端 boto3.setup_default_session(profile_name=aws_profile_name) ec2 = boto3.client('ec2') # 替换为你实际的AMI过滤规则 custom_filter = [{ 'Name':'<redacted>', 'Values': ['<redacted>'] }] def get_recent_available_amis(): # 计算UTC时区下的时间截止点,和AWS返回的时间时区对齐 cutoff_time = datetime.datetime.now(timezone.utc) - datetime.timedelta(hours=SEARCH_HOURS) matched_amis = [] amis = ec2.describe_images(Owners=['self'], Filters=custom_filter) for ami in amis['Images']: # 转换AWS返回的ISO时间格式为可计算的datetime对象 create_date_str = ami['CreationDate'].replace('Z', '+00:00') create_date = datetime.datetime.fromisoformat(create_date_str) # 筛选符合时间范围的AMI,同时保留创建状态便于后续校验 if create_date >= cutoff_time: matched_amis.append({ 'ami_id': ami['ImageId'], 'name': ami['Name'], 'create_time': ami['CreationDate'], 'status': ami['State'] }) return matched_amis def main(): recent_amis = get_recent_available_amis() print(f"最近{SEARCH_HOURS}小时内创建的AMI共{len(recent_amis)}个:") for ami in recent_amis: print(f"ID: {ami['ami_id']}, 状态: {ami['status']}, 创建时间: {ami['create_time']}") # 部署前置判断逻辑:所有符合时间范围的AMI都创建完成才返回可部署标识 all_available = all(ami['status'] == 'available' for ami in recent_amis) if all_available: print("所有AMI均已创建完成,可启动部署流程") else: print("存在仍在创建中的AMI,请稍后再试") if __name__ == "__main__": main()
关键调整说明
- 所有时间计算统一使用UTC时区,完全避免时区偏差导致的筛选错误
- 修正了时间对比逻辑,先计算1小时前的时间截止点,再逐个比对AMI创建时间
- 新增了AMI状态校验字段,可直接通过返回的
all_available变量判断是否满足部署前置条件 - 返回结构化的AMI列表,方便后续业务逻辑直接调用
内容的提问来源于stack exchange,提问作者Aric Wilisch
相关产品推荐
相关产品推荐

