KeyError: '负载平衡器地址'

问题描述

我一直在使用 BOTO 3 来描述帐户中可用的所有负载均衡器。我使用了以下代码片段:

'elbv2=boto3.client('elbv2',aws_access_key_id=access_key_id,aws_secret_access_key=secret_key,region_name=region)
response=elbv2.describe_load_balancers()

print(response)

此处的响应将 dict 与所有信息一起存储,如下所示:

{
    'LoadBalancers': [{
        'LoadBalancerArn': 'arn:aws:elasticloadbalancing:ap-south-1:407203256002:loadbalancer/net/aws-lb-02/9d4b15bfd6f579d3','DNSName': 'aws-lb-02-9d4b15bfd6f579d3.elb.ap-south-1.amazonaws.com','CanonicalHostedZoneId': 'ZVDDRBQ08TROA','CreatedTime': datetime.datetime(2021,3,31,11,45,6,729000,tzinfo = tzutc()),'LoadBalancerName': 'aws-lb-02','Scheme': 'internet-facing','VpcId': 'vpc-0be01860','State': {
            'Code': 'active'
        },'Type': 'network','AvailabilityZones': [{
            'ZoneName': 'ap-south-1a','subnetId': 'subnet-ed5fb986','LoadBalancerAddresses': []
        },{
            'ZoneName': 'ap-south-1b','subnetId': 'subnet-89d285c5','LoadBalancerAddresses': []
        }]]}"'

我想访问 LoadBalancerAddress ,我是这样尝试的:

LoadBalancers=response['LoadBalancers']
for i in LoadBalancers:
  AvailabilityZones=i['AvailabilityZones']
  for j in AvailabilityZones:
    LoadBalancerAddresses=i['LoadBalancerAddresses']

但是,它抛出一个错误,说 LoadBalancerAddresses 存在关键字错误,我无法理解。 请帮助我如何访问变量。

解决方法

您将 j['LoadBalancerAddresses'] 错误输入为 i['LoadBalancerAddresses']。由于 LoadBalancerAddresses 下没有名为 response['LoadBalancers'] 的键,因此您的程序会抛出 KeyError

固定版本:

LoadBalancers=response['LoadBalancers']
for i in LoadBalancers:
  AvailabilityZones=i['AvailabilityZones']
  for j in AvailabilityZones:
    LoadBalancerAddresses=j['LoadBalancerAddresses']

作为一种安全选项,在访问之前检查密钥是否存在是一种很好的做法,例如:

for j in AvailabilityZones:
    if "LoadBalancerAddresses" in j:
        LoadBalancerAddresses=j['LoadBalancerAddresses']
    else:
        print("The key does not exist")
,

你可以在这里使用嵌套列表理解,就像这样:

addresses = [x['LoadBalancerAddresses'] for res in aaa['LoadBalancers'] for x in res['AvailabilityZones']]

或使用普通嵌套列表:

addresses = []
for bal in aaa['LoadBalancers']:
    for zones in bal['AvailabilityZones']:
        addresses += zones['LoadBalancerAddresses']