首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KeyError:'AvailabilityZone‘

KeyError:'AvailabilityZone‘
EN

Stack Overflow用户
提问于 2017-08-26 04:38:04
回答 2查看 633关注 0票数 0

请帮助我解决这个问题:当我尝试运行以下脚本时,它总是返回以下错误: KeyError:'AvailabilityZone‘

client.describe_instances(Filters=[ {“名称”:“实例-状态-名称”,“值”:“运行”,},] )

另外,我注意到响应中没有AvailabilityZone字符串。

示例片段:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-28 16:20:36

这是完整的实例响应结果。整个json dict结构ls清楚地显示为

代码语言:javascript
复制
# ec2.client.describe_instances() responnse structure
{ 'Reservations':[
   {"Group": [{....}]},  
   {"Instances:[{.....}]} 
   ],
  'NextToken': 'string'
}

实例是关于您购买的保留实例。保留实例折扣与您开始的实例动态匹配,按小时计算。所以你永远不会得到像OS,实例计数等信息。

代码语言:javascript
复制
# 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引用就容易多了。

所以正确的符号引用应该如下所示

代码语言:javascript
复制
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_instancesdescribe_reserved_intances显示不同的结果集?

简单的回答是:它们不是一回事。describe_instances将显示您在系统中创建的实际AWS。另一方面,reserved instances不是一个VM,实际上是一种折扣计费机制。因此,您将不会看到任何与它相关的VM属性,而是货币信息。AWS会在它看到合适的时候应用折扣逻辑,所以您将不会看到来自describe_reserved_instances的可靠的逐项记帐。

票数 0
EN

Stack Overflow用户

发布于 2017-08-26 12:59:03

首先,我建议将您的代码示例直接粘贴到问题中,而不是像上面那样链接到它。如果连在一起的数据消失了,那么这个问题就更难理解了。

我认为您看到的问题是,当您正在循环遍历describe_instances返回的实例时,您假设placement属性总是包含一个名为AvailabilityZone的键,但是如果所讨论的实例处于已停止状态或终止状态,则该键将不为真。

因此,您应该在访问它之前检查以确保check具有该属性(例如,instance.placement中的‘instance.placement’)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45891977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档