Blob Storage в Azure — это сервис, позволяющий хранить неструктурированные данные в облаке, обеспечивая простой доступ к ним из любого ресурса Azure — VM, Wep App и т.д. Кроме того — к любому ресурсу (блобу) в хранилище можно получить доступ по HTTP/HTTPS, используя Access keys.
Структура хралилища состоит из трех основных компонентов:
- Storage Account: доступ к хранилищу осуществляется с помощью Azure Storage Account, который можно создать через Azure Portal, Azure CLI или Azure SDK.
- Container: контейнер группирует несколько блобов. Каждый объект должен заключаться в контейнер. Каждый аккаунт может иметь неограниченное количество контейнеров, и каждый контейнер может хранить нетограниченное количество объектов.
- Blob: файл любого типа и размера. Azure Blob предлагает три типа блобов: block blob, append blob и page blob:
- block blob: лучший выбор для хранения двоичных и текстовых файлов.
- append blob: схож с block blob, но оптимизирован для добавления (append) данных и будет идеальным для, например, логгиррования. Один block blob или append blob может сордержать до 50.000 блоков размером до 4МБ, что в сумме позволяет разместить до 195GB данных.
- page blob: может иметь размер до 1ТБ, и больше подходит для частых операций read/write. Виртуальные машины Azure используют именно этот тип данных для хранения OS и данных на дисках.
Подробнее о типах можно почитать тут>>>.
Содержание
Правила имен в хранилищах
Вы сможете получить доступ к хранилищу с помощью URL примерно такого вида:
http://<storage-account-name>.blob.core.windows.net/<container-name>/<blob-name>
Правила имен контейнеров
- все имена должны быть записаны в нижнем регистре;
- имена контейнеров должны с буквы или цифры и могут содержать только буквы, цифры и тире;
- при использовании тире — сразу за ним должна следовать буква или цифра;
- длина имени должна быть от 3 до 63 символов.
Правила имен блобов
- имена блобов могут состоять из любой комбинации символов;
- минимальная длина имени — 1 символ, максимальная — 1024;
- имена регистрозависимы;
- общая количество сегментов пути, включая имя блоба, должна быть не более 254. Сегмент пути — это строка между последовательностью разделителей, например обратный слеш, соответсвующих виртуальной директории.
Создание Blob аккаунта
Перед тем, как создавать аккаунт — необходимо выбрать его тип.
Azure предлагает несколько типов, которые различаются типом репликации — LRS, ZRS, GRS, RAGRS, PLRS. Подробнее можно почитать тут>>>, а мы используем тип по умолчанию — RAGRS.
Кроме того — важно обращать внимание на локацию, в которой создается хранилище: на его основе будет выбрана вторичная локация, в которую будет выполняться репликация.
Из Azure Portal
Из Azure Portal можно создать аккаунт, перейдя в New > Data + Storage > Storage account:
Создаем аккаунт:
C помощью Azure CLI
Логинимся:
$ azure login -u [email protected] -p p@ssw0rd info: Executing command login /info: Added subscription Подписка с оплатой по мере использования info: Setting subscription "Подписка с оплатой по мере использования" as default + info: login command OK
Находим нужную подписку и переключаемся на нее:
$ azure account list info: Executing command account list data: Name Id Current State data: ---------------------------------------- ------------------------------------ ------- ------- data: Free Trial 97214f99-1f75-4602-91ee-715556cd5906 false Enabled data: Pay-As-You-Go 0a4f2b9c-b34a-4521-ae89-40b17ef8c3ab false Enabled data: Подписка с оплатой по мере использования cc688715-8543-4672-b6ad-fd47602f34fc true Enabled
$ azure account set 97214f99-1f75-4602-91ee-715556cd5906 info: Executing command account set info: Setting subscription to "Free Trial" with id "97214f99-1f75-4602-91ee-715556cd5906". info: Changes saved info: account set command OK
Примечание: Люблю Azure. Подписка 97214f99-*, которая в CLI отображается как «Free Trial» — на самом деле Pay-As-You-Go. Почему так отображается — непонятно.
Выбираем локацию:
$ azure location list info: Executing command location list warn: The "location list" commands is changed to list subscription's locations. For old information, use "provider list or show" commands. info: Getting locations... data: Name Display Name Latitude Longitude data: ------------------ ------------------- -------- --------- data: eastasia East Asia 22.267 114.188 data: southeastasia Southeast Asia 1.283 103.833 data: centralus Central US 41.5908 -93.6208 data: eastus East US 37.3719 -79.8164 data: eastus2 East US 2 36.6681 -78.3889 data: westus West US 37.783 -122.417 data: northcentralus North Central US 41.8819 -87.6278 data: southcentralus South Central US 29.4167 -98.5 data: northeurope North Europe 53.3478 -6.2597 data: westeurope West Europe 52.3667 4.9 data: japanwest Japan West 34.6939 135.5022 data: japaneast Japan East 35.68 139.77 data: brazilsouth Brazil South -23.55 -46.633 data: australiaeast Australia East -33.86 151.2094 data: australiasoutheast Australia Southeast -37.8136 144.9631 data: southindia South India 12.9822 80.1636 data: centralindia Central India 18.5822 73.9197 data: westindia West India 19.088 72.868 info: location list command OK
Создаем группу ресурсов:
$ azure group create -n D2 -l westeurope info: Executing command group create + Getting resource group D2 + Creating resource group D2 info: Created resource group D2 data: Id: /subscriptions/97214f99-1f75-4602-91ee-715556cd5906/resourceGroups/D2 data: Name: D2 data: Location: westeurope data: Provisioning State: Succeeded data: Tags: null data: info: group create command OK
Проверяем:
$ azure group list info: Executing command group list + Listing resource groups data: Name Location Provisioning State Tags: data: ---- ---------- ------------------ ----- data: D2 westeurope Succeeded null info: group list command OK
Создаем аккаунт хранилища:
$ azure storage account create rtfmexample1 -l westeurope --type RAGRS -g D2 info: Executing command storage account create + Creating storage account info: storage account create command OK
Для дальнейшей работы — потребуется Access key:
$ azure storage account keys list rtfmexample1 -g D2 info: Executing command storage account keys list + Getting storage account keys data: Primary: vXL***3cA== data: Secondary: naz***M3A==
Либо так:
$ azure storage account connectionstring show rtfmexample1 -g D2 info: Executing command storage account connectionstring show + Getting storage account keys data: connectionstring: DefaultEndpointsProtocol=https;AccountName=rtfmexample1;AccountKey=vXLjfFDo8NppXNH//axC***3cA==
Ключи генерируются автоматически при создании аккаунта. Вторичный ключ создается для того, что бы пользователь имел возможность обновить их, не прерывая работу приложений. Подробнее — тут>>>.
Теперь, используя ключ или строку подключения — можно задать одну из двух переменных окружения.
При использовании Access key:
export AZURE_STORAGE_ACCESS_KEY=<key>
При использовании Connection string:
export AZURE_STORAGE_CONNECTION_STRING=<connection_string>
А в переменной AZURE_STORAGE_ACCOUNT
можно указать имя аккаунта, что бы не указывать его каждый раз вручную.
Выполняем:
$ export AZURE_STORAGE_ACCOUNT=rtfmexample1 $ export AZURE_STORAGE_ACCESS_KEY=vXL***3cA==
Создание контейнеров и блобов
Добавляем контейнер, в котором будем хранить объекты:
$ azure storage container create rtfmcont info: Executing command storage container create + Creating storage container rtfmcont + Getting Storage container information data: { data: name: 'rtfmcont', data: metadata: {}, data: etag: '"0x8D35955E32230A1"', data: lastModified: 'Thu, 31 Mar 2016 11:16:20 GMT', data: leaseStatus: 'unlocked', data: leaseState: 'available', data: requestId: 'ac96652e-0001-008a-283e-8bd1b6000000', data: publicAccessLevel: 'Off' data: }
Проверяем:
$ azure storage container list info: Executing command storage container list + Getting storage containers data: Name Public-Access Last-Modified data: -------- ------------- ----------------------------- data: rtfmcont Off Thu, 31 Mar 2016 11:16:20 GMT
Доступ к объектам определяется политикой контейнера, в котором они хранятся. Доступ может быть описан параметрами Off
, Blob
и Container
.
По умолчанию новые контейнеры создаются с параметром Off
. Для того, что бы открыть доступ только на чтение объектов, но без доступа к метаданным контейнера и без возможности просматривать список всех объектов — установите параметр Blob
. Для того, что бы открыть доступ на чтение, к метаданным контейнера и списку всех объектов в нем — используйте Container
.
Подробнее — смотрите тут>>>.
Открываем общий доступ:
$ azure storage container set --container rtfmcont -p Blob info: Executing command storage container set + Set container + Getting Storage container information data: { data: name: 'rtfmcont', data: metadata: {}, data: etag: '"0x8D359571D803F1F"', data: lastModified: 'Thu, 31 Mar 2016 11:25:08 GMT', data: leaseStatus: 'unlocked', data: leaseState: 'available', data: requestId: 'ca7032d0-0001-0057-2d3f-8b8218000000', data: publicAccessLevel: 'Blob' data: }
Проверяем:
$ azure storage container list rtfmcont info: Executing command storage container list + Getting storage containers data: Name Public-Access Last-Modified data: -------- ------------- ----------------------------- data: rtfmcont Blob Thu, 31 Mar 2016 11:25:08 GMT
Загрузим файл в контейнер:
$ azure storage blob upload '/home/setevoy/Downloads/README.md' rtfmcont info: Executing command storage blob upload + Checking blob README.md in container rtfmcont + Uploading /home/setevoy/Downloads/README.md to blob README.md in container rtfmcont Percentage: 100.0% (8.27KB/8.27KB) Average Speed: 2.07KB/S Elapsed Time: 00:00:04 + Getting Storage blob information data: Property Value data: ------------- ------------------------ data: container rtfmcont data: blob README.md data: blobType BlockBlob data: contentLength 8471 data: contentType text/x-markdown data: contentMD5 WRxp7ZCBa8LEULh7fCLS0w==
Использование ~
в документации есть, но на деле у меня приводит к ошибке:
$ azure storage blob upload '~/Downloads/README.md' rtfmcont info: Executing command storage blob upload error: Local file ~/Downloads/README.md doesn't exist info: Error information has been recorded to /home/setevoy/.azure/azure.err error: storage blob upload command failed
Проверяем:
$ curl http://rtfmexample1.blob.core.windows.net/rtfmcont/README.md
Можно загрузить объект из контейнера на локальную машину с помощью azure storage blob download
:
$ azure storage blob download --container rtfmcont -b README.md -d '/tmp/README.md' info: Executing command storage blob download + Download blob README.md in container rtfmcont to /tmp/README.md Percentage: 0% (0B/0B) Average Speed: 0B/S Elapsed Time: 00:00:03 + Getting Storage blob information info: File saved as /tmp/README.md
А удалить объект — с помощью azure storage blob delete
:
$ azure storage blob delete --container rtfmcont -b README.md info: Executing command storage blob delete + Deleting Blob README.md in container rtfmcont info: Blob README.md deleted successfully info: storage blob delete command OK
Проверяем:
$ curl http://rtfmexample1.blob.core.windows.net/rtfmcont/README.md <?xml version="1.0" encoding="utf-8"?><Error><Code>BlobNotFound</Code><Message>The specified blob does not exist. RequestId:cc196af2-0001-0091-0441-8bff24000000 Time:2016-03-31T11:37:29.1303244Z</Message></Error>
Ссылки по теме:
Introduction to Microsoft Azure Storage
Azure Blob Storage Part 1: Introduction
Using the Azure CLI with Azure Storage
Azure Storage SDK for Python
Stupid Azure Trick #4 – C#, Node.js, and Python side-by-side