listando recursos de AWS

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:

 

 

aws, estimando el coste de stacks de CloudFormation

desde la CLI de aws podemos lanzar stacks de CloudFormation. Pero no solo lanzarlos. Tambien podemos estimar el coste mensual que tendrán:

si tenemos un fichero de parametros (parameters.json) como:

{
    "TemplateURL": "https://s3-us-west-2.amazonaws.com/cloudformation-templates-us-west-2/WordPress_Multi_AZ.template", 
    "Parameters": [
        {
            "ParameterKey": "KeyName", 
            "ParameterValue": "123456", 
            "UsePreviousValue": false 
        },
        {
            "ParameterKey": "DBPassword", 
            "ParameterValue": "asdfgfdsa", 
            "UsePreviousValue": false
        },
        {
            "ParameterKey": "DBUser", 
            "ParameterValue": "asdf", 
            "UsePreviousValue": false
        }
    ]
}

y lanzamos el comando:

aws cloudformation estimate-template-cost --cli-input-json "$(cat parameters.json)"

nos devuelve una url como:

------------------------------------------------------------------------------------------------------------------
|                                              EstimateTemplateCost                                              |
+-----+----------------------------------------------------------------------------------------------------------+
|  Url|  http://calculator.s3.amazonaws.com/calc5.html?key=cloudformation/2ab9aca7-e746-4570-8086-c35a7c3fc46e   |
+-----+----------------------------------------------------------------------------------------------------------+

que nos lleva a la calculadora de coste de AWS, y nos da para este ejemplo de WordPress en alta disponibilidad $71 al mes.

Una excusa mas para hacer uso intensivo de CloudFormation en diseño de soluciones AWS.

El repertorio de templates de CloudFormation esta en esta web