使用boto3和python将AWS EC2详细信息导出到xlsx/csv

使用boto3和python将AWS EC2详细信息导出到xlsx/csv,python,python-3.x,amazon-web-services,amazon-ec2,boto3,Python,Python 3.x,Amazon Web Services,Amazon Ec2,Boto3,我对python和boto3还不熟悉 我需要使用python获得以下详细信息,我使用bash获得这些详细信息 #!/bin/bash aws ec2 describe-instances --query "Reservations[*].Instances[*].[Tags[?Key=='Name']|[0].Value,InstanceId,InstanceType,Platform,State.Name,PrivateIpAddress,PublicIpAddress,Placem

我对python和boto3还不熟悉

我需要使用python获得以下详细信息,我使用bash获得这些详细信息

#!/bin/bash
aws ec2 describe-instances --query "Reservations[*].Instances[*].[Tags[?Key=='Name']|[0].Value,InstanceId,InstanceType,Platform,State.Name,PrivateIpAddress,PublicIpAddress,Placement.AvailabilityZone]" --output text  --region me-south-1 >> aws_ec2_details_me_south_1.xlsx

aws elbv2 describe-load-balancers --query "LoadBalancers[*].[LoadBalancerArn,DNSName,LoadBalancerName,Type,Scheme,State.Code]" --output text --region me-south-1 >> aws_elb_details_me_south_1.xlsx

aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[*].[AutoScalingGroupName,AutoScalingGroupARN,MinSize,MaxSize,DesiredCapacity,DefaultCooldown]" --output text --region me-south-1 >> aws_autoscaling_me_south_1.xlsx

aws ec2 describe-addresses --query "Addresses[*].[Tags[?Key=='Name']|[0].Value,PublicIp,PrivateIpAddress]" --output text --region me-south-1 >> aws_eip_list_me_south_1.xlsx

aws rds describe-db-instances --query "DBInstances[*].[DBInstanceIdentifier,DBInstanceClass,Engine,EngineVersion,DBInstanceStatus,MasterUsername,Endpoint.Address,MultiAZ,AllocatedStorage,PreferredBackupWindow,BackupRetentionPeriod,StorageEncrypted]" --output text --region me-south-1 >>  aws_rds_details_me_south_1.xlsx
我在这里做了一些python脚本示例

import boto3
session = boto3.Session(profile_name='default',region_name='me-south-1')
ec2_des = session.client('ec2')
resp = ec2_des.describe_instances(
    Filters = [ {
        'Name' : 'instance-state-name',
        'Values' : [ 'running' ]
        } ]
    )
for i in resp:
    print i(instance-id)
    print (i.image-id)
获取错误

Traceback (most recent call last):
  File "t4.py", line 11, in <module>
    print (i.instance-id)
AttributeError: 'str' object has no attribute 'instance'
回溯(最近一次呼叫最后一次):
文件“t4.py”,第11行,在
打印(即实例id)
AttributeError:'str'对象没有属性'instance'
请帮助我完成这个,理解


我们有一个80多个AWS帐户,主要任务是运行脚本,一次从80多个帐户获取数据。

描述实例的
方法实际上返回一个字典,不能使用点“.”来访问值

通过查看该方法的文档并向下滚动一点,您将看到带有响应语法的返回部分

基于此,如果要使用
description\u instances
的响应打印实例id和图像id,可以使用以下代码:

对于resp['Reservations']中的r:
对于r['Instances']中的i:
打印(f“实例id:{i['InstanceId']}”)
打印(f“图像id:{i['ImageId']}”)
输出
实例id:i-xxxxxxxxxxxxxxxx
图像id:ami-XXXXXXXXXXXXXX
实例id:i-XXXXXXXXXXXXXX
图像id:ami-XXXXXXXXXXXXXX
...

descripe\u instances
方法实际上返回一个字典,不能使用点“.”来访问值

通过查看该方法的文档并向下滚动一点,您将看到带有响应语法的返回部分

基于此,如果要使用
description\u instances
的响应打印实例id和图像id,可以使用以下代码:

对于resp['Reservations']中的r:
对于r['Instances']中的i:
打印(f“实例id:{i['InstanceId']}”)
打印(f“图像id:{i['ImageId']}”)
输出
实例id:i-xxxxxxxxxxxxxxxx
图像id:ami-XXXXXXXXXXXXXX
实例id:i-XXXXXXXXXXXXXX
图像id:ami-XXXXXXXXXXXXXX
...

获取单个EC2实例的详细信息并将输出写入CSV文件的示例代码

import boto3
import csv

session = boto3.Session(profile_name='default', region_name='us-east-1')

ec2 = session.client('ec2')

result = []
response = ec2.describe_instances(
    InstanceIds=[
        'i-xxxxxxxxxxxxxxxxx'
    ]).get('Reservations')

for item in response:
    for each in item['Instances']:
        result.append({
            'ImageId': each['ImageId'],
            'InstanceType': each['InstanceType'],
            'PublicIp': each['PublicIpAddress'],
            'PrivateIp': each['PrivateIpAddress']
        })
#The result type will be list of dictionary.
# print(result) [{'ImageId': 'ami-08c5e20f0xxxxxxxx', 'InstanceType': 't2.micro', 'PublicIp': '10.200.101.11', 'PrivateIp': '172.31.33.95'}]

# Write to csv file.
header = ['ImageId', 'InstanceType', 'PublicIp', 'PrivateIp']
with open('ec2-details.csv', 'w') as file:
    writer = csv.DictWriter(file, fieldnames=header)
    writer.writeheader()
    writer.writerows(result)
希望这将有助于您进一步进行

您可以使用下面的代码使用switch角色在多个AWS帐户之间循环

    import boto3
from botocore.exceptions import ClientError

# master account
session = boto3.Session(profile_name='default', region_name='eu-central-1')
iam = session.resource('iam')

accounts = [111111111111, 222222222222, 333333333333]


def assume_role(account: str) -> dict:
    sts_client = session.client('sts')
    try:
        response = sts_client.assume_role(RoleArn=f'arn:aws:iam::{account}:<role-name>',
                                          RoleSessionName=f'dev-{account}-session'
                                          )
        temp_credentials = response['Credentials']
    except ClientError as ex:
        print('Client Error', str(ex))
    except Exception as e:
        print(e)

    return temp_credentials


def list_users(session_arg: dict, acct: int) -> dict:
    iam_user = session.client('iam',
                              aws_access_key_id=session_arg['AccessKeyId'],
                              aws_secret_access_key=session_arg['SecretAccessKey'],
                              aws_session_token=session_arg['SessionToken']
                              )
    # listing users
    response = iam_user.list_users()
    return response


if __name__ == '__main__':
    try:
        for acct in accounts:
            sessionCredentials = assume_role(acct)
            user_info = list_users(sessionCredentials, acct)
            print(user_info)
    except Exception as e:
        print(e)
导入boto3
从botocore.exceptions导入ClientError
#主帐户
session=bot3.会话(profile_name='default',region_name='eu-central-1')
iam=session.resource('iam')
账户=[111111111222222333333]
def担任_角色(账户:str)->dict:
sts\u client=session.client('sts'))
尝试:
response=sts\u client.承担角色(RoleArn=f'arn:aws:iam::{account}:',
RoleSessionName=f'dev-{account}-session'
)
临时凭证=响应['credentials']
除ClientError外,作为ex:
打印('客户端错误',str(ex))
例外情况除外,如e:
打印(e)
返回临时凭证
def列表用户(会话参数:dict,科目:int)->dict:
iam_user=session.client('iam',
aws_access_key_id=会话参数['AccessKeyId'],
aws_secret_access_key=session_arg['SecretAccessKey'],
aws_session_token=session_arg['SessionToken']
)
#列出用户
响应=iam_用户。列出_用户()
返回响应
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
尝试:
对于账户中的账户:
sessionCredentials=承担角色(acct)
用户信息=列表用户(会话记录、账户)
打印(用户信息)
例外情况除外,如e:
打印(e)

获取单个EC2实例的详细信息并将输出写入CSV文件的示例代码

import boto3
import csv

session = boto3.Session(profile_name='default', region_name='us-east-1')

ec2 = session.client('ec2')

result = []
response = ec2.describe_instances(
    InstanceIds=[
        'i-xxxxxxxxxxxxxxxxx'
    ]).get('Reservations')

for item in response:
    for each in item['Instances']:
        result.append({
            'ImageId': each['ImageId'],
            'InstanceType': each['InstanceType'],
            'PublicIp': each['PublicIpAddress'],
            'PrivateIp': each['PrivateIpAddress']
        })
#The result type will be list of dictionary.
# print(result) [{'ImageId': 'ami-08c5e20f0xxxxxxxx', 'InstanceType': 't2.micro', 'PublicIp': '10.200.101.11', 'PrivateIp': '172.31.33.95'}]

# Write to csv file.
header = ['ImageId', 'InstanceType', 'PublicIp', 'PrivateIp']
with open('ec2-details.csv', 'w') as file:
    writer = csv.DictWriter(file, fieldnames=header)
    writer.writeheader()
    writer.writerows(result)
希望这将有助于您进一步进行

您可以使用下面的代码使用switch角色在多个AWS帐户之间循环

    import boto3
from botocore.exceptions import ClientError

# master account
session = boto3.Session(profile_name='default', region_name='eu-central-1')
iam = session.resource('iam')

accounts = [111111111111, 222222222222, 333333333333]


def assume_role(account: str) -> dict:
    sts_client = session.client('sts')
    try:
        response = sts_client.assume_role(RoleArn=f'arn:aws:iam::{account}:<role-name>',
                                          RoleSessionName=f'dev-{account}-session'
                                          )
        temp_credentials = response['Credentials']
    except ClientError as ex:
        print('Client Error', str(ex))
    except Exception as e:
        print(e)

    return temp_credentials


def list_users(session_arg: dict, acct: int) -> dict:
    iam_user = session.client('iam',
                              aws_access_key_id=session_arg['AccessKeyId'],
                              aws_secret_access_key=session_arg['SecretAccessKey'],
                              aws_session_token=session_arg['SessionToken']
                              )
    # listing users
    response = iam_user.list_users()
    return response


if __name__ == '__main__':
    try:
        for acct in accounts:
            sessionCredentials = assume_role(acct)
            user_info = list_users(sessionCredentials, acct)
            print(user_info)
    except Exception as e:
        print(e)
导入boto3
从botocore.exceptions导入ClientError
#主帐户
session=bot3.会话(profile_name='default',region_name='eu-central-1')
iam=session.resource('iam')
账户=[111111111222222333333]
def担任_角色(账户:str)->dict:
sts\u client=session.client('sts'))
尝试:
response=sts\u client.承担角色(RoleArn=f'arn:aws:iam::{account}:',
RoleSessionName=f'dev-{account}-session'
)
临时凭证=响应['credentials']
除ClientError外,作为ex:
打印('客户端错误',str(ex))
例外情况除外,如e:
打印(e)
返回临时凭证
def列表用户(会话参数:dict,科目:int)->dict:
iam_user=session.client('iam',
aws_access_key_id=会话参数['AccessKeyId'],
aws_secret_access_key=session_arg['SecretAccessKey'],
aws_session_token=session_arg['SessionToken']
)
#列出用户
响应=iam_用户。列出_用户()
返回响应
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
尝试:
对于账户中的账户:
sessionCredentials=承担角色(acct)
用户信息=列表用户(会话记录、账户)
打印(用户信息)
例外情况除外,如e:
打印(e)

谢谢@saranjeet singh,这对我很有帮助,正如前面提到的,你有80多个帐户。你的电脑是如何设置的?登录到一个主帐户并从那里切换角色?如果是,那么我可以用示例代码帮助您如何使用loop访问多个帐户。@MohamedJawad我已经更新了我的答案。例如,可以使用切换角色列出多个帐户中的用户。您可以使用所需的操作更新函数。希望你现在能接受我的回答。我如何在这里打印标签值,请列出_