con python-boto3 podemos acceder a todos los recursos de AWS.
un ejemplo, un listado de todos los recursos visibles para una cuenta.
- iteramos por regiones, y en cada una:- EC2:
– listar maquinas para cada region
– listar elastic IPs
– balanceadores
– RDS
– snapshots
– AMIs
– EBS Volumes
– AutoScalingGroups
– VPCs
– S3
– listar buckets, y tamaño de cada
– RDS
– DynamoDB
– Elasticache
– Redshift
– CloudFormation Stacks
– CloudFront Distribution point
– Route53 zones
– SQS
– SNS
– Lambda
elementos sin region: buckets de S3
- cada elemento tiene tags, nombre de usuario y proyecto, USERNAME, PROJECT.
- tambien hay un tag especial, para registrar la fecha de caducidad, o “nodelete” en caso de no caducar. EXPIRATION_DATE.
…
primera aproximacion:
#!/usr/bin/python import boto3 owner_snapshots = 'xxxxxxxxxx' regiones = [ 'eu-west-1' ] # 'us-east-1', # 'eu-west-1', # 'us-east-2', # 'us-west-1', # 'us-west-2', # 'ca-central-1', # 'eu-central-1', # 'eu-west-2', # 'ap-southeast-1', # 'ap-southeast-2', # 'ap-northeast-2', # 'ap-northeast-1', # 'ap-south-1', # 'sa-east-1' # ] #client = boto3.client('ec2', region_name='us-west-2') #regiones = [region['RegionName'] for region in client.describe_regions()['Regions']] #regiones = regiones.sort() for region in regiones: salida = "" salida_instancias = "" salida_volumenes = "" salida_vpcs = "" salida_snapshots = "" print "###############################" print region ec2 = boto3.resource('ec2', region_name=region) for instance in ec2.instances.all(): salida_instancias = salida_instancias + instance.id + ", " try: for indice in range(0,len(instance.tags)): for key in instance.tags[indice]: salida_instancias= salida_instancias+ instance.tags[indice][key] + ", " except: pass if salida_instancias != "": print "---------- INSTANCIAS:" print salida_instancias for volumen in ec2.volumes.all(): salida_volumenes = salida_volumenes + volumen.id + ", " try: for indice in range(0,len(volumen.tags)): for key in volumen.tags[indice]: salida_volumenes = salida_volumenes + volumen.tags[indice][key] + ", " except: pass if salida_volumenes != "": print "---------- VOLUMENES:" print salida_volumenes for vpc in ec2.vpcs.all(): salida_vpcs = salida_vpcs + vpc.id + ", " try: for indice in range(0,len(vpc.tags)): for key in vpc.tags[indice]: salida_vpcs = salida_vpcs + vpc.tags[indice][key] + ", " except: pass if salida_vpcs != "": print "---------- VPCs:" print salida_vpcs for snapshot in ec2.snapshots.all(): if snapshot.owner_id == owner_snapshots: salida_snapshots = salida_snapshots +snapshot.id + ", " + ", " try: for indice in range(0,len(snapshot.tags)): for key in snapshot.tags[indice]: salida_snapshots= salida_snapshots+ snapshot.tags[indice][key] except: pass if salida_snapshots != "": print "---------- SNAPSHOTS:" print salida_snapshots
…
y cuando llevamos un rato avanzando, que ya tenemos un inventario de instancias, volumenes, VPCs y snapshots de todas las regiones, investigando la trasposicion a Lambda llego a esta explicacion detallada de “como hacer un inventario de AWS y guardarlo como CSV en S3, y mandarlo por correo”, que incluye codigo muy parecido al que llevo hecho.
…
despues de varias pruebas mas, utilizando los roles de IAM para autorizar a la funcion Lambda a hacer uso de SES, llegamos a este estado: