Рубрики
Без рубрики

Пример: Загрузка файла в AWS S3 с помощью Boto

Автор оригинала: Scott Robinson.

Пример кода

Amazon Web Services (AWS) – это набор чрезвычайно популярных сервисов для веб-сайтов и приложений, поэтому знание того, как взаимодействовать с различными сервисами, очень важно. Здесь мы сосредоточимся на Simple Storage Service (S3), который по сути является сервисом хранилища файлов.

Все файлы должны быть назначены ведру, которому присваивается имя и к которому можно обратиться с помощью http://s3.amazonaws.com/{ведро}/{ключ} . Каждому файлу присваивается уникальный ключ, который впоследствии может быть использован для извлечения файла.

Существует множество других вариантов назначения ведрам и файлам (шифрование, ACL и т. Д.), Но мы не будем вдаваться в подробности здесь. Просто обратите внимание на ссылки на “public-read”, что позволяет любому пользователю загрузить файл.

Код

Приведенный ниже код показывает, как в Python с помощью boto загрузить файл в S3.

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

Использование кода

А вот как вы будете использовать этот код:

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...'

bottom работает не только с S3, вы также можете получить доступ к EC2 , SES , SQS и почти ко всем другим сервисам AWS. Документы boto великолепны, поэтому их чтение должно дать вам хорошее представление о том, как использовать другие сервисы. Но если нет, то мы опубликуем еще несколько примеров бото, например, как получить файлы из S3.

Ресурсы