Boto3 获取具有 ebs 卷 ID、大小为 excel 的所有 ec2 实例的列表
Boto3 get list of all ec2 instances with ebs volume id, size to an excel
- 这可行,但要收集附加到每个 ec2 实例的 EBS 卷、类型和大小并附加到 excel 中的同一行对我来说是一个挑战。在一个下方,只需在下一行中附加音量信息。如果我有一个单独的函数并在“result.append”中调用它,我只能获取第一卷。如果我 return 函数中的多个值,如卷 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 格式的最终输出如下所示。所有与音量相关的值都在同一列“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)
最终输出如下:
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 格式的最终输出如下所示。所有与音量相关的值都在同一列“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)
最终输出如下: