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

How to list all unused elastic IPs and release them using boto3

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

我正在做的是:

import boto3   
ec2 = boto3.resource('ec2')

然后我可以这样列出所有卷:

for volume in ec2.volumes.all():

或者所有这样的实例:

for instance in ec2.instances.all():

但我不知道如何列出所有弹性 IP。

boto3 文档列出了对象 ClassicAddress,这是我释放 IP 所需要的。

http://boto3.readthedocs.io/en/latest/reference/services/ec2.html#classicaddress

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

我用这段代码得到了它:

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 的代码并进行小改动以检查 NetworkInterfaceId 而不是 InstanceId

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: