Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取在Python中对应的EC2区域和区域_Python_Boto3 - Fatal编程技术网

获取在Python中对应的EC2区域和区域

获取在Python中对应的EC2区域和区域,python,boto3,Python,Boto3,我正在尝试提取AWS EC2实例的列表。我需要从每个AWS区域和区域中提取实例列表 我遇到的问题: 只需要从每个区域的相应区域中提取实例 循环 Ec2实例、区域和区域必须对应并 准确 目前,我的脚本提取了一个实例列表,但这种关联毫无意义。例如: ------------------------------------- Instance ID: i-6143add1 Type: m4.2xlarge State: stopped Private IP: 10.1.232.175 Public I

我正在尝试提取AWS EC2实例的列表。我需要从每个AWS区域和区域中提取实例列表

我遇到的问题:

  • 只需要从每个区域的相应区域中提取实例 循环
  • Ec2实例、区域和区域必须对应并 准确
  • 目前,我的脚本提取了一个实例列表,但这种关联毫无意义。例如:

    -------------------------------------
    Instance ID: i-6143add1
    Type: m4.2xlarge
    State: stopped
    Private IP: 10.1.232.175
    Public IP: None
    Region: eu-north-1
    Availability Zone: us-east-1a
    Launch Time: February 08 2016
    -----------------------------------
    
    由脚本输出。但实例ID:i-6143add1实际上位于区域us-east-1a,显然可用区us-east-1a不在区域eu-north-1

    我怎样才能把数据排成一行?这是我的密码:

    #!/usr/bin/env python
    
    import boto3
    import collections
    from collections import defaultdict
    import time
    from datetime import datetime
    from colorama import init, deinit, Fore, Back, Style
    import csv
    
    
    init()
    print(Fore.YELLOW)
    aws_account = input("Enter the name of the AWS account you'll be working in: ")
    session = boto3.Session(profile_name=aws_account)
    ec2 = session.client('ec2')
    aws_regions = ec2.describe_regions()
    aws_azs = ec2.describe_availability_zones()
    ec2info = defaultdict()
    for region in aws_regions['Regions']:
        region_name = region['RegionName']
        for az in aws_azs['AvailabilityZones']:
            zone = az['ZoneName']
            instance_list = ec2.describe_instances()
            for reservation in instance_list["Reservations"]:
                for instance in reservation.get("Instances", []):
                    private_ip_address = instance.get("PrivateIpAddress" , None)
                    public_ip_address = instance.get("PublicIpAddress" , None)
                    instance_state = instance['State']['Name']
                    if  private_ip_address and public_ip_address:
                        launch_time = instance['LaunchTime']
                        launch_time_friendly = launch_time.strftime("%B %d %Y")
                        ec2info[instance['InstanceId']] = {
                            'Instance ID': instance['InstanceId'],
                            'Type': instance['InstanceType'],
                            'State': instance_state,
                            'Private IP': instance['PrivateIpAddress'],
                            'Public IP': instance['PublicIpAddress'],
                            'Region': region_name,
                            'Availability Zone': zone,
                            'Launch Time' : launch_time_friendly
                        }
                        attributes = ['Instance ID', 'Type',
                                        'State', 'Private IP', 'Public IP', 'Region', 'Availability Zone', 'Launch Time' ]
                        for instance_id, instance in ec2info.items():
                            print(Fore.RESET + "-------------------------------------")
                            for key in attributes:
                                print(Fore.CYAN + "{0}: {1}".format(key, instance[key]))
                                writer.writerow({'Instance ID': key, 'Type': key, 'Launch Time': key})
                            print(Fore.RESET + "-------------------------------------")
                    elif private_ip_address:
                        launch_time = instance['LaunchTime']
                        launch_time_friendly = launch_time.strftime("%B %d %Y")
                        ec2info[instance['InstanceId']] = {
                            'Instance ID': instance['InstanceId'],
                            'Type': instance['InstanceType'],
                            'State': instance_state,
                            'Private IP': instance['PrivateIpAddress'],
                            'Public IP': None,
                            'Region': region_name,
                            'Availability Zone': zone,
                            'Launch Time' : launch_time_friendly
                        }
                        attributes = ['Instance ID', 'Type',
                                        'State', 'Private IP', 'Public IP', 'Region', 'Availability Zone', 'Launch Time' ]
                        for instance_id, instance in ec2info.items():
                            print(Fore.RESET + "-------------------------------------")
                            for key in attributes:
                                print(Fore.CYAN + "{0}: {1}".format(key, instance[key]))
                            print(Fore.RESET + "-------------------------------------")
    

    您没有将任何筛选选项传递给
    descripe\u实例
    ,因此您会一次又一次地返回所有实例。你可能想要像这样的东西

    instance\u list=ec2.description\u实例(
    过滤器=[{“名称”:“可用区域”,“值”:[zone]}]
    )
    
    。。。尽管说实话,没有理由重复AZs,因为您可以在
    reservation['Instances'][…]['Placement']['AvailabilityZone']
    中获得相同的信息,如中所示


    编辑:我想你可以简单地用这样的东西过日子

    #/usr/bin/env python
    进口boto3
    从colorama导入初始、Denit、前、后、样式
    印刷品(黄色)
    aws_账户=输入(
    “输入您将使用的AWS帐户的名称:”
    )
    session=boto3.session(profile\u name=aws\u账户)
    ec2=会话客户端(“ec2”)
    ec2info={}
    实例列表=ec2。描述实例()
    对于实例_列表[“预订”]中的预订:
    例如,在reservation.get(“Instances”,[])中:
    实例\状态=实例[“状态”][“名称”]
    启动时间=实例[“启动时间”]
    启动时间\u友好=启动时间.strftime(“%B%d%Y”)
    ec2info[实例[“实例ID”]={
    “实例ID”:实例[“实例ID”],
    “类型”:实例[“InstanceType”],
    “状态”:实例状态,
    “私有IP”:实例[“私有IP地址”],
    “公共IP”:实例[“公共IP地址”],
    “区域”:实例[“放置”][“可用性区域”][:-2],
    “可用性区域”:实例[“放置”][“可用性区域”],
    “发射时间”:发射时间友好,
    }
    例如,ec2info.items()中的实例\u id:
    打印(Fore.RESET+“----------------------------------------------”)
    输入[
    “实例ID”,
    “类型”,
    “国家”,
    “私有IP”,
    “公共知识产权”,
    “区域”,
    “可用区”,
    “发射时间”,
    ]:
    打印(Fore.CYAN+“{0}:{1}”。格式(key,instance.get(key)))
    打印(Fore.RESET+“----------------------------------------------”)
    
    获取此信息的一个非常简单的方法是:

    res = requests.get(' http://169.254.169.254/latest/dynamic/instance-identity/document')
    
    data = json.loads(res.text)
    
    print(data)
    
    print(data['region'])
    
    print(data['instanceId'])
    

    谢谢真管用!然而,我不得不稍微修改它,使其在区域和区域之间循环。分区现在是精确的,但区域不精确。我需要报告这两件事!这就是我所拥有的:有没有一种方法可以同时在区域和区域之间循环?我想这可能会解决问题。