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

Python-boto3脚本无法获取全部AWS EC2实例问题求助

解决AWS EC2实例列表漏取问题:遍历所有Reservation下的实例

我一眼就看到问题所在啦!你的代码现在只处理了每个Reservation(预留记录)里的第一个实例(通过ec2['Instances'][0]),但每个Reservation里可能包含多个EC2实例,所以才会出现5个实例只输出3个的情况。

问题核心

你当前的循环逻辑是:

for ec2 in resp['Reservations']:
    # 只处理 ec2['Instances'][0] 这个实例

但每个Reservation的Instances是一个列表,里面可能有多个实例对象,你需要再套一层循环来遍历这个列表里的每一个实例。

修改后的完整代码

import csv
import boto3
from botocore.config import Config

output = "Prod.csv"
# 假设你的config已提前定义,保留原初始化逻辑
ec = boto3.client('ec2', config=config, region_name=rg)

def get_instance_tag(instance, tag_key, default='Null'):
    """封装标签获取逻辑,减少重复代码"""
    try:
        return next(item for item in instance['Tags'] if item['Key'] == tag_key)['Value']
    except StopIteration:
        return default

def get_tags():
    tag_result = [['Name','InstanceId','State','bt:product','bt:environment-type','bt:environment-name']]
    resp = ec.describe_instances()
    
    # 遍历每个Reservation,再遍历其中所有实例
    while True:
        for reservation in resp['Reservations']:
            for instance in reservation['Instances']:
                tag_list = []
                # 获取各类标签与实例信息
                tag_list.append(get_instance_tag(instance, 'Name'))
                tag_list.append(instance['InstanceId'])
                tag_list.append(instance['State']['Name'])
                tag_list.append(get_instance_tag(instance, 'bt:product'))
                tag_list.append(get_instance_tag(instance, 'bt:environment-type'))  # 修正原代码的b1拼写错误
                tag_list.append(get_instance_tag(instance, 'bt:environment-name'))  # 修正原代码的b1拼写错误
                
                tag_result.append(tag_list)
        
        # 处理分页:如果还有更多实例,通过NextToken继续获取
        if 'NextToken' not in resp:
            break
        resp = ec.describe_instances(NextToken=resp['NextToken'])
    
    return tag_result

def main():
    tag = get_tags()
    with open(output,'w', newline='') as resultFile:  # 添加newline=''避免Windows下CSV空行问题
        wr = csv.writer(resultFile, dialect='excel')
        wr.writerows(tag)

if __name__ == "__main__":
    main()

关键改动说明

  1. 新增实例层循环:在遍历Reservations的循环内,新增for instance in reservation['Instances']:,确保每个实例都被处理
  2. 修正标签键拼写错误:原代码里把bt:误写成b1:,导致无法正确获取对应标签,现在统一修正为bt:
  3. 添加分页处理:AWS的describe_instances默认最多返回1000个实例,通过NextToken循环获取所有结果,避免实例过多时遗漏
  4. 封装标签获取逻辑:把重复的标签判断代码封装成函数,让代码更简洁易维护
  5. CSV写入优化:添加newline=''参数,避免Windows系统下生成的CSV出现多余空行

内容的提问来源于stack exchange,提问作者user2404382

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:12:41