Amazon Simple Storage Service (S3) — это долгосрочное хранилище данных на основе облачной обработки. Этот сервис работает независимо от остальных сервисов, предоставляемых Amazon. Фактически приложения, которые вы разрабатываете для хостинга ваших собственных серверов, могут использовать Amazon S3, без необходимости перемещения в облако иным образом. Когда компания Amazon называет S3 "простым хранилищем" (simple storage), то она имеет в виду набор функций, предоставляемых сервисом, а не простоту использования. Amazon S3 позволяет вам переместить данные в облако и извлечь их обратно. При этом вам нет необходимости знать что-либо о том, как именно и где именно в облаке хранятся ваши данные. Если вы воспринимаете Amazon S3 как удаленную файловую систему, то вы глубоко заблуждаетесь. Amazon S3 во многих отношениях гораздо примитивнее файловой системы. В действительности вы не храните там нечто, называемое "файлами", вы храните там объекты. Более того, объекты (objects) хранятся в "корзинах" (buckets), а не в каталогах (directories), как в файловой системе. Хотя эти различия могут казаться чисто семантическими, вы должны учитывать их, принимая во внимание следующие важные факты:
- объекты, хранимые в S3, не могут иметь размер, превышающий 5 Гбайт;
- "корзины" (Buckets) существуют в плоском пространстве имен, предоставленном в общий доступ всем пользователям Amazon S3. Вы не имеете возможности создавать вложенные корзины и должны быть предельно внимательны к пересечениям в пространстве имен;
- вы можете сделать свои корзины и объекты доступными для публичного просмотра;
- без помощи инструментов от сторонних разработчиков вы не можете "монтировать" (mount) хранилище S3. На самом деле, я не слишком одобрительно отношусь к самой идее "монтирования" S3, как раз из-за столь существенной концептуальной разницы между S3 и файловой системой. Это различие делает неправильной саму мысль о рассмотрении S3 в качестве файловой системы.
Прежде чем получить доступ к S3, вам необходимо создать учетную запись Amazon Web Services. При этом вы можете запросить пространство для хранения данных на серверах, расположенных либо в США, либо в Европе, либо даже в Азиатско-Тихоокеанском регионе (в апреле 2010 года компания Amazon запустила первый регион EC2 в Азиатско-Тихоокеанском регионе (Сингапур)). Когда речь заходит о хранении данных, выбор местоположения серверов — это вопрос не только вашего места жительства. Как будет рассказано далее в этой книге, на решение о месте хранения ваших облачных данных влияют административные вопросы и различные аспекты, касающиеся конфиденциальности информации. В этой главе я рассматриваю вопрос доступа к S3, исходя из предположения, что вы выбрали хранилище, ближайшее к вам.
Amazon предоставляет доступ к S3 как через SOAP API, так и через REST API. Хотя разработчики обычно лучше знакомы с разработкой Web-сервисов с помощью SOAP, REST представляет собой предпочтительный механизм для доступа к S3, вследствие того, что при обработке больших двоичных объектов (Blinary Large Objects, BLOBs) через SOAP API возникают сложности. В частности, SOAP ограничивает размер объекта, которым можно манипулировать в S3, а также ограничивает любую обработку (например, индикатор статуса передачи), которую вам может потребоваться осуществлять над потоками данных по мере того, как они передаются в S3 и обратно.
Интерфейс прикладного программирования Amazon Web Services поддерживает следующие возможности:
- поиск корзин (buckets) и объектов;
- обнаружение их метаданных;
- создание новых корзин;
- загрузка новых объектов;
- удаление существующих корзин и объектов.
При манипулировании вашими корзинами вы при желании можете указать местоположение для хранения содержимого корзины. За исключением случаев, когда вам требуется по-настоящему тонкоструктурированный контроль над взаимодействиями с S3, я рекомендовал бы вам использовать "обертку" API (API wrapper) для вашего предпочитаемого языка программирования, которая будет абстрагировать вас от S3 REST API. Например, мои разработчики программируют на Java с применением Jets3t. Чтобы начать работу с Amazon S3, вам наверняка пригодится клиентское приложение командной строки s3cmd для Amazon S3. Это приложение представляет собой "обертку" с интерфейсом командной строки для доступа к Web-сервисам S3. Данный инструмент написан на Python, а это значит, что вы можете изучить его исходный код — он послужит отличным образцом, иллюстрирующим хороший стиль написания приложений на Python для S3.
Кроме того, Amazon предоставляет доступ к Amazon S3 по протоколу BitTorrent. BitTorrent представляет собой пиринговый (peer-to-peer, P2P) протокол для кооперативного доступа к файлам. Поскольку BitTorrent является стандартным протоколом для совместного доступа к большим двоичным объектам, на рынке предлагается целый ряд клиентов и приложений, предназначенных для потребления и публикации данных с помощью BitTorrent. Если ваше приложение может использовать эту встроенную инфраструктуру, то возможно, имеет смысл воспользоваться преимуществами, предоставляемыми поддержкой протокола BitTorrent со стороны Amazon S3. В общем случае, однако, транзакционные Web-приложения не используют BitTorrent для взаимодействия с S3.
Чтобы проиллюстрировать практическое использование S3, воспользуемся утилитой s3cmd для передачи файлов в хранилище S3 и обратно. Команды, поддерживаемые этой утилитой, отражают функции API Web-сервисов, на которых она основывается. После того как вы скачаете эту утилиту, вам потребуется сконфигурировать ее, указав ваши ключ доступа к S3 и секретный ключ S3. Вне зависимости от того, какой инструментарий вы используете — эту утилиту или какоенибудь другое средство, вам все равно будут нужны эти ключи для доступа к вашим частным корзинам в S3.
Первое, что вам потребуется сделать в S3 — это создать корзину, в которой вы будете хранить объекты. Это делается следующей командой: s3cmd mb s3://BUCKET
Данная команда создает корзину и присваивает ей указанное вами имя. Как я уже заметил ранее в этой главе, пространство имен для вашей корзины доступно всем клиентам Amazon. Если только вы не являетесь первым читателем этой книги, крайне маловероятно, что только что приведенная команда будет выполнена успешно. Чтобы команда выполнилась успешно, вам необходимо заменить имя BUCKET на любое другое, уникальное для вас. Многие пользователи с тем, чтобы сделать имена корзин уникальными для себя, примерно так, как это делается для доменных имен, предваряют имена корзин префиксами. Тем не менее, имейте в виду, что какой бы стандарт именования вы ни приняли, ничто не может помешать другим пользователям нарушать ваше соглашение об именовании.
Я уже несколько раз предупреждал вас о ситуациях с пространством имен корзин. Возможно, к этому моменту вы уже серьезно задумались о том, как же следует работать в условиях таких ограничений, касающихся именования.
В первую очередь, вам следует иметь в виду следующие правила именования.
- Имена могут состоять только из строчных букв (символов в нижнем регистре клавиатуры), цифр, точек, символов подчеркивания и дефисов. Начальным символом имени должна быть буква или цифра.
- Имя не должно составляться в стиле IP-адреса (иными словами, не допускаются имена наподобие 10.0.0.1).
- Длина имени должна составлять не менее 3 и не более 255 символов.
Возможно, вам захочется называть свои корзины таким образом, чтобы они образовали ваше собственное виртуальное пространство имен корзин. Например, мне вполне подойдет такое имя, как com.imaginary.mybucketis, потому что мне принадлежит домен imaginary.com. Важно отметить, что ничто не гарантирует вам того, что никакой другой пользователь не станет использовать ваш домен (или любое другое придуманное вами соглашение об именовании) в качестве префикса имен своих корзин. Поэтому ваши приложения должны использовать достаточно интеллектуальный подход к созданию новых корзин и не должны быть привязаны к конкретной схеме именования.
Amazon предлагает следующие правила именования корзин, которые позволят вам создавать действительные и корректные URL для ваших объектов S3.
После того как корзина будет создана, ее можно начинать заполнять объектами:
s3cmd put LOCAL_FILE s3://BUCKET/S3FILE
Например:
s3cmd put home_movie.mp4 s3://com.imaginary.movies/home_movie.mp4
Утилита s3cmd ограничивает размеры ваших файлов до 5 Гбайт, что является следствием ранее упомянутого ограничения S3. Далее в этой книге мы обсудим стратегии обхода этого ограничения, методы обеспечения более высокого уровня безопасности, а также контроля целостности ваших объектов S3.
Когда объект вам потребуется, вы можете извлечь его из облака:
s3cmd get s3://BUCKET/S3FILE LOCAL_FILE
Например:
s3cmd get s3://com.imaginary.movies/home_movie.mp4 home_movies3.mp4
В приведенном примере файл с вашим домашним видео извлечен обратно на ваш настольный компьютер. Приведу еще несколько популярных команд, которые вы можете использовать.
Удалить корзину можно только в том случае, если она пуста. Прежде чем удалить корзину, вы должны пошагово, один за другим удалить из нее все объекты. Скоро в составе утилиты s3cmd появится опция --recursive, предназначенная для использования с командой del, но вы должны иметь в виду, что она всего лишь будет перечислять содержимое корзины и удалять объекты один за другим. Если вы используете API Web-сервисов, вам потребуется написать собственную подпрограмму рекурсивного удаления корзины, которая содержит объекты.
Amazon предлагает следующие правила именования корзин, которые позволят вам создавать действительные и корректные URL для ваших объектов S3.
- Не следует создавать имена корзин, в состав которых входят символы подчеркивания (несмотря на то, что официально это разрешено).
- В идеальном варианте лучше всего ограничить длину имени 63 символами.
- Не следует создавать имена корзин, завершающиеся дефисом, а также следует избегать ситуаций, когда в составе имени за дефисом следует точка.
После того как корзина будет создана, ее можно начинать заполнять объектами:
s3cmd put LOCAL_FILE s3://BUCKET/S3FILE
Например:
s3cmd put home_movie.mp4 s3://com.imaginary.movies/home_movie.mp4
Утилита s3cmd ограничивает размеры ваших файлов до 5 Гбайт, что является следствием ранее упомянутого ограничения S3. Далее в этой книге мы обсудим стратегии обхода этого ограничения, методы обеспечения более высокого уровня безопасности, а также контроля целостности ваших объектов S3.
Когда объект вам потребуется, вы можете извлечь его из облака:
s3cmd get s3://BUCKET/S3FILE LOCAL_FILE
Например:
s3cmd get s3://com.imaginary.movies/home_movie.mp4 home_movies3.mp4
В приведенном примере файл с вашим домашним видео извлечен обратно на ваш настольный компьютер. Приведу еще несколько популярных команд, которые вы можете использовать.
- Вывод списка всех ваших корзин: s3cmd ls
- Вывод списка содержимого конкретной корзины: s3cmd ls s3://BUCKET
- Удаление объекта из корзины: s3cmd del s3://BUCKET/S3FILE
- Удаление корзины: s3cmd rb s3://BUCKET
Удалить корзину можно только в том случае, если она пуста. Прежде чем удалить корзину, вы должны пошагово, один за другим удалить из нее все объекты. Скоро в составе утилиты s3cmd появится опция --recursive, предназначенная для использования с командой del, но вы должны иметь в виду, что она всего лишь будет перечислять содержимое корзины и удалять объекты один за другим. Если вы используете API Web-сервисов, вам потребуется написать собственную подпрограмму рекурсивного удаления корзины, которая содержит объекты.