[Хд] logo

Amazon S3: настройка и управление

Основные сценарии работы с S3 — хранение бэкапов и раздача статических файлов. Причем, приветствуется автоматизация действий. Amazon S3 usage

Синхронизация файлов

Для выгрузки файлов на S3, синхронизации и управления объектов используются любые существующие клиенты, веб-консоль, плагины, утилиты командной строки и REST API. В простейшем случае достаточно иметь AWS CLI для управления корзинами и объектами:

$ aws s3 sync s3://test-bucket /usr/local/test-bucket/ --metadata-directive REPLACE --expires "Wed, 7 Jun 2017 08:16:32 GMT" --cache-control "max-age=2592000"

# Файл для синхронизации с хранилищем, кэширование и возраст

Еще один метод — простой скрипт bash:

file=/path/to/file/to/upload
bucket=your-bucket
resource="/${bucket}/${file}"
contentType="application/x-compressed-tar"
dateValue=`date -R`
stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}"
s3Key=xxxxxxxxxxxxxxxxxxxx
s3Secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret} -binary | base64`
curl -X PUT -T "${file}" \
  -H "Host: ${bucket}.aws-region.amazonaws.com" \
  -H "Date: ${dateValue}" \
  -H "Content-Type: ${contentType}" \
  -H "Authorization: AWS ${s3Key}:${signature}" \
  https://${bucket}.aws-region.amazonaws.com/${file}

# Не забудьте указать путь к файлу, имя корзины и регион AWS

Этот пример легко превратить в bash-скрипт, который будет создавать бэкапы необходимых файлов и выгружать их на S3:

#!/bin/bash

cd /tmp
rm -rf backup
mkdir backup
cd backup

mkdir nginx && cd nginx
cp -R /etc/nginx/sites-enabled .
cp /etc/nginx/nginx.conf .

cd ..
mkdir git && cd git
repos=`ls -1 /home/git | grep '.git$'`
for repo in $repos; do
    cp -R "/home/git/${repo}" .
done    

cd ..
date=`date +%Y%m%d`
bucket=my-bucket
for dir in git nginx; do
    file="${date}-${dir}.tar.gz"
    cd $dir && tar czf $file *
    resource="/${bucket}/${file}"
    contentType="application/x-compressed-tar"
    dateValue=`date -R`
    stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}"
    s3Key=xxxxxxxxxxxxxxxxxxxx
    s3Secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret} -binary | base64`
    curl -X PUT -T "${file}" \
        -H "Host: ${bucket}.s3.amazonaws.com" \
        -H "Date: ${dateValue}" \
        -H "Content-Type: ${contentType}" \
        -H "Authorization: AWS ${s3Key}:${signature}" \
        https://${bucket}.s3.amazonaws.com/${file}
    cd ..
done

cd
rm -rf /tmp/backup

# Выгрузка резервных копий файла конфигурации Nginx и репозитория Git

PHP SDK

Чтобы использовать PHP для резервного копирования, нужно установить его SDK для Amazon AWS. Для него потребуется установленный PHP и Composer:

curl -sS https://getcomposer.org/installer | php # загрузка с офф. страницы


# установка последней версии SDK
php composer.phar require aws/aws-sdk-php

# Composer рекомендуется, но не обязателен

А затем нужно включать автозагрузчик:

<?php
require 'vendor/autoload.php';

# Не забывайте добавлять в свои скрипты

Опционально можно установить через Phar или ZIP-файл:

		# для Phar
<?php
require '/path/to/aws.phar';
	# для zip
require '/path/to/aws-autoloader.php';

# Необходимо распаковать файлы и включить их в скрипты

Для начала нужно настроить клиент для S3:

<?php

# Включить SDK при помощи Composer
require 'vendor/autoload.php';

$s3 = new Aws\S3\S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1'
]);

# Данные для входа лучше указывать через переменную среду или ini-файл в каталоге AWS

SDK позволяет использовать классы для применения общих конфигов между разными клиентами:

# Указание региона и последней версии клиентов
$sharedConfig = [
    'region'  => 'us-west-2',
    'version' => 'latest'
];

# Создать класс SDK
$sdk = new Aws\Sdk($sharedConfig);


# Создать клиент Amazon S3 с общими конфигурациями
$client = $sdk->createS3();

# Общие для всех клиентов опции размещаются в корне в виде ключ-значение

Для выполнения операций нужно вызывать метод в имени клиента:

 # Используется класс Aws\Sdk 
$s3Client = $sdk->createS3();


# Отправка запроса PutObject и получение результата
$result = $s3Client->putObject([
    'Bucket' => 'my-bucket',
    'Key'    => 'my-key',
    'Body'   => 'this is the body!'
]);


# Загрузка объекта
$result = $s3Client->getObject([
    'Bucket' => 'my-bucket',
    'Key'    => 'my-key'
]);


# Выводит тело результата
echo $result['Body'];

# SDK использует файл настроек, который соответствует требуемой версии

Удаление контейнера в простейшем виде выглядит так:

$result = $client->deleteBucket([
    'Bucket' => 'test-bucket',
]);

# Контейнер должен быть пустым

А удаление объектов происходит так:

use Aws\S3\S3Client;

$s3 = S3Client::factory();

$bucket = 'test-bucket';
$keyname = 'object-key';

$result = $s3->deleteObject(array(
    'Bucket' => $bucket,
    'Key'    => $keyname
)); 

# Не забудьте указать ключ объекта

Ко всему прочему система поддерживает асинхронные и HTTP-запросы.

Учитывая широкие возможности SDK, выгрузка бэкапов в S3 реализуется максимально просто:

putenv('AWS_ACCESS_KEY_ID=Your_key_ID');
putenv('AWS_SECRET_ACCESS_KEY=Your_access_ID');
putenv('S3_BUCKET=bucket-name');
$s3 = new Aws\S3\S3Client(['version' => '2006-03-01', 'region' => 'eu-central-1', 'signature_version' => 'v4']);
$s3->upload('backup', 'path' . date('Y_m_d') . '.gz', fopen($dump, 'rb'));

# Указание данных авторизации через переменные среды, версий и региона

Жизненный цикл объектов

Чтобы автоматически удалять объекты определенного возраста, проще всего воспользоваться веб-консолью Amazon AWS, указав в ней expiration для нужных файлов. Если нужна автоматизация, то можно воспользоваться скриптами SDK или консоли S3, которые будут запускаться периодически.

А еще предусмотрены политики жизненного цикла (lifecycle policy). Это формы (в XML), набор правил, состоящий из ID правила, статуса (включено/выключено), типов объектов, на которые распространяется правило, переноса и “возраста” (expiration) объектов.

Выглядит он так:

<LifecycleConfiguration>
    <Rule>
        <ID>sample-rule</ID>
        <Prefix></Prefix>
        <Status>Enabled</Status>
        <Transition>Disabled</Transition>    
        <Expiration>
             <Days>365</Days>
        </Expiration>
    </Rule>
</LifecycleConfiguration>

# Все объекты с возрастом более 365 дней будут удалены

Этот набор правил применяется к нужному контейнеру (записывается в свойства контейнера):

$ aws s3api put-bucket-lifecycle  \
--bucket bucketname  \
--lifecycle-configuration filename-containing-lifecycle-configuration

# Нужно указать имя контейнера и имя файла XML, который лежит в локальной директории

Простые политики перемещения и удаления файлов удобно создавать при помощи веб-консоли AWS.

Также можно поместить правила в JSON-файл:

{
    "Rules": [
        {
            "Status": "Enabled",
            "Prefix": "logs/",
            "Expiration": {
                "ExpiredObjectDeleteMarker": true
            },
            "ID": "TestOnly"
        }
    ]
}

# Будет применяться ко всем файлам логов

После этого можно автоматически применять нужные правила к новым объектам при помощи простого скрипта, который будет содержать команду:

$ aws s3api put-bucket-lifecycle  \
--bucket bucketname  \
--lifecycle-configuration file://lifecycle.json

# По тому же принципу проверяются и удаляются правила с контейнеров

S3 и Nginx

Nginx может раздавать статические файлы, которые хранятся на S3. Amazon S3 and Nginx

Нужно отредактировать его файл конфигурации, указав S3 в секции location:

location / {
  set $s3_bucket        “BUCKET.s3.amazonaws.com';
  set $aws_access_key   'AWSAccessKeyId=ACCESS_KEY';
  set $url_expires      'Expires=$arg_e';
  set $url_signature    'Signature=$arg_st';
  set $url_full         '$1?$aws_access_key&$url_expires&$url_signature';
  proxy_http_version    1.1;
  proxy_set_header       Host $s3_bucket;
  proxy_set_header       Authorization '';
  proxy_hide_header      x-amz-id-2;
  proxy_hide_header      x-amz-request-id;
  proxy_hide_header      Set-Cookie;
  proxy_ignore_headers   "Set-Cookie";
  proxy_buffering        off;
  proxy_intercept_errors on;
  resolver              172.16.0.23 valid=300s;
  resolver_timeout      10s;
  proxy_pass             http://$s3_bucket/$url_full;
}

# Не забудьте указать свои контейнеры и ключи доступа

Самое главное

Автоматизируйте все задачи загрузки и управления Amazon S3. Наличие SDK, консольной утилиты и API позволят использовать все возможности хранилища.

  read in english
[Хд]

Подписывайтесь на отборные материалы по продвинутой разработке

Google Email

Esc, чтобы подписаться позже