繁体   English   中英

Boto3 获取具有 ebs 卷 ID、大小为 excel 的所有 ec2 实例的列表

[英]Boto3 get list of all ec2 instances with ebs volume id, size to an excel

使用 boto3 和 python 将 AWS EC2 详细信息导出到 xlsx/csv - 这可行,但收集附加到每个 ec2 实例的 EBS 卷、类型和大小以及 append 到 excel 中的同一行对我来说是一个挑战。 在一个下方,只需在下一行中附加音量信息。 如果我有一个单独的 function 并在“result.append”中调用它,我只能获取第一卷。 如果我在 function 中返回多个值,如卷 ID、卷大小、卷类型 - 我可以将所有 3 个值添加到 excel 中的同一个单元格,而不是每个单独的列。 请帮忙。 我显然处于学习阶段。

                volume_iterator = ec3.volumes.all()
                for v in volume_iterator:
                    for a in v.attachments:
                        if a['InstanceId'] == each['InstanceId']:
                                result.append({
                                    'volume.id': v.id,
                                    'volume.size': v.size,
                                    'volume.state': v.volume_type
                                })

CSV 中的最终 output 如下所示。 所有与音量相关的值都在同一列“volume.id”中。 卷信息应该分开。

ImageId InstanceType    InstanceId  InstanceName volume.id                  volume.type volume.size

ami-042e828f5df03   t3.large    i-07db6118eb51e <server_name>   [{8, 'vol-0085fdebc7', 'gp3'}, {'vol-0d417698824e', 'gp3', 128}]    

这行得通。


import boto3
import csv
import datetime
import logging
from os import environ
import collections
import time
import sys

### ENABLE The profilename below, while testing from local. Disable this and session line in 63, enable line 64 session before pushing to Lambda#######
profilename='<>'
aws_Acct='<>.csv'
volume_id_list=[]
result = []
regions = ['us-east-1', 'us-east-2', 'us-west-1', 'us-west-2']
#regions = ['us-east-1']

#Name Tag
def get_tag(each, tag_name):
    if 'Tags' in each:
        for tag in each['Tags']:
          if tag['Key'] == tag_name:
              return tag['Value']
    return ''

#Volumes
def get_vol(each, ec2):
    resultVol = {
        "vol_id": "",
        "vol_size": "",
        "vol_type": ""
    }
    resp = ec2.describe_volumes(
        Filters=[{'Name':'attachment.instance-id','Values':[each['InstanceId']]}]
    )
    for volume in (resp["Volumes"]):
        resultVol['vol_id'] += (str(volume["VolumeId"]) + "\n")
        resultVol['vol_size'] += (str(volume["Size"]) + "\n")
        resultVol['vol_type'] += (str(volume["VolumeType"]) + "\n")

    return resultVol

#Security Groups
def sec_gp(each, ec2):
    resultSG = {
        "sg_id": "",
        "sg_name": ""
    }
    for sg in each['SecurityGroups']:
        resultSG['sg_id'] += (str(sg["GroupId"]) + "\n")
        resultSG['sg_name'] += (str(sg["GroupName"]) + "\n")

    return resultSG

def lambda_handler(event, context):
    try:
        logging.basicConfig(level=logging.INFO)
        logging.info('EC2 Inventory details')

        for region in regions:
            session = boto3.Session(profile_name=profilename, region_name=region)
            #session = boto3.Session(region_name=region)
            ec2 = session.client('ec2')
            response = ec2.describe_instances()
            for item in response["Reservations"]:
                for each in item['Instances']:
                    volsss = get_vol(each, ec2)
                    sgss = sec_gp(each, ec2)
                    #print(sgss)
                    result.append({
                        'ImageId': each.get('ImageId', ''),
                        'InstanceType': each.get('InstanceType', ''),
                        'PublicIp': each.get('PublicIpAddress', ''),
                        'PrivateIp': each.get('PrivateIpAddress', ''),
                        'InstanceId': each.get('InstanceId', ''),
                        'SubnetId': each.get('SubnetId', ''),
                        'VpcId': each.get('VpcId', ''),
                        'InstanceName': get_tag(each, 'Name'),
                        'volume.size': volsss['vol_size'],
                        'volume.id': volsss['vol_id'],
                        'volume.type': volsss['vol_type'],
                        'DeleteOnTermination': each.get('DeleteOnTermination', ''),
                        'SGGroupName': sgss['sg_name'],
                        'SGGroupID': sgss['sg_id'],
                        'State': each['State']['Name'],
                        'Region': each['Placement']['AvailabilityZone']
                    })
                    
        # Write to csv file.
        header = ['ImageId', 'InstanceType', 'InstanceId', 'InstanceName', 'PublicIp', 'PrivateIp', 'Region', 'State', 'volume.id', 'volume.size', 'volume.type', 'SubnetId', 'VpcId', 'SGGroupName', 'SGGroupID', 'DeleteOnTermination']
        with open(aws_Acct, 'w') as file:
            writer = csv.DictWriter(file, fieldnames=header)
            writer.writeheader()
            writer.writerows(result)

    except Exception as e:
        logging.error(
            'EC2 inventory with uncaught exception: {}'.format(e)
        )

if __name__ == '__main__':
    lambda_handler(None, None)

最终 output 看起来像:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM