Manipular ficheros en Amazon S3 con Python y Boto

Automatizar la subida (o descarga) de ficheros a Amazon S3 con Python

Desde que empecé a usar Amazon S3 para alojar los instaladores de EasyJob Resume Builder, CurrículumFácil y CV-Express, me surgió un problema: tenía que actualizar los ficheros después de cada compilación, de forma manual.

Para evitar errores y despistes y siguiendo el principio de que "coñazo es todo aquello que no automatizas", me puse a buscar módulos Python para manipular ficheros en Amazon S3

Boto: una interfase integrada a los servicios presentes y futuros de Amazon Web Services (AWS) en Python

Para mi agradable sorpresa, me encontré con Boto, una serie de módulos python que te permiten acceder de forma programática a practicamente todos los servicos ofrecidos por Amazon Web Services. Algunos de ellos son:

  • Simple Storage Service (S3)
  • Simple Queue Service (SQS)
  • Elastic Compute Cloud (EC2)
    • Elastic Load Balancer (ELB)
    • CloudWatch
    • AutoScale
  • Mechanical Turk
  • SimpleDB (SDB)
  • CloudFront
  • Virtual Private Cloud (VPC)
Sólo he mirado lo referente a S3, y en general parece una API bastante clara y bastante estable (es a fecha de hoy un versión 1.8).

Algunos ejemplos de código con Boto y Python para acceder a "buckets" y ficheros en Amazon S3:

from boto.s3.connection import S3Connectionfrom boto.s3.key import KeyS3_ACCESS_ID = "xxxxxxxxxxxxxxxxxxxxx"S3_SECRET_ACCESS_KEY = "yyyyyyyyyyyyyyyyyyyyyyyyyy"def view_buckets():    """    Recupera una lista de los "buckets" en S3    """    #Nos conectamos a S3    c = S3Connection(aws_secret_access_key = S3_SECRET_ACCESS_KEY, aws_access_key_id=S3_ACCESS_ID)    # recuperamso los buckets    buckets= c.get_all_buckets()    c.close()    return bucketsdef get_keys_in_bucket(bucket_name):    """    Obtiene la lista de claves en un bucket    """    c = S3Connection(aws_secret_access_key = S3_SECRET_ACCESS_KEY, aws_access_key_id=S3_ACCESS_ID)    b = c.get_bucket(bucket_name)    keys = b.list()    return keysdef upload_file_to_bucket(bucket_name, file_name, s3_key):    """    Sube un fichero a un bucket    """    # Nos conectamos a s3    c = S3Connection(aws_secret_access_key = S3_SECRET_ACCESS_KEY, aws_access_key_id=S3_ACCESS_ID)    # Obtenemos el bucket    b = c.get_bucket(bucket_name)    # Subimos el fichero    k = Key(b)    k.key  = s3_key    k.set_contents_from_filename(file_name)