Python Ни одно значение не применяется - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь найти ключи и значения в экземпляре AWS. Если ключ присутствует, я хочу, чтобы скрипт сообщал о значении, если оно существует, или сообщал None, если ключ не имеет значения.

Я делаю это для нескольких пар ключ-значение, и все они работают, кроме одной .

Эти пары ключ / значение сообщают None, если для ключа нет значения:

instance_list = ec2.describe_instances()
    for reservation in instance_list["Reservations"]:
        for instance in reservation.get("Instances", []):
            if instance['PublicDnsName']:
                public_dns_name = instance['PublicDnsName']
            else:
                public_dns_name = None
            if 'KeyName' in instance:
                key_name = instance['KeyName']
            else:
                key_name = None

Это всегда показывает пустое значение вместо None. Он сообщает значение, когда их ключ имеет значение:

                if 'PrivateDnsName' in instance:
                    private_dns = instance['PrivateDnsName']
                else:
                    private_dns = None

Вот значение instance для идентификатора экземпляра, который показывает пустую запись для private_dns:

{'AmiLaunchIndex': 0, 'ImageId': 'ami-062f7200baf2fa504', 'InstanceId': 'i-02fa5c552a10ddfca', 'InstanceType': 't2.micro', 'KeyName': 'sncr-timd', 'LaunchTime': datetime.datetime(2020, 1, 14, 22, 25, tzinfo=tzutc()), 'Monitoring': {'State': 'disabled'}, 'Placement': {'AvailabilityZone': 'us-east-1b', 'GroupName': '', 'Tenancy': 'default'}, 'PrivateDnsName': '', 'ProductCodes': [], 'PublicDnsName': '', 'State': {'Code': 48, 'Name': 'terminated'}, 'StateTransitionReason': 'User initiated (2020-01-15 14:43:16 GMT)', 'Architecture': 'x86_64', 'BlockDeviceMappings': [], 'ClientToken': '', 'EbsOptimized': False, 'EnaSupport': True, 'Hypervisor': 'xen', 'NetworkInterfaces': [], 'RootDeviceName': '/dev/xvda', 'RootDeviceType': 'ebs', 'SecurityGroups': [], 'StateReason': {'Code': 'Client.UserInitiatedShutdown', 'Message': 'Client.UserInitiatedShutdown: User initiated shutdown'}, 'VirtualizationType': 'hvm', 'CpuOptions': {'CoreCount': 1, 'ThreadsPerCore': 1}, 'CapacityReservationSpecification': {'CapacityReservationPreference': 'open'}, 'HibernationOptions': {'Configured': False}, 'MetadataOptions': {'State': 'pending', 'HttpTokens': 'optional', 'HttpPutResponseHopLimit': 1, 'HttpEndpoint': 'enabled'}}

Вот как выглядит результат, когда instance имеет клавишу private_dns и значение:

Private DNS: ip-172-31-37-19.us-east-2.compute.internal

Так выглядит instance, когда существует private_dns:

{'AmiLaunchIndex': 0, 'ImageId': 'ami-02ccb28830b645a41', 'InstanceId': 'i-069e87e16db1bf49b', 'InstanceType': 't2.micro', 'KeyName': 'sncr-timd', 'LaunchTime': datetime.datetime(2020, 1, 14, 22, 27, 17, tzinfo=tzutc()), 'Monitoring': {'State': 'disabled'}, 'Placement': {'AvailabilityZone': 'us-east-2c', 'GroupName': '', 'Tenancy': 'default'}, 'PrivateDnsName': 'ip-172-31-37-19.us-east-2.compute.internal', 'PrivateIpAddress': '172.31.37.19', 'ProductCodes': [], 'PublicDnsName': 'ec2-18-223-15-106.us-east-2.compute.amazonaws.com', 'PublicIpAddress': '18.223.15.106', 'State': {'Code': 16, 'Name': 'running'}, 'StateTransitionReason': '', 'SubnetId': 'subnet-22038f6e', 'VpcId': 'vpc-859c5aee', 'Architecture': 'x86_64', 'BlockDeviceMappings': [{'DeviceName': '/dev/xvda', 'Ebs': {'AttachTime': datetime.datetime(2020, 1, 14, 22, 27, 18, tzinfo=tzutc()), 'DeleteOnTermination': True, 'Status': 'attached', 'VolumeId': 'vol-08f30292b9a7039bc'}}], 'ClientToken': '', 'EbsOptimized': False, 'EnaSupport': True, 'Hypervisor': 'xen', 'NetworkInterfaces': [{'Association': {'IpOwnerId': 'amazon', 'PublicDnsName': 'ec2-18-223-15-106.us-east-2.compute.amazonaws.com', 'PublicIp': '18.223.15.106'}, 'Attachment': {'AttachTime': datetime.datetime(2020, 1, 14, 22, 27, 17, tzinfo=tzutc()), 'AttachmentId': 'eni-attach-0937973380674deef', 'DeleteOnTermination': True, 'DeviceIndex': 0, 'Status': 'attached'}, 'Description': '', 'Groups': [{'GroupName': 'launch-wizard-1', 'GroupId': 'sg-08b8c8a89bcc3c692'}], 'Ipv6Addresses': [], 'MacAddress': '0a:d9:9b:03:a7:a8', 'NetworkInterfaceId': 'eni-0bfcd12253ecf87ec', 'OwnerId': '565241749827', 'PrivateDnsName': 'ip-172-31-37-19.us-east-2.compute.internal', 'PrivateIpAddress': '172.31.37.19', 'PrivateIpAddresses': [{'Association': {'IpOwnerId': 'amazon', 'PublicDnsName': 'ec2-18-223-15-106.us-east-2.compute.amazonaws.com', 'PublicIp': '18.223.15.106'}, 'Primary': True, 'PrivateDnsName': 'ip-172-31-37-19.us-east-2.compute.internal', 'PrivateIpAddress': '172.31.37.19'}], 'SourceDestCheck': True, 'Status': 'in-use', 'SubnetId': 'subnet-22038f6e', 'VpcId': 'vpc-859c5aee', 'InterfaceType': 'interface'}], 'RootDeviceName': '/dev/xvda', 'RootDeviceType': 'ebs', 'SecurityGroups': [{'GroupName': 'launch-wizard-1', 'GroupId': 'sg-08b8c8a89bcc3c692'}], 'SourceDestCheck': True, 'VirtualizationType': 'hvm', 'CpuOptions': {'CoreCount': 1, 'ThreadsPerCore': 1}, 'CapacityReservationSpecification': {'CapacityReservationPreference': 'open'}, 'HibernationOptions': {'Configured': False}, 'MetadataOptions': {'State': 'applied', 'HttpTokens': 'optional', 'HttpPutResponseHopLimit': 1, 'HttpEndpoint': 'enabled'}}

Мне интересно, почему это так. Как мне это исправить?

Ответы [ 2 ]

1 голос
/ 15 января 2020

Похоже, что из-за instance в "PrivateDnsName" key хранится пустая строка. Попробуйте заменить:

if 'PrivateDnsName' in instance:
    private_dns = instance['PrivateDnsName']
else:
    private_dns = None

на:

if 'PrivateDnsName' in instance and instance['PrivateDnsName'] != '':
    private_dns = instance['PrivateDnsName']
else:
    private_dns = None
1 голос
/ 15 января 2020

Я думаю, что ключ PrivateDnsName всегда оси, попробуйте изменить:

private_dns = instance['PrivateDnsName']

с

private_dns = instance['PrivateDnsName'] if instance['PrivateDnsName'] else None

РЕДАКТИРОВАТЬ

Чтобы избежать возможного KeyError Вы можете использовать .get()

vpc_id = instance.get('VpcId') if instance.get('VpcId') else None
...