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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何列出所有未使用的弹性IP并使用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的集合

答案

我们可以检查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。

另一答案

我得到了这个代码:

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'])
另一答案

用过的:

if "InstanceId" not in eip_dict:
                if "NetworkInterfaceId" not in eip_dict:
另一答案

我不会使用mkreder的代码,因为它可以释放实际上没有附加到实例的EIP,也可以释放附加到VPC中的NAT网关的EIP。希望我使用运行此代码

DryRun = True

以上是关于如何列出所有未使用的弹性IP并使用boto3释放它们的主要内容,如果未能解决你的问题,请参考以下文章

如何列出所有实时(未释放)的 UIViewControllers?

如何在 AWS 中删除弹性 IP 地址

如何获取 Auto Scaling 组中实例的 IP

我正在尝试使用 python boto3 列出 aws ECS 集群中的所有集群,它最多只能列出 100 个集群,我想要 300 个集群

使用 boto3 列出存储桶的内容

使用 boto3 列出 100 多个堆栈