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

mkr*_*der 2 python amazon-ec2 boto amazon-web-services boto3

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

我正在做的是:

import boto3   
ec2 = boto3.resource('ec2')
Run Code Online (Sandbox Code Playgroud)

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

for volume in ec2.volumes.all():
Run Code Online (Sandbox Code Playgroud)

或者像这样的所有实例:

for instance in ec2.instances.all():
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

小智 7

我们可以检查 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'])
Run Code Online (Sandbox Code Playgroud)

无论 EIP 是关联到 NAT 还是 EC2,它都会附加一个网络接口,尽管当附加到 NAT 时它没有 InstanceId。