Ejemplo: cargar un archivo en AWS S3 con Boto

Amazon Web Services (AWS) es una colección de servicios extremadamente populares para sitios web y aplicaciones, por lo que es importante saber cómo interactuar con los diversos servicios...

Código de ejemplo

Amazon Web Services (AWS) es una colección de servicios extremadamente populares para sitios web y aplicaciones, por lo que es importante saber cómo interactuar con los diversos servicios. Aquí, nos enfocamos en el Servicio de almacenamiento sencillo (S3), que es esencialmente un servicio de almacenamiento de archivos.

Todos los archivos se deben asignar a un depósito, al que se le asigna un nombre y se puede direccionar mediante http://s3.amazonaws.com/{bucket}/{key}. A cada archivo se le asigna una clave única, que se puede usar más adelante para recuperar el archivo.

Hay muchas otras opciones para asignar a depósitos y archivos (cifrado, ACL, etc.), pero no entraremos mucho en eso aquí. Solo observe las referencias a 'public-read', que permite que cualquier persona descargue el archivo.

El Código

El siguiente código muestra, en Python usando bota, cómo cargar un archivo en S3.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import os

import boto
from boto.s3.key import Key

def upload_to_s3(aws_access_key_id, aws_secret_access_key, file, bucket, key, callback=None, md5=None, reduced_redundancy=False, content_type=None):
    """
    Uploads the given file to the AWS S3
    bucket and key specified.
    
    callback is a function of the form:
    
    def callback(complete, total)
    
    The callback should accept two integer parameters,
    the first representing the number of bytes that
    have been successfully transmitted to S3 and the
    second representing the size of the to be transmitted
    object.
    
    Returns boolean indicating success/failure of upload.
    """
    try:
        size = os.fstat(file.fileno()).st_size
    except:
        # Not all file objects implement fileno(),
        # so we fall back on this
        file.seek(0, os.SEEK_END)
        size = file.tell()
    
    conn = boto.connect_s3(aws_access_key_id, aws_secret_access_key)
    bucket = conn.get_bucket(bucket, validate=True)
    k = Key(bucket)
    k.key = key
    if content_type:
        k.set_metadata('Content-Type', content_type)
    sent = k.set_contents_from_file(file, cb=callback, md5=md5, reduced_redundancy=reduced_redundancy, rewind=True)
    
    # Rewind for later use
    file.seek(0)
    
    if sent == size:
        return True
    return False

Usando el Código

Y así es como usarías el código:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
AWS_ACCESS_KEY = 'your_access_key'
AWS_ACCESS_SECRET_KEY = 'your_secret_key'

file = open('someFile.txt', 'r+')

key = file.name
bucket = 'your-bucket'

if upload_to_s3(AWS_ACCESS_KEY, AWS_ACCESS_SECRET_KEY, file, bucket, key):
    print 'It worked!'
else:
    print 'The upload failed...'

boto funciona con mucho más que S3, también puede acceder a EC2, [SSE](http://boto. readthedocs.org/en/latest/ref/ses.html), SQS y casi todos los demás servicios de AWS. Los documentos de boto son geniales, por lo que leerlos debería darle una buena idea de cómo usar los otros servicios. Pero si no, publicaremos más ejemplos de boto, como cómo recuperar los archivos de S3.

Recursos