Основные сценарии работы с 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 для резервного копирования, нужно установить его [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
## По тому же принципу проверяются и удаляются правила с контейнеров
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 позволят использовать все возможности хранилища.
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…