AWS: S3, Simple Storage Service – описание, примеры

Автор: | 05/05/2016

aws-logo-square-02Amazon S3 (Amazon Simple Storage Service) позволяет хранить контент и получать к нему доступ из любого места в любое время.

Amazon 3 хранит данные в виде объектов в корзинах (bucket). Каждый объект представляет собой файл и, опционально – метаданные, которые этот объект описывают (например – Content Type)

Что бы сохранить данные в S3 – вам необходимо загрузить данные в корзину. После того, как данные загружены – вы можете установить ограничения доступа к нему.

Корзина – это контейнер, который хранит объекты. Вы можете иметь неограниченное количество таких корзин, и для каждой – установить доступ (кто может создавать, удалять и просматривать список объектов в корзине), просматривать логи доступа к корзине и объектам в ней.

  • Создание S3 bucket
  • Добавление объектов
  • Права доступа

Создание bucket

Для создания корзины через веб-интерфейс – переходим в https://console.aws.amazon.com/s3/ и жмём Create bucket:

aws_s3_1

Указываем имя (которое должно быть уникальным среди всех S3 корзин всех пользователей) и регион:

aws_s3_2

aws_s3_3

Или с помощью AWS CLI:

$ aws s3 mb s3://rtfmex2
make_bucket: s3://rtfmex2/

Имейте ввиду, что после создания корзины – её нельзя переименовать, а её имя будет включено в URL.

Добавление объектов

Объектом для S3 может быть любой файл. После его добавления – вы можете добавить метаданные и установить права доступа к этому объекту.

Для добавления через веб-интерйес – жмём Upload:

aws_s3_4

Выбираем файл для загрузки, и жмём Start upload:

aws_s3_5

aws_s3_6

Либо через CLI:

$ aws s3 cp textfile.txt s3://rtfmex2
upload: ./textfile.txt to s3://rtfmex2/textfile.txt

Проверяем:

aws_s3_7

CLI:

$ aws s3 ls s3://rtfmex2
2016-05-05 13:01:47         25 textfile.txt

Права доступа

По умолчанию – S3 корзины и объекты в них являются приватными и недоступны для чтения:

$ curl https://s3-eu-west-1.amazonaws.com/rtfmex1/textfile.txt
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message>

Все права доступа к корзинам и объектам в них записываются в ACL (Access Control List), которые можно просмотреть с помощью AWS CLI s3api:

Просмотреть ACL корзины:

$ aws s3api get-bucket-acl --bucket rtfmex2
{
    "Owner": {
        "DisplayName": "username", 
        "ID": "a8e627b97012bf714c8308e668fe092628e6e69006499397b6cb8f337322a7b1"
    }, 
    "Grants": [
        {
            "Grantee": {
                "Type": "CanonicalUser", 
                "DisplayName": "username", 
                "ID": "a8e627b97012bf714c8308e668fe092628e6e69006499397b6cb8f337322a7b1"
            }, 
            "Permission": "FULL_CONTROL"
        }
    ]
}

ACL объекта:

$ aws s3api get-object-acl --bucket rtfmex2 --key textfile.txt
{
    "Owner": {
        "DisplayName": "username", 
        "ID": "a8e627b97012bf714c8308e668fe092628e6e69006499397b6cb8f337322a7b1"
    }, 
    "Grants": [
        {
            "Grantee": {
                "Type": "CanonicalUser", 
                "DisplayName": "username", 
                "ID": "a8e627b97012bf714c8308e668fe092628e6e69006499397b6cb8f337322a7b1"
            }, 
            "Permission": "FULL_CONTROL"
        }
    ]
}

Либо – в панели управления:

aws_s3_8

Права доступа могут быть установлены для другого аккаунта AWS или встроенных групп. Владелец по умолчанию имеет полный доступ.

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

Что бы установить права доступа – выбераем объект или корзину, кликаем правой кнопкой и выбираем Properties:

aws_s3_9

Затем – Add more permissions:

aws_s3_10

Из выпадающего списка в Grantee – выбираем:

  • Everyone: открыть анонимный доступ всем
  • Authenticated Users: доступ для любого авторизированного пользователя AWS или AIM роли
  • Log Delivery: открывает доступ, когда корзина используется в роли хранилища логов сервера
  • Me: только вы сами (ваш root аккаунт), но не AIM пользователь

Вы можете указать права доступа используя canonical user ID или почтовый адрес в поле Grantee.

Примечание: Найти canonical user ID можно в панели управления > Security credentials > Account Identifiers.

Для S3 имеется три группы правил доступа:

  • Open/Download: чтение/загрузка объекта залогиненому пользователю
  • View Permissions: просмотр прав доступа, связанных с этим объектом
  • Edit Permissions: изменение прав доступа, связанных с этим объектом

Открываем общий (Everyone) доступ на чтение файла:

aws_s3_11

Либо – с помощью CLI:

$ aws s3api put-object-acl --bucket rtfmex2 --key textfile.txt --acl public-read

Проверяем:

$ curl https://s3-eu-west-1.amazonaws.com/rtfmex2/textfile.txt
This is textfile from S3

И ещё несколько полезных команд CLI.

Просмотреть все корзины:

$ aws s3api list-buckets
{
    "Owner": {
        "DisplayName": "username", 
        "ID": "a8e627b97012bf714c8308e668fe092628e6e69006499397b6cb8f337322a7b1"
    }, 
    "Buckets": [
        ...
        {
            "CreationDate": "2016-05-05T09:50:28.000Z", 
            "Name": "rtfmex1"
        }, 
        {
            "CreationDate": "2016-05-05T09:52:15.000Z", 
            "Name": "rtfmex2"
        }, 
    ...
    ]
}

Прсомотреть содержимое корзины:

$ aws s3 ls s3://rtfmex2
2016-05-05 13:01:47         25 textfile.txt

Скопировать все данные из текущего локального каталога в корзину:

$ mkdir to_bucket && touch to_bucket/file{1..5}.txt

$ ls -l to_bucket/
total 0
-rw-rw-r-- 1 setevoy setevoy 0 тра  5 17:07 file1.txt
-rw-rw-r-- 1 setevoy setevoy 0 тра  5 17:07 file2.txt
-rw-rw-r-- 1 setevoy setevoy 0 тра  5 17:07 file3.txt
-rw-rw-r-- 1 setevoy setevoy 0 тра  5 17:07 file4.txt
-rw-rw-r-- 1 setevoy setevoy 0 тра  5 17:07 file5.txt

$ aws s3 sync to_bucket/ s3://rtfmex2
upload: to_bucket/file3.txt to s3://rtfmex2/file3.txt
upload: to_bucket/file5.txt to s3://rtfmex2/file5.txt
upload: to_bucket/file4.txt to s3://rtfmex2/file4.txt
upload: to_bucket/file2.txt to s3://rtfmex2/file2.txt
upload: to_bucket/file1.txt to s3://rtfmex2/file1.txt

Удалить файл:

$ aws s3 rm s3://rtfmex2/file1.txt
delete: s3://rtfmex2/file1.txt

Больше примеров – тут>>>.

Ссылки по теме

Using Amazon S3 with the AWS Command Line Interface

s3api Available Commands

IAM Policies and Bucket Policies and ACLs! Oh, My! (Controlling Access to S3 Resources)

Bucket Explorer