如何列出所有未使用的弹性 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:
我正在使用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: