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

admin

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

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

Для выгрузки файлов на 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=”PUTnn${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=”PUTnn${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 для резервного копирования, нужно установить его [https://aws.amazon.com/ru/sdk-for-php/ SDK] для Amazon AWS. Для него потребуется установленный PHP и Composer:

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

# установка последней версии SDK

php composer.phar require aws/aws-sdk-php

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

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


require 'vendor/autoload.php';

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

Опционально можно установить через [http://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.phar Phar] или [http://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.zip ZIP-файл]:

# для Phar


require ‘/path/to/aws.phar’;

# для zip

require ‘/path/to/aws-autoloader.php’;
## Необходимо распаковать файлы и включить их в скрипты

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


'region' => 'us-east-1'

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

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

# Указание региона и последней версии клиентов

$sharedConfig = [

‘region’ => ‘us-west-2’,

‘version’ => ‘latest’

];

# Создать класс SDK

$sdk = new AwsSdk($sharedConfig);

# Создать клиент Amazon S3 с общими конфигурациями

$client = $sdk->createS3();

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

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

# Используется класс AwsSdk

$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 AwsS3S3Client;

$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 AwsS3S3Client([‘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, которые будут запускаться периодически.

А еще предусмотрены политики жизненного цикла ([http://docs.aws.amazon.com/AmazonS3/latest/UG/LifecycleConfiguration.html lifecycle policy]). Это формы (в XML), набор правил, состоящий из ID правила, статуса (включено/выключено), типов объектов, на которые распространяется правило, переноса и “возраста” (expiration) объектов.

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

sample-rule

****

Enabled

Disabled

**365**

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

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

$ aws s3api put-bucket-lifecycle

–bucket **bucketname**

–lifecycle-configuration **filename-containing-lifecycle-configuration**

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

Простые политики перемещения и удаления файлов удобно создавать при помощи [https://www.youtube.com/watch?v=DdEbC6t6gBY веб-консоли 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.

Нужно отредактировать его файл конфигурации, указав 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;**

}

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

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

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

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023