【问题标题】:Export AWS EC2 details to xlsx/csv using boto3 and python使用 boto3 和 python 将 AWS EC2 详细信息导出到 xlsx/csv
【发布时间】:2020-10-30 02:45:57
【问题描述】:

我是 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'

请帮助我完成这个,理解

我们有一个 80 多个 AWS 账户,主要议程是运行脚本一次从 80 多个账户中获取数据。

【问题讨论】:

    标签: python python-3.x amazon-web-services amazon-ec2 boto3


    【解决方案1】:

    获取单个 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)
    

    希望它可以帮助您进一步进行。

    您可以使用以下代码通过切换角色循环访问多个 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)
    

    【讨论】:

    • 谢谢@saranjeet singh,这对我很有帮助
    • 如前所述,您有 80 多个帐户。你的设置如何?登录一个主帐户并从那里切换角色?如果是,那么我可以通过示例代码帮助您如何使用循环访问多个帐户。
    • @MohamedJawad 我已经更新了我的答案。例如,您可以使用切换角色列出来自多个帐户的用户。您可以使用所需的操作更新功能。现在希望你能接受我的回答。
    • 如何在这里打印标签值,
    • list_user() 不会返回标签。所以你必须使用get_user()。 response = iam.get_user(UserName='test1')
    【解决方案2】:

    describe_instances 方法实际上返回一个字典,不能使用点“。”访问值。

    通过查看方法的文档here 并向下滚动一点,您将看到带有 Response SyntaxReturns 部分。

    基于此,如果你想使用describe_instances的响应来打印instance-id和image-id,你可以使用这个代码:

    for r in resp['Reservations']:
        for i in r['Instances']:
            print(f" instance id : {i['InstanceId']}")
            print(f" image id :    {i['ImageId']}")
    

    输出

    instance id : i-xxxxxxxxxxxxxxxxx
    image id :    ami-xxxxxxxxxxxxxxxxx
    instance id : i-xxxxxxxxxxxxxxxxx
    image id :    ami-xxxxxxxxxxxxxxxxx
    ...
    

    【讨论】:

    • 感谢@vgalin,让我明白我的错误
    • Hi@vgalin,什么是“f”,这里是 print(f"
    • f'strings 用于格式化字符串。例如name='Mohamed' print(f'Your name is {name}') 它将打印:你的名字是 Mohamed。
    猜你喜欢
    • 2019-07-02
    • 2020-09-04
    • 2021-12-27
    • 2019-02-24
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2020-12-23
    • 2023-01-23
    相关资源
    最近更新 更多