S3 упрощает хранение данных

Знакомство с облачными технологиями на примере технологии Simple Storage Service от компании Amazon

S3 (Simple Storage Service — служба для простого хранения данных) компании Amazon — это общедоступная услуга, которую разработчики Web-приложений могут использовать для хранения цифровой информации, такой как изображение, видео, музыка и документы. S3 предоставляет API типа RESTful для программирования взаимодействия с этой технологией. В этой статье рассказывается, как использовать библиотеку с открытым исходным кодом JetS3t для облегчения работы с этой «облачной» технологией от Amazon для хранения и получения данных.

Эндрю Гловер, президент компании, Stelligent Incorporated

Эндрю ГловерЭндрю Гловер является президентом компании Stelligent Incorporated , которая помогает другим фирмам решать проблемы качества программного обеспечения. Для этого используются эффективные стратегии тестирования и технологии непрерывной интеграции, которые позволяют коллективам разработчиков постоянно контролировать качество кода, начиная с ранних стадий разработки. Просмотрите блог Энди , там можно найти список его публикаций.



16.02.2012

Введение

Облако (англ. cloud) — это абстрактное понятие для «слабо связанной» группы компьютеров, совместно работающих для выполнения какого-либо задания или сервиса так, как будто это один компьютер. Используемая архитектура тоже абстрактна: каждый «облачный» провайдер может реализовать ее так, как он считает нужным. Родственное понятие — «Программное обеспечение как сервис» (Software as a Service), технология, в которой «облачная» технология используется для предоставления сервисов другим пользователям. «Облачная» модель ПО потенциально может снизить расходы пользователей, потому что им не надо будет покупать программное и аппаратное обеспечение для развертывания приложений — провайдер сервиса уже сделал это.

Рождение нового модного термина

Хотя термин «облачные вычисления» (cloud computing) далеко не нов (Amazon начал предлагать собственные «облачные» решения с 2006 года), оно начало обретать сакральный статус с 2008 года, когда «облачные» технологии от Google и Amazon приобрели большую известность. Технология Google App Engine позволяет пользователям размещать Web-приложения в инфраструктуре Google. Наряду с S3 в число Web-сервисов Amazon входит технология Elastic Cloud Compute (EC2), сервис для Web-вычислений, который облегчает размещение приложений в инфраструктуре Amazon. О намерениях конкурировать с Amazon и Google заявили и другие компании, включая Microsoft® с ее проектом Azure и даже Sun Microsystems (чей проект «облачного» решения ещё не был представлен официально на рынке). IBM® уже объявила, что намерена предоставить разработчикам доступ к некоторым своим продуктам в среде Amazon EC2.

В качестве примера можно взять предложение S3 компании Amazon. Как подразумевает название, это общедоступный сервис, который позволяет Web-разработчикам хранить цифровые данные (такие как изображения, видео, музыку и документы) для использования в своих приложениях. С точки зрения использования S3 выглядит как компьютер в сети Интернет, на жестком диске которого содержится необходимая для пользователя цифровая информация. На самом деле это несколько компьютеров (распределённых по некоторой географической области), содержащих цифровую информацию (или, возможно, некоторые её фрагменты). Amazon также берет на себя все сложности по выполнению служебных запросов для хранения и получения данных. За это берется совсем небольшая плата — примерно за 15 центов за гигабайт в месяц можно хранить информацию на серверах Amazon и передавать данные с серверов и на серверы Amazon.

Вместо изобретения колеса технология S3 от Amazon предлагает RESTful API, который даёт возможность общаться с S3 на любом языке, поддерживающем соединение по HTTP. Проект JetS3t — это Java-библиотека с открытым кодом, которая абстрагируется от особенностей работы с S3 RESTful API, представляя API как обычные методы и классы Java. Чем меньше кода, тем лучше, не правда ли? Также имеет смысл использовать готовые наработки. Как будет показано в этой статье, JetS3t делает работу с S3 и языком Java намного легче и несомненно эффективнее.


Высокоуровневый обзор S3

Логически S3 — это глобальная сеть для хранения данных (storage area network (SAN)), которая напоминает очень большой жёсткий диск, где можно хранить и запрашивать данные. С технической точки зрения архитектура Amazon выглядит немного иначе. Данные (asset), хранимые и получаемые через S3, называются объектами. Объекты хранятся в областях памяти (bucket). Это можно проиллюстрировать на примере аналогии с жёстким диском: объекты — это файлы, а области памяти — это папки (или каталоги). Как и на жёстком диске, объекты и области памяти можно находить с помощью унифицированного идентификатора ресурсов (URI).

К примеру, на жёстком диске моего компьютера имеется файл whitepaper.pdf, который находится в папке documents в домашнем каталоге пользователя. Соответственно URI-адрес для этого pdf-файла выглядит как /home/aglover/documents/whitepaper.pdf. В случае S3 URI будет немного другой. Во-первых, области памяти могут находиться только на верхнем уровне — их нельзя вкладывать друг в друга, как это делается с папками на жёстком диске. Во-вторых, имена областей памяти должны соответствовать правилам именования в Интернете; они не могут включать в себя дефисы, следующие за точками, имена не должны включать в себя подчёркивание и т.д. И, наконец, поскольку имена областей памяти становятся частью публичных URI-адресов внутри домена Amazon (s3.amazonaws.com), эти имена должны быть уникальными во всём пространстве S3. (Хорошая новость заключается в том, что на одной учетной записи можно иметь не более ста областей памяти, поэтому сомнительно, что все хорошие имена будут заняты.)

Магия DNS

Не стоит особенно беспокоиться об URL при работе с наборами данных в S3. С помощью магии доменной системы имен (DNS) и записей CNAME (сокращение от canonical name) можно отобразить URL, предлагаемый S3, на более подходящий. Таким образом можно по сути скрыть то, что в вашем приложении используется S3!

Области памяти служат корневым URI-адресом в S3. Таким образом, имя области памяти становится частью URI-адреса, ведущего к объекту внутри S3. Например, если я создал область памяти agdocs и объект whitepaper.pdf, то URI-адрес будет выглядеть так: http://agdocs.s3.amazonaws.com/whitepaper.pdf.

S3 также предлагает возможность указывать владельцев и права доступа для областей памяти и объектов, как можно делать с папками и файлами на жёстком диске. Когда вы определяете область памяти или объект в S3, необходимо указать политику управления доступом, которая указывает, кто может получить доступ к наборам данных в S3 и каким способом (например, права на чтение и запись). В соответствии с этими правами можно предоставить доступ к объектам различными способами; использование RESTful API — только один из них.


Начало работы с S3 и JetS3t

Чтобы начать пользоваться S3, необходимо получить учетную запись. S3 не бесплатна, поэтому, создавая учетную запись, нужно указать Amazon способ оплаты (например, номер кредитной карточки). Начальная настройка бесплатна — вы платите только за использование. Плата за примеры в этой статье составила бы меньше 1 доллара.

В ходе процесса создания учетной записи необходимо будет создать определенную идентификационную информацию: открытый ключ и секретный ключ (как имя пользователя и пароль). (Также можно получить сертификаты x.509; однако они будут нужны только в том случае, если используется SOAP-API Amazon). Как и для любой авторизационной информации, предполагается, что секретный ключ будет держаться ... в секрете. Стоит кому-то другому узнать информацию доступа в S3 и воспользоваться учетной записью, со счёта будут сняты деньги. Соответственно все объекты и области памяти создаются как частные; публичный доступ к информации необходимо предоставлять специально.

После получения открытого и секретного ключей можно загрузить JetS3t и использовать его для взаимодействия с S3 через RESTful API.

С программной точки зрения вход в S3 через JetS3t — это двухэтапный процесс. Необходимо сначала создать объект AWSCredentials, а затем передать его в объект S3Service. Объект AWSCredentials достаточно прост. Он принимает открытый и секретный ключи как строки (объекты типа String). Объект S3Service на самом деле является реализацией интерфейса. Поскольку S3 предлагает API типа RESTful и SOAP, библиотека JetS3t предлагает два типа реализаций: RestS3Service и SoapS3Service. Для целей, предложенных в этой статье (и почти во всех случаях использования S3), простота RESTful API делает его предпочтительным вариантом.

Создание объекта класса RestS3Service и подключение выполняются достаточно просто, как показано в листинге 1:

Листинг 1. Создание объекта класса RestS3Service из библиотеки JetS3t
def awsAccessKey = "blahblah"
def awsSecretKey = "blah-blah"
def awsCredentials = new AWSCredentials(awsAccessKey, awsSecretKey)

def s3Service = new RestS3Service(awsCredentials)

Теперь уже можно делать интересные вещи: например, создать область памяти, добавить к ней видео и затем получить специальный URL-адрес с ограничением по времени доступа. Кстати, звучит как бизнес процесс, верно? Это и есть бизнес процесс, связанный с публикацией данных с ограничением по доступу, таких как видео.

Создание области памяти

Для моего воображаемого видеобизнеса я создам область памяти с именем bc50i. В JetS3t это делается очень просто. Есть несколько вариантов сделать это с использованием объекта типа S3Service. В данном случае я решил воспользоваться вызовом getOrCreateBucket, как показано в листинге 2. Как понятно по имени метода, при его вызове возвращается объект области памяти (представленный в виде типа S3Bucket) или создаётся новая область памяти в S3.

Листинг 2. Создание области памяти на сервере S3
def bucket = s3Service.getOrCreateBucket("bc50i")

Пусть простой код этого примера не вводит в заблуждение. Библиотека JetS3t имеет достаточно много возможностей. Например, можно быстро определить, сколько всего есть областей памяти, просто «спросив» S3Service с помощью вызова метода listAllBuckets. Этот метод возвращает массив объектов S3Bucket. Для любой области памяти можно узнать имя и дату создания. Что более важно, можно контролировать доступ к областям памяти через объект JetS3t —AccessControlList. Например, можно взять объект области памяти bc50i и сделать его свободно доступным всем для чтения или записи, как показано в листинге 3:

Листинг 3. Изменение списка управления доступом для области памяти
def bucket.acl = AccessControlList.REST_CANNED_PUBLIC_READ_WRITE

Разумеется, через API можно также свободно удалять области памяти. Amazon даже позволяет указывать, в каких географических районах хотелось бы создать область памяти. Amazon берет на себя всю работу по размещению данных, но можно «подсказать» Amazon поместить область памяти (и все объекты внутри неё) в США или Европе (на данный момент доступны только эти варианты).

Добавление объектов в область памяти

Создавать объекты S3 с помощью API JetS3t так же легко, как и работать с областями памяти. Библиотека также достаточно умна, чтобы разобраться в проблемах, возникающих при работе с файлами с различными типами содержимого внутри области памяти S3. К примеру, пусть видео, которое я хочу загрузить в S3, чтобы пользователи смогли просматривать его какое-то ограниченное время, находится в файле nerfwars2.mp4. Можно создать объект S3 так же легко, как и простой объект java.io.File , и ассоциировать этот объект типа S3Object с областью памяти, как сделано в листинге 4:

Листинг 4. Создание объекта S3
def s3obj = new S3Object(bucket, new File("/path/to/nerfwars2.mp4"))

Когда объект S3Object , связанный с файлом и областью памяти, создан, всё, что нужно сделать — это загрузить его в S3 с помощью метода putObject, как показано в листинге 5:

Листинг 5. Загрузка видео
s3Service.putObject(bucket, s3obj)

После кода в листинге 5 можно сказать, что всё уже сделано. Видео теперь находится на серверах Amazon, и ключ для доступа к видео - это его имя. Конечно, можно переопределить это имя, если есть необходимость назвать объект как-то по другому. На самом деле JetS3t API (как и Amazon S3 RESTful API) позволяет при создании объектов получить несколько больше информации. Также для загружаемого объекта можно задать список управления доступом. Любой объект внутри S3 может содержать метаинформацию, которую можно создавать через API. Впоследствии метаинформацию любого объекта в S3 можно запрашивать через API (то есть через JetS3t).


Создание URL на объекты

На данный момент в S3 имеется область памяти, где находится файл с видео. Файл может быть найден по URI-адресу http://bc50i.s3.amazonaws.com/nerfwars2.mp4. Пока никто, кроме автора, не может получить к нему доступ. (И даже владелец может получить видео лишь программно через API, потому что все настройки доступа по умолчанию заданы так, чтобы запретить доступ всем, у кого нет аутентифицирующей информации). Наша цель — предоставить избранным пользователям возможность просмотра видео (в течение ограниченного времени), пока мы не решим сменить режим доступа на платный (что S3 также может обеспечить).

На рисунке 1 показано, как работает управление доступом по умолчанию. Возвращённый XML-документ (показанный соответственно в браузере) показывает, что доступ к данным, которые мы пытались запросить, запрещён (http://bc50i.s3.amazonaws.com/nerfwars2.mp4).

Рисунок 1. Система безопасности Amazon в действии
Система безопасности Amazon в действии

Создание общедоступного URL-адреса — это полезная возможность, предоставляемая S3; кстати, в S3 можно создавать открытый URL, действительный только на некоторый период времени (например, 24 часа). В нашем примере для видео, только что сохранённого на сервер S3, будет создан URL-адрес, который будет активен в течение 48 часов. Затем этот URL будет предоставлен определённым пользователям, чтобы они могли скачивать и смотреть видео (доступ будет возможен в течение двух дней).

Чтобы создать ограниченный по времени URL для объекта S3, можно использовать метод createSignedGetUrl в JetS3t, который является статическим методом интерфейса S3Service. На вход он принимает имя области памяти, ключ объекта (в данном случае имя файла с видео), определенную авторизационную информацию (в форме объекта JetS3t AWSCredentials) и дату окончания доступа. Если известны имя области памяти и ключ объекта, можно быстро получить URL, как показано в коде на языке Groovy в листинге 6:

Листинг 6. Создание URL-адреса, ограниченного по времени
def now = new Date()
def url = S3Service.createSignedGetUrl(
   bucket.getName(), s3obj.key, awsCredentials, now + 2)

Синтаксис Groovy позволяет указать время на 48 часов позже текущего момента просто в виде + 2. Конечный URL-адрес выглядит примерно так (в одну строку):

https://bc50i.s3.amazonaws.com/nerfwars2.mp4?AWSAccessKeyId=
   1asd06A5MR2&Expires=1234738280&Signature=rZvk8Gkms%3D

Теперь, если использовать полученный URL-адрес, запрос браузера будет удовлетворён, как показано на рисунке 2:

Рисунок 2. URL-адрес разрешает загрузку данных
URL-адрес разрешает загрузку данных

Всего с помощью нескольких строк кода мы создали в «облачном» хранилище защищённый артефакт данных, который можно скачать только с помощью специального URL-адреса.

Применение S3 для загрузки данных с ограничением по времени

Использование S3 имеет смысл, когда пропускная способность канала и потребность в хранении информации непостоянны. Например, в представленной бизнес модели — когда доступ к видеофайлам открывается только в определенное время несколько раз в году. В традиционной модели хранения необходимо будет где-то купить дисковое пространство (или предоставить собственное аппаратное обеспечение и каналы доступа к нему), и скорее всего вы будете наблюдать всплески активного скачивания, чередующиеся с периодами низкой активности. Однако за ресурсы все равно надо будет платить, независимо от спроса. Модель S3 строится на основе спроса — хранение и канал доставки данных оплачиваются только тогда, когда они востребованы. Более того, возможности системы безопасности S3 позволяют также указывать, когда пользователи могут скачивать видео и даже указывать, кто его может скачивать.

Всех эти задачи решаются в S3 достаточно просто. На самом общем уровне организация системы ограниченного доступа для скачивания видео требует четырёх шагов:

  1. зарегистрироваться в S3;
  2. создать область памяти;
  3. добавить желаемое видео (или объект) в эту область памяти;
  4. создать ограниченный по времени URL-адрес для этого видео.

Вот и всё!


Умный ход

Модель с оплатой за использование (pay-as-you-go) S3 имеет ряд очевидных преимуществ перед другими традиционными моделями хранения. Например, чтобы хранить коллекцию музыки на собственном жёстком диске, необходимо купить его — допустим, 500 ГБ за $130 — авансом. Но пока данных для хранения на 500 ГБ у нас нет, так что в сущности приходится платить по 25 центов за гигабайт за ненужное (хотя и достаточно недорогое) место. Также необходимо обслуживать устройство и платить за питание для него. Если воспользоваться Amazon, то не будет необходимости платить $130 сразу. Можно будет платить примерно на 10 центов меньше за гигабайт и не надо будет платить за сопровождение и обслуживание аппаратного обеспечения для хранения. Теперь представьте те же самые преимущества в масштабе предприятия. Twitter, к примеру, хранит на S3 изображения для учетных записей более чем 1 миллиона пользователей. Платя только за используемые ресурсы, Twitter много экономит за отсутствия потребности в приобретении аппаратного обеспечения для хранения и обслуживания картинок, а также затрат на обслуживание и конфигурирование для обеспечения бесперебойной работы файлового хранилища.

Преимущества «облачных» решений на этом не заканчиваются. Можно также получить меньшую задержку при доступе и более высокую степень готовности. Поскольку данные, которые хранятся в облаке Amazon, физически могут располагаться в разных частях мира, можно быстрее загружать содержимое из разных географических точек. Более того, так как наборы данных распределены по разным компьютерам, данные будут доступны, даже если некоторые системы (или часть сети) выйдут из строя.

В заключение перечислим выгоды от использования Amazon S3: низкая стоимость, высокая готовность и безопасность. Если вы не являетесь экспертом в настройке SAN и не получаете удовольствие от обслуживания аппаратного обеспечения для хранения цифровых данных, Amazon, скорее всего, сделает эту работу лучше вас. Итак, зачем сразу тратить деньги на аппаратное обеспечение (которое теряет в цене со временем), когда можно арендовать чужое?

Ресурсы

Научиться

  • Оригинал статьи Storage made easy with S3 (EN).
  • Amazon S3: домашняя страница технологии S3 от Amazon.
  • JetS3t: дополнительная информация о наборе инструментов и пакете программ JetS3t.
  • Cloud Computing: множество ресурсов по «облачным» технологиям в центре облачных вычислений IBM.

Получить продукты и технологии

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Технология Java
ArticleID=794078
ArticleTitle=S3 упрощает хранение данных
publish-date=02162012