请帮助我解决这个问题:当我尝试运行以下脚本时,它总是返回以下错误: KeyError:'AvailabilityZone‘
client.describe_instances(Filters=[ {“名称”:“实例-状态-名称”,“值”:“运行”,},] )
另外,我注意到响应中没有AvailabilityZone字符串。
示例片段:
import boto3
import collections
ec2 = boto3.resource('ec2')
instances = ec2.instances.filter(
Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
running_instances = {}
for instance in instances:
az = instance.placement['AvailabilityZone']
os = instance.platform
instance_type = instance.instance_type
if os is None:
os = 'Linux/UNIX'
else:
os = 'Windows'
if az not in running_instances:
running_instances[az] = {}
if os not in running_instances[az]:
running_instances[az][os] = {}
if instance_type not in running_instances[az][os]:
running_instances[az][os][instance_type] = 0
running_instances[az][os][instance_type] += 1
client = boto3.client('ec2')
response = client.describe_reserved_instances(
Filters=[
{
'Name': 'state',
'Values': [
'active',
]
}
],
)
cnt = collections.Counter()
reserved_instances = {}
for instance in response['ReservedInstances']:
az = instance['AvailabilityZone']
os = instance['ProductDescription']
instance_type = instance['InstanceType']
instance_count = instance['InstanceCount']
if az not in reserved_instances:
reserved_instances[az] = {}
if os not in reserved_instances[az]:
reserved_instances[az][os] = {}
if instance_type not in reserved_instances[az][os]:
reserved_instances[az][os][instance_type] = 0
reserved_instances[az][os][instance_type] += instance_count
print("****** Running Instances breakdown *****")
print(running_instances)
print("****** Reserved Instance breakdown *****")
print(reserved_instances)发布于 2017-08-28 16:20:36
这是完整的实例响应结果。整个json dict结构ls清楚地显示为
# ec2.client.describe_instances() responnse structure
{ 'Reservations':[
{"Group": [{....}]},
{"Instances:[{.....}]}
],
'NextToken': 'string'
}实例是关于您购买的保留实例。保留实例折扣与您开始的实例动态匹配,按小时计算。所以你永远不会得到像OS,实例计数等信息。
# describe_reserved_instances is about reserved instances you purchase
{
'ReservedInstances': [
{
'AvailabilityZone': 'string',
'Duration': 123,
'End': datetime(2015, 1, 1),
'FixedPrice': ...,
'InstanceCount': 123,
'InstanceType':
............
},
]
} 您需要做的是遵循正确的python字典引用。Python不会将字典转换为点表示法,除非加载像jsontree这样的模块(仅在python2中)来转换它们。也有命名元组转换,但我还在用它们。使用简单的dict引用就容易多了。
所以正确的符号引用应该如下所示
result = ec2.instances.filter(
Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
for reservation in result['Reservations']:
for instance in reservation['Instances']:
az = instance['Placement']['AvailabilityZone'](更新)一个新的AWS管理员/用户将提出一个问题,为什么describe_instances和describe_reserved_intances显示不同的结果集?
简单的回答是:它们不是一回事。describe_instances将显示您在系统中创建的实际AWS。另一方面,reserved instances不是一个VM,实际上是一种折扣计费机制。因此,您将不会看到任何与它相关的VM属性,而是货币信息。AWS会在它看到合适的时候应用折扣逻辑,所以您将不会看到来自describe_reserved_instances的可靠的逐项记帐。
发布于 2017-08-26 12:59:03
首先,我建议将您的代码示例直接粘贴到问题中,而不是像上面那样链接到它。如果连在一起的数据消失了,那么这个问题就更难理解了。
我认为您看到的问题是,当您正在循环遍历describe_instances返回的实例时,您假设placement属性总是包含一个名为AvailabilityZone的键,但是如果所讨论的实例处于已停止状态或终止状态,则该键将不为真。
因此,您应该在访问它之前检查以确保check具有该属性(例如,instance.placement中的‘instance.placement’)。
https://stackoverflow.com/questions/45891977
复制相似问题