AWS SDK

Python

Boto

boto3 — это комплекты средств разработки (SDK) для языков программирования Python 3.x. SDK предназначены для работы с сервисами AWS.

Для установки boto воспользуйтесь инструкциями в соответствующих репозиториях boto3.

Для настройки создайте в домашнем каталоге конфигурационные файлы и задайте параметры:

  • статический ключ в файле ~/.aws/credentials:

    [default]
    aws_access_key_id = НомерАккаунта_ИмяПользователя
    aws_secret_access_key = Пароль
  • регион по умолчанию в файле ~/.aws/config:

    [default]
    region=ru-1a

Примеры операций

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import boto3

# Авторизация
s3 = boto3.client(
   service_name='s3',
   endpoint_url='https://s3.selcdn.ru'
)

# Загрузка объекта из строки
s3.put_object(Bucket='BucketName', Key='ObjectName1', Body='Test')

# Загрузка объекта из файла
s3.upload_file('data.docx', 'BucketName', 'ObjectName2')

# Получение списка объектов в бакете
for key in s3.list_objects(Bucket='BucketName')['Contents']:
   print(key['Key'])

# Скачивание объекта
get_object_response = s3.get_object(Bucket='BucketName', Key='ObjectName2')
print(get_object_response['Body'].read())

# Удаление нескольких объектов
objects_to_delete = [{'Key': 'ObjectName1'}, {'Key': 'ObjectName2'}]
s3.delete_objects(Bucket='BucketName', Delete={'Objects': objects_to_delete})

Пример для boto3

Создайте s3-клиент, предоставив endpoint_url, регион и данные пользователя, от имени которого будет производиться загрузка объектов:

s3 = boto3.client('s3', endpoint_url='https://s3.selcdn.ru', region_name='ru-1a', aws_access_key_id='user', aws_secret_access_key='user_pass')

Вызовите метод generate_presigned_post(), передав имя бакета, в который будет производиться загрузка, и имя ключа, которое может содержать шаблон ${filename} для имени файла, предоставленного пользователем в момент загрузки. Данный вызов вернёт словарь с url, на которую должна отправляться форма, и словарём fields со всеми необходимыми заполненными полями для этой формы (X-Amz-Algorithm, X-Amz-Credential, X-Amz-Date, X-Amz-Signature, Policy).

post = s3.generate_presigned_post(bucket, key)

Если к объекту (и форме) необходимо добавить дополнительные поля, например, заголовок Content-Type, то передайте словарь с этими полями аргументом Fields. Также, согласно спецификации Policy, нужно описать каждое дополнительное поле в массиве conditions (аргумент Conditions в boto).

post = s3.generate_presigned_post(bucket, key,
                                  Fields={"Content-Type": "image/webp"},
                                  Conditions=[["eq", "$content-type", "image/webp"]])

Из полученных данных можно составить HTML-форму или воспроизвести запрос через requests:

requests.post(post['url'], data=post['fields'], files=[("file", ('filename', b'body_data'))])

При генерации HTML-формы стоит учитывать, что поле file с данными загружаемого файла должно находиться в конце формы.

PHP

AWS SDK для PHP — это комплект средств разработки для работы с сервисами AWS.

SDK представляет собой современную библиотеку PHP с открытым исходным кодом, которая упрощает интеграцию приложения на PHP с объектным хранилищем S3.

Для подключения библиотеки с помощью инструмента управления зависимостями Composer выполните следующие шаги:

  1. Установите Composer:

    curl -sS https://getcomposer.org/installer | php
  2. Запустите команду Composer для установки последней стабильной версии SDK:

    php composer.phar require aws/aws-sdk-php
  3. Включите aws-sdk-php в свой скрипт.

Для авторизации необходимы ключи доступа Access key ID (НомерАккаунта_ИмяПользователя) и Secret access key (Пароль).

Примеры операций

<?php
require 'vendor/autoload.php';
 
use Aws\S3\S3Client;
// Создание клиента
$s3Client = new S3Client([
   'version' 	=> 'latest',
   'region'  	=> 'ru-1a',
   'use_path_style_endpoint' => true,
   'credentials' => [
   	'key'	=> 'НомерАккаунта_ИмяПользователя',
   	'secret' => 'Пароль',
   ],
   'endpoint' => 'https://s3.selcdn.ru'
]);
 
// Загрузка объекта из строки
$s3Client->putObject([
   'Bucket' => 'BucketName',
   'Key'	=> 'ObjectName',
   'Body'   => 'Test'
]);
 
// Скачивание объекта
$result = $s3Client->getObject([
   'Bucket' => 'BucketName',
   'Key'	=> 'ObjectName'
]);
 
echo $result['Body'];

JavaScript

AWS SDK для Node JS — это комплект средств разработки для работы JavaScript с сервисами AWS в среде Node.js.

Пример работы для Node JS

var S3 = require('aws-sdk/clients/s3');

var s3 = new S3({
    accessKeyId: 'НомерАккаунта_ИмяПользователя',
    secretAccessKey: 'Пароль',
    endpoint: 'https://s3.selcdn.ru',
    s3ForcePathStyle: true,
    region: 'ru-1a',
    apiVersion: 'latest'
});

// Загрузка объекта

var params = {
    Bucket: 'BucketName',
    Key: 'ObjectName',
    Body: 'Test'
};

s3.upload(params, (err, data) => {
    if (err) {
        console.log(err, err.stack);
    } else {
        console.log(data); 
    }
    /*
    data = {
        ETag: '0cbc6611f5540bd0809a388dc95a615b',
        Location: 'https://s3.selcdn.ru/BucketName/ObjectName',
        key: 'ObjectName',
        Key: 'ObjectName',
        Bucket: 'BucketName'
    }
    */

});

// Получение метаданных объекта

var params = {
    Bucket: 'BucketName',
    Key: 'ObjectName'
};

s3.headObject(params, (err, data) => {
    if (err) {
        console.log(err, err.stack);
    } else {
        console.log(data); 
    }
    /*
    data = {
        AcceptRanges: 'bytes',
        LastModified: 2019-12-03T17:29:15.000Z,
        ContentLength: 4,
        ETag: '0cbc6611f5540bd0809a388dc95a615b',
        ContentType: 'application/octet-stream',
        Metadata: {}
    }
    */
});

// Получение объекта

var params = {
    Bucket: 'BucketName',
    Key: 'ObjectName'
};

s3.getObject(params, (err, data) => {
    if (err) {
        console.log(err, err.stack);
    } else {
        console.log(data); 
    }
    /*
    data = {
        AcceptRanges: 'bytes',
        LastModified: 2019-12-03T17:29:15.000Z,
        ContentLength: 4,
        ETag: '0cbc6611f5540bd0809a388dc95a615b',
        ContentType: 'application/octet-stream',
        Metadata: {},
        Body: <Buffer 54 65 73 74>
    }
    */
});


// Удаление объекта

var params = {
    Bucket: 'BucketName',
    Key: 'ObjectName'
};

s3.deleteObject(params, (err, data) => {
    if (err) {
        console.log(err, err.stack);
    } else {
        console.log(data); 
    }
    /*
    data = {
    }
    */
});