Python 如何列出所有未使用的弹性IP并使用boto3释放它们

Python 如何列出所有未使用的弹性IP并使用boto3释放它们,python,amazon-web-services,amazon-ec2,boto,boto3,Python,Amazon Web Services,Amazon Ec2,Boto,Boto3,我正在使用boto3,我需要列出所有弹性IP,找到那些与任何实例都没有关联的IP,然后释放它们 我正在做的是: import boto3 ec2 = boto3.resource('ec2') 然后,我可以将所有卷按如下方式列出: for volume in ec2.volumes.all(): 或所有类似的实例: for instance in ec2.instances.all(): 但我不知道如何列出所有弹性IP boto3文档列出了发布IP所需的对象ClassicAddres

我正在使用boto3,我需要列出所有弹性IP,找到那些与任何实例都没有关联的IP,然后释放它们

我正在做的是:

import boto3   
ec2 = boto3.resource('ec2')
然后,我可以将所有卷按如下方式列出:

for volume in ec2.volumes.all():
或所有类似的实例:

for instance in ec2.instances.all():
但我不知道如何列出所有弹性IP

boto3文档列出了发布IP所需的对象ClassicAddress


但是,我不知道如何获取所有ClassicadAddress的集合

我使用以下代码获得它:

def elastic_ips_cleanup():
    """ Cleanup elastic IPs that are not being used """
    client = boto3.client('ec2')
    addresses_dict = client.describe_addresses()
    for eip_dict in addresses_dict['Addresses']:
        if "InstanceId" not in eip_dict:
            print (eip_dict['PublicIp'] +
                   " doesn't have any instances associated, releasing")
            client.release_address(AllocationId=eip_dict['AllocationId'])

我不会使用mkreder的代码,因为它可以释放那些实际上没有连接到实例的EIP,但是也可以释放那些连接到VPC中NAT网关的EIP。 希望我使用

DryRun = True

我们只需检查EIP是否有关联的eni。这样,它将克服EIP是与NAT关联还是与EC2关联的问题

只需使用mkreder的代码并进行一个小的更改,以检查网络接口ID,而不是实例ID

import boto3
client = boto3.client('ec2')
addresses_dict = client.describe_addresses()
for eip_dict in addresses_dict['Addresses']:
    if "NetworkInterfaceId" not in eip_dict:
        print(eip_dict['PublicIp'])
        client.release_address(AllocationId=eip_dict['AllocationId'])
无论EIP与NAT或EC2关联,它都会连接一个网络接口,尽管当连接到NAT时,它没有InstanceId。

使用了:

if "InstanceId" not in eip_dict:
                if "NetworkInterfaceId" not in eip_dict:

你能改进一下你的帖子并描述一下你会做什么吗?很抱歉,我的场景没有NAT网关。如果你能提供一个更新的版本,这样我就可以把你的问题标记为正确的,以防其他人看到这个页面