获取在Python中对应的EC2区域和区域
我正在尝试提取AWS EC2实例的列表。我需要从每个AWS区域和区域中提取实例列表 我遇到的问题:获取在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
-------------------------------------
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'])
谢谢真管用!然而,我不得不稍微修改它,使其在区域和区域之间循环。分区现在是精确的,但区域不精确。我需要报告这两件事!这就是我所拥有的:有没有一种方法可以同时在区域和区域之间循环?我想这可能会解决问题。