2016-08-03 2 views
1

Я использую boto3, мне нужно указать все эластичные IP-адреса, найти те, которые не связаны ни с каким экземпляром, и освободить их.Как перечислить все неиспользуемые эластичные IP-адреса и отпустить их с помощью boto3

Что я делаю:

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

Тогда я мог бы перечислить все тома, как это:

for volume in ec2.volumes.all(): 

Или все случаи, как это:

for instance in ec2.instances.all(): 

Но я не» t знать, как перечислить все эластичные IP.

В документации boto3 указан объект ClassicAddress, который мне нужен, чтобы освободить IP-адрес.

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

Однако, я не знаю, как получить коллекцию всех ClassicAddresses

ответ

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

Я бы не использовать код mkreder в , поскольку он может освободить EIP, которые фактически не привязаны к экземпляру, но также те, которые подключены к шлюзу NAT в VPC. Надеюсь, я побежал этот код с помощью

DryRun = True 
+0

Не можете улучшить свой пост и описать все, что захотите? – EFrank

+0

жаль, что в моем сценарии нет шлюзов NAT. Было бы неплохо, если бы вы могли предоставить обновленную версию с этим исправлением, чтобы я мог правильно поставить ваш вопрос на случай, если кто-то еще попадет на эту страницу – mkreder

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.

 Смежные вопросы

  • Нет связанных вопросов^_^