2016-08-03 37 views
1

Ich benutze boto3, ich muss alle elastischen IPs auflisten, finde die, die keiner Instanz zugeordnet sind, und lasse sie los.Wie man alle unbenutzten elastischen IPs auflistet und sie mit boto3 freigibt

Was ich tue, ist:

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

Dann konnte ich alle Volumes, da diese Liste:

for volume in ec2.volumes.all(): 

oder alle Instanzen wie folgt aus:

for instance in ec2.instances.all(): 

Aber ich don‘ Ich weiß, wie man alle elastischen IPs auflistet.

Die Dokumentation zu boto3 listet das Objekt ClassicAddress auf, das ich benötige, um die IP freizugeben.

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

aber ich weiß nicht, wie man eine Sammlung aller ClassicAddresses

Antwort

0

zu bekommen habe ich es mit diesem Code arbeiten:

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

ich nicht mkreder Code verwenden würde , weil es EIP freigeben kann, die tatsächlich nicht an eine Instanz angehängt sind, aber auch diejenigen, die an ein NAT-Gateway in einer VPC angeschlossen sind. Hoffentlich lief ich diesen Code

DryRun = True 
+0

Können Sie bitte Ihren Beitrag verbessern und beschreiben, was Sie stattdessen tun würden? – EFrank

+0

Entschuldigung, mein Szenario hat keine NAT-Gateways. Es wäre schön, wenn Sie eine aktualisierte Version mit diesem Fix zur Verfügung stellen könnten, damit ich Ihre Frage als richtig markieren kann, falls jemand anderes auf diese Seite kommt – mkreder

2

verwenden, können wir nur prüfen, ob die EIP einen eni im Zusammenhang mit ihm hat. Auf diese Weise wird die Frage gelöst, ob die EIP mit einer NAT oder einer EC2 verknüpft ist.

Nur mkreder Code und machen eine kleine Änderung der NetworkInterfaceId anstelle des 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']) 

Egal ob der EIP zu einem NAT oder einer EC2 zugeordnet ist, zu überprüfen, mit, wird es ein Netzwerkschnittstelle angeschlossen, obwohl, wenn sie an ein NAT angeschlossen ist, hat sie keine InstanceId.