Создайте свой сервер AWS S3 с открытым кодом

от автора

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) 

ссылка на оригинал статьи https://habrahabr.ru/post/318086/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *