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

时间:2016-08-03 16:51:58

标签: 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文档列出了对象ClassicAddress,这是我发布IP所需的内容。

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我使用了这段代码:

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'])

答案 2 :(得分:0)

使用过:

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

答案 3 :(得分:-1)

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

运行此代码
for counter in range (6):
  if counter == 5:
    print("Maximum speed reached!\n")
    break ##Break out of loop if condition met.
  myCar.accelerate()
  time.sleep(1) ##Add 1 second delay each loop.