Azure: Blob storage

Автор: | 01/04/2016
 

azure_logoBlob Storage в Azure – это сервис, позволяющий хранить неструктурированные данные в облаке, обеспечивая простой доступ к ним из любого ресурса Azure – VM, Wep App и т.д. Кроме того – к любому ресурсу (блобу) в хранилище можно получить доступ по HTTP/HTTPS, используя Access keys.

Структура хралилища состоит из трех основных компонентов:

blob_struct

  • 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:

azure_blob_1

Создаем аккаунт:

azure_blob_2

azure_blob_3

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

azure_blob_5

Для дальнейшей работы – потребуется 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

About Azure storage accounts

Using the Azure CLI with Azure Storage

Azure Storage replication

Azure Storage SDK for Python

Stupid Azure Trick #4 – C#, Node.js, and Python side-by-side