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-контейнер сервера 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)
Поделиться с друзьями
Mobyman
Ни слова о Ceph. Почему?
Shaz
А Ceph умеет эмулировать API S3?
farcaller
Давно же. http://docs.ceph.com/docs/giant/radosgw/s3/
Shaz
Ну там тоже не полная поддержка. А как я понял из текста — основная задача была подобрать решение не требующее сложной инсталляции и настройки, так как предполагается лишь ознакомление студентов с API S3 (без смс и регистрации).
farcaller
да, но ceph – это, скорее всего, самое production решение из всех предложенных (не считая, собственно, aws). Странно что он даже не упомянут.
mynameisdaniil
Ну здрасте, а как же риак?
farcaller
Так он тоже не упомянут...