Azure: Blob storage и Python SDK

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

azure_logoПодготовка

Вводная часть по Azure Blob — в посте Azure: Blob storage.

Логинимся:

$ azure login -u service@domain.onmicrosoft.com -p pass
info:    Executing command login
/info:    Added subscription Pay-As-You-Go                                     
info:    Setting subscription "Pay-As-You-Go" as default
+
info:    login command OK

Выбираем подписку:

$ azure account set 0a4f2b9c-b34a-4521-ae89-40b17ef8c3ab
info:    Executing command account set
info:    Setting subscription to "Pay-As-You-Go" with id "0a4f2b9c-b34a-4521-ae89-40b17ef8c3ab".
info:    Changes saved
info:    account set command OK

Выбираем группу, в которую будем добавлять storage-аккаунт:

$ azure group list
info:    Executing command group list
+ Listing resource groups                                                      
data:    Name       Location    Provisioning State  Tags:
data:    ---------  ----------  ------------------  -----
data:    DNS        westeurope  Succeeded           null 
data:    europe-jm  westeurope  Succeeded           null 

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

$ azure storage account create -l westeurope --type RAGRS -g europe-jm jmblob
info:    Executing command storage account create
+ Creating storage account                                                     
info:    storage account create command OK

Проверяем:

$ azure storage account list
info:    Executing command storage account list
+ Getting storage accounts                                                     
data:    Name    Type            Location    Resource Group
data:    ------  --------------  ----------  --------------
data:    jmblob  Standard_RAGRS  westeurope  europe-jm     
info:    storage account list command OK

Получаем ключи авторизации:

$ azure storage account keys list jmblob -g europe-jm
info:    Executing command storage account keys list
+ Getting storage account keys                                                 
data:    Primary: 38N***dEA==
data:    Secondary: RVE***QTQ==
info:    storage account keys list command OK

Python SDK и blob-ы

Устанавливаем SDK:

$ sudo pip install azure

Создаем подключение:

>>> from azure.storage.blob import BlobService
>>> blob = BlobService(account_name='jmblob', account_key='38N***dEA==')

Создаем контейнер:

>>> blob.create_container('jmtest')
True

Проверяем:

$ azure storage container list
info:    Executing command storage container list
+ Getting storage containers
data:    Name    Public-Access  Last-Modified
data:    ------  -------------  -----------------------------
data:    jmtest  Off            Thu, 31 Mar 2016 13:39:37 GMT
info:    storage container list command OK

По умолчанию — все контейнеры создаются без общего доступа к ним.

Что бы создать контейнер, доступный другим — добавьте public_access при его создании:

>>> blob.create_container('jmtest2', x_ms_blob_public_access='container')
True

Проверяем:

$ azure storage container list
info:    Executing command storage container list
+ Getting storage containers                                                   
data:    Name     Public-Access  Last-Modified                
data:    -------  -------------  -----------------------------
data:    jmtest   Off            Thu, 31 Mar 2016 13:39:37 GMT
data:    jmtest2  Container      Thu, 31 Mar 2016 13:47:43 GMT

Что бы открыть общий доступ к уже созданному контейнеру — используйте set_container_acl:

>>> blob.set_container_acl('jmtest2', x_ms_blob_public_access='blob')
$ azure storage container list
info:    Executing command storage container list
+ Getting storage containers                                                   
data:    Name     Public-Access  Last-Modified                
data:    -------  -------------  -----------------------------
data:    jmtest   Off            Thu, 31 Mar 2016 13:39:37 GMT
data:    jmtest2  Blob           Thu, 31 Mar 2016 13:50:08 GMT

Загрузка данных в контейнер

Для создания объекта и загрузки данных можно использовать методы:

  • put_block_blob_from_path — загружает заданный в пути, но не открытый для чтения файл в хранилище;
  • put_block_blob_from_file — загружает заданный и открытый для чтения в пути файл в хранилище;
  • put_block_blob_from_text — для загрузки Unicode-строк;
  • put_block_blob_from_bytes — для загрузки двоичных данных.

Например — загрузить файл /home/setevoy/Downloads/README.md в контейнер jmtest можно так:

>>> blob.put_block_blob_from_path('jmtest', 'readme.md', '/home/setevoy/Downloads/README.md', max_connections=5)

max_connections позволяет выполнять загрузку или выгрузку данных в несколько потоков.

Проверяем:

$ azure storage blob list jmtest
info:    Executing command storage blob list
+ Getting blobs in container jmtest                                            
data:    Name       BlobType   Length  Content-Type                            Last-Modified                  SnapshotTime
data:    ---------  ---------  ------  --------------------------------------  -----------------------------  ------------
data:    readme.md  BlockBlob  8471    application/octet-stream Charset=UTF-8  Thu, 31 Mar 2016 14:02:11 GMT              

Что бы проверить доступ по URL — окрываем доступ:

>>> blob.set_container_acl('jmtest', x_ms_blob_public_access='blob')

И проверяем:

$ curl -s http://jmblob.blob.core.windows.net/jmtest/readme.md | head
# Microsoft Azure Xplat-CLI for Windows, Mac and Linux

[![NPM version](https://badge.fury.io/js/azure-cli.png)](http://badge.fury.io/js/azure-cli) [![Build Status](https://travis-ci.org/Azure/azure-xplat-cli.png?branch=master)](https://travis-ci.org/Azure/azure-xplat-cli)

This project provides a cross-platform command line interface for developers and IT administrators to develop, deploy and manage Microsoft Azure applications.

## Features

* Accounts Management
* Azure Service Management

А что бы загрузить файл из хранилища на локальную машину — используем get_blob_to_path:

>>> blob.get_blob_to_path('jmtest', 'readme.md', '/tmp/README.md', max_connections=5)

Проверяем:

$ head /tmp/README.md 
# Microsoft Azure Xplat-CLI for Windows, Mac and Linux

[![NPM version](https://badge.fury.io/js/azure-cli.png)](http://badge.fury.io/js/azure-cli) [![Build Status](https://travis-ci.org/Azure/azure-xplat-cli.png?branch=master)](https://travis-ci.org/Azure/azure-xplat-cli)

This project provides a cross-platform command line interface for developers and IT administrators to develop, deploy and manage Microsoft Azure applications.

## Features

* Accounts Management
* Azure Service Management

Получить список всех данных в контейнере можно так:

>>> objs = blob.list_blobs('jmtest')

Объект objs содержит объектыиз указанного контейнера, но не сами данные — а толкьо метаданные и свойства.

Посмотреть — что именно содержится в каждом объекте можно так:

>>> for obj in objs:
...   pprint (vars(obj))
... 
{'metadata': None,
 'name': u'readme.md',
 'properties': <azure.storage.blob.models.BlobProperties object at 0x7f3e5d1bdc90>,
 'snapshot': u'',
 'url': u''}

И получить только имя объекта в контейнере:

>>> objs = blob.list_blobs('jmtest')
>>> for obj in objs:
...   print(obj.name)
... 
readme.md

Ссылки по теме

How to Use the Blob Storage Service from Python

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

How to use Azure Blob storage from Python

Azure Storage SDK for Python