批量导出AWS所有AMI模板详细配置信息至Excel表格

批量导出AWS所有AMI模板详细配置信息至Excel表格

Deng YongJie's blog 9 2025-05-02

CLI导出AMI模板的配置信息

aws ec2 describe-images \
    --owners self \
    --filters Name=is-public,Values=false \
    --query "Images[*].[Name,ImageId,BlockDeviceMappings[0].Ebs.SnapshotId,BlockDeviceMappings[0].Ebs.VolumeSize,SourceImageId,SourceImageRegion,Description,Tags]" \
    --output json > private_ami_info.json

使用Python脚本将json内容,指定表头写入excel表格

import json
import csv

# 读取 JSON 文件
with open('private_ami_info.json','r',encoding='utf-8') as file:
    ami_data = json.load(file)

# 定义CSV头部
fields = ['AMI 名称','AMI ID','Source AMI ID','Source AMI Region','块存储设备ID','卷大小(GiB)','描述','标签']

# 准备写入CSV
with open('private_ami_info.csv','w',newline='',encoding='utf-8-sig') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(fields)

    # 遍历每个 AMI 并写入 CSV
    for ami in ami_data:
        ami_name = ami[0] if ami[0] else ''  # AMI 名称与 Name 字段相同
        ami_id = ami[1]
        block_device_id = ami[2] if len(ami) > 2 and ami[2] else ''
        volume_size = ami[3] if len(ami) > 3 and ami[3] else ''
        source_ami_id = ami[4] if len(ami) > 4 and ami[4] else ''
        source_ami_region = ami[5] if len(ami) > 5 and ami[5] else ''
        description = ami[6] if len(ami) > 6 and ami[6] else ''

        # 提取和格式化标签信息,过滤掉系统默认生成的标签
        user_tags = {}
        if len(ami) > 7 and ami[7]:
            for tag in ami[7]:
                key = tag['Key']
                value = tag['Value']
                # 过滤掉以 "aws:" 开头的系统标签
                if not key.startswith("aws:"):
                    user_tags[key] = value
        tags_str = json.dumps(user_tags, ensure_ascii=False)  # 将用户自定义标签转换为 JSON 字符串

        # 写入行
        writer.writerow([
            ami_name,  # AMI 名称
            ami_id,  # AMI ID
            source_ami_id,  # Source AMI ID
            source_ami_region,  # Source AMI Region
            block_device_id,  # 块存储设备ID
            volume_size,  # 卷大小(GiB)
            description,  # 描述
            tags_str  # 标签
        ])

print("私有 AMI 信息已成功提取并保存到 private_ami_info.csv 文件中。")

最终结果:
image-20250314111134795