Amazon S3 (Simple Storage Service, сервис простого хранилища) — очень мощный онлайн сервис файлового хранилища, предоставляемого Amazon Web Services. Думайте о нем, как об удаленном диске, на котором вы можете хранить файлы в директориях, получать и удалять их. Компании, такие как DropBox, Netflix, Pinterest, Slideshare, Tumblr и многие другие, полагаются на него.

Хоть сервис и отличный, его код не открыт, поэтому вы должны доверять Amazon свои данные, и хоть они предоставляют доступ к бесплатному инстансу на год, вы все равно должны ввести информацию о кредитной карте для создания аккаунта. Т.к. S3 должен знать каждый инженер-программист, я хочу, чтобы мои студенты приобрели опыт работы с ним и использовали его в своих веб-приложениях, и еще я не хочу, чтобы они за это платили. Некоторые студенты также работают во время поездок, что означает медленное Интернет-соединение и дорогой трафик, либо вообще полное отсутствие Интернета.

Вот почему я начал искать открытые решения, которые бы эмулировали S3 API, и которые могли бы работать на любой машине. Как обычно, мир Open Source не разочаровал меня и предоставил несколько решений, вот мои любимые:

  • Первое, на что я наткнулся, было Fake S3, написанное на Ruby и доступное как гем, требуется всего несколько секунд для установки и библиотека очень хорошо поддерживается. Это отличный инструмент, чтобы начать, но он не реализует все команды S3 и не подходит для использования в продакшене.

  • Второй вариант — это HPE Helion Eucalyptus, который предоставляет широкий спектр эмуляции сервисов AWS (CloudFormation, Cloudwatch, ELB...), включая поддержку S3. Это весьма законченное решение (только работающее на CentOS), ориентированное на энтерпрайз и, к сожалению, слишком тяжеловесное для личного использования или для малого бизнеса.

  • Последний и предпочитаемый мною вариант — это сервер Scality S3. Доступен в виде Docker-образа, что очень легко позволяет его развернуть и начать использовать. Программное обеспечение подходит для личного использования, каждый может начать использовать его через несколько секунд без какой-либо сложной установки. Но оно также подходит и для энтерпрайза, т.к. оно масштабируемо и готово к продакшену. Лучшее из двух миров.

Начинаем работу с сервером Scality S3


Чтобы продемонстрировать насколько просто эмулировать AWS S3 с помощью сервера Scality S3, давайте его оживим!

Требования:

  • Установленный Docker
  • Установленный Ruby

Запустите Docker-контейнер сервера Scality S3:

$ docker run -d --name s3server -p 8000:8000 scality/s3server
Unable to find image 'scality/s3server:latest' locally
latest: Pulling from scality/s3server
357ea8c3d80b: Pull complete
52befadefd24: Pull complete
3c0732d5313c: Pull complete
ceb711c7e301: Pull complete
868b1d0e2aad: Pull complete
3a438db159a5: Pull complete
38d1470647f9: Pull complete
4d005fb96ed5: Pull complete
a385ffd009d5: Pull complete
Digest: sha256:4fe4e10cdb88da8d3c57e2f674114423ce4fbc57755dc4490d72bc23fe27409e
Status: Downloaded newer image for scality/s3server:latest
7c61434e5223d614a0739aaa61edf21763354592ba3cc5267946e9995902dc18
$

Убедитесь, что Docker-контейнер исправно работает:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
ed54e677b1b3        scality/s3server    "npm start"         5 days ago          Up 5 days           0.0.0.0:8000->8000/tcp   s3server

Установите Ruby-гем AWS SDK v2 (документация здесь):

$ gem install aws-sdk

Теперь давайте создадим файл, который мы загрузим в нашу корзину:

$ touch myfavoritefile

Используя ваш любимый текстовый редактор, создайте файл, содержащий ваш скрипт на Ruby, давайте назовем его ‘s3_script.rb’:

#!/usr/bin/ruby
require 'aws-sdk'
s3 = Aws::S3::Client.new(
    :access_key_id => 'accessKey1',
    :secret_access_key => 'verySecretKey1',
    :region => 'us-west-2',
    :endpoint => 'http://0.0.0.0:8000/',
    :force_path_style => true
)
s3.create_bucket({bucket: "mybucket"})
File.open('myfavoritefile', 'rb') do |file|
    s3.put_object(bucket: 'mybucket', key: 'myfavoritefile', body: file)
end
resp = s3.list_objects_v2(bucket: 'mybucket')
puts resp.contents.map(&:key)

Запустите скрипт:

$ ruby s3_script.rb
$ myfavoritefile

Поздравляю, вы создали вашу первую S3-корзину и загрузили в нее файл!

Давайте разберем код


Здесь мы указываем, что скрипт должен быть выполнен Ruby и что мы подключаем библиотеку AWS SDK:

#!/usr/bin/ruby
require 'aws-sdk'

Мы инициируем подключение к нашему серверу S3, работающему в нашем Docker-контейнере. Заметьте, что ‘accessKey1’ и ‘verySecretKey1’ — ключ доступа и ключ секретного доступа по умолчанию, определяемые сервером Scality S3:

s3 = Aws::S3::Client.new(
    :access_key_id => 'accessKey1',
    :secret_access_key => 'verySecretKey1',
    :region => 'us-west-2',
    :endpoint => 'http://127.0.0.1:8000/',
    :force_path_style => true
)

Создаем S3-корзину с именем ‘mybucket’:

s3.create_bucket({bucket: "mybucket"})

Здесь мы загружаем в нашу корзину ‘mybucket’ ранее созданный файл ‘myfavoritefile’:

File.open('myfavoritefile', 'rb') do |file|
    s3.put_object(bucket: 'mybucket', key: 'myfavoritefile', body: file)
end

И наконец, собираем содержимое корзины ‘mybucket’ и отображаем его в стандартном выводе:

resp = s3.list_objects_v2(bucket: “mybucket”)
puts resp.contents.map(&:key)
Поделиться с друзьями
-->

Комментарии (12)


  1. Mobyman
    20.12.2016 21:40
    +1

    Ни слова о Ceph. Почему?


    1. Shaz
      20.12.2016 23:25
      +1

      А Ceph умеет эмулировать API S3?


      1. farcaller
        21.12.2016 00:29
        +1

        1. Shaz
          21.12.2016 11:52
          +1

          Ну там тоже не полная поддержка. А как я понял из текста — основная задача была подобрать решение не требующее сложной инсталляции и настройки, так как предполагается лишь ознакомление студентов с API S3 (без смс и регистрации).


          1. farcaller
            21.12.2016 13:42

            да, но ceph – это, скорее всего, самое production решение из всех предложенных (не считая, собственно, aws). Странно что он даже не упомянут.


            1. mynameisdaniil
              22.12.2016 18:55

              Ну здрасте, а как же риак?


              1. farcaller
                22.12.2016 19:11

                Так он тоже не упомянут...


  1. RPG18
    20.12.2016 23:44
    +4

    1. zelenin
      21.12.2016 06:46

      лучшее решение, чем описанное в статье


      1. VlastV
        22.12.2016 10:10

        однако тоже без поддержки всех возможностей S3. В частности нельзя загрузить файл и сделать его публичным за одну операцию, то как это идет в офф клиентах S3


        1. RPG18
          22.12.2016 12:26

          Может это офф клиенты не могут работать ни с чем другим, кроме S3?


          1. zelenin
            22.12.2016 16:36

            ну надо отметить, что они и не должны, т.к. остальные мимикрируют под апи S3, а не наоборот.