2016-08-03 1 views
1

J'utilise boto3, j'ai besoin de lister toutes les adresses IP élastiques, trouver celles qui ne sont associées à aucune instance et les libérer.Comment lister toutes les adresses IP élastiques non utilisées et les libérer en utilisant boto3

Ce que je fais est:

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

Je pourrais énumérer tous les volumes comme ceci:

for volume in ec2.volumes.all(): 

Ou tous les cas comme celui-ci:

for instance in ec2.instances.all(): 

Mais je n » Je sais comment lister toutes les adresses IP élastiques.

La documentation de boto3 répertorie l'objet ClassicAddress qui est ce dont j'ai besoin pour libérer l'adresse IP.

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

Cependant, je ne sais pas comment obtenir une collection de tous les ClassicAddresses

Répondre

0

Je l'ai eu à travailler avec ce code:

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

Je ne voudrais pas utiliser le code de mkreder , car il peut libérer EIP qui ne sont effectivement pas attachés à une instance, mais aussi ceux qui sont attachés à une passerelle NAT dans un VPC. Espérons que j'ai couru ce code à l'aide

DryRun = True 
+0

Pouvez-vous s'il vous plaît améliorer votre poste et décrire ce que vous préférez? – EFrank

+0

désolé à ce sujet, mon scénario n'a pas de passerelles NAT. Ce serait bien si vous pouvez fournir une version mise à jour avec cette correction afin que je puisse marquer votre question comme correcte au cas où quelqu'un d'autre arrive à cette page – mkreder

2

Nous pouvons simplement vérifier si l'EIP a un eni qui lui est associée. De cette façon, il va surmonter la question de savoir si le PEI est associé à un NAT ou un EC2.

juste en utilisant le code de mkreder et de faire un petit changement pour vérifier la NetworkInterfaceId au lieu du 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']) 

Peu importe si l'EIP est associée à un NAT ou un EC2, il aura un interface réseau jointe, bien que lorsqu'il est attaché à un NAT, il n'a pas un InstanceId.