Управление контейнерами BLOB-объектов с помощью Azure

В Хранилище BLOB-объектов Microsoft Azure могут быть размещены большие объемы неструктурированных данных объектов. С помощью Хранилища BLOB-объектов можно собирать данные мультимедиа, содержимое и данные приложений и предоставлять все эти данные пользователям. Так как все данные BLOB-объектов хранятся в контейнерах, перед началом отправки данных необходимо создать контейнер хранилища. Дополнительные сведения о Хранилище BLOB-объектов см. в статье Общие сведения о хранилище BLOB-объектов Azure.

Azure CLI — это кроссплатформенный интерфейс командной строки в Azure для управления ресурсами Azure. Вы можете использовать его в браузере с Azure Cloud Shell. Его также можно установить в macOS, Linux или Windows и запускать локально из командной строки.

В этой статье описывается, как использовать Azure CLI с Bash для работы с объектами контейнеров.

Необходимые компоненты

Для доступа к службе хранилища Azure требуется подписка Azure. Если у вас еще нет подписки, создайте бесплатную учетную запись Azure, прежде чем начинать работу.

Доступ к хранилищу Azure осуществляется с помощью учетной записи хранения. Для работы с этим руководством создайте учетную запись хранения с помощью портала Azure, Azure PowerShell или Azure CLI. Инструкции по созданию учетной записи хранения см. в статье Создайте учетную запись хранения.

Подготовка среды к работе с Azure CLI

  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.

  • Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.

    • Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

  • Оптимально, если у вас установлена последняя версия Azure CLI. Если вы используете Azure Cloud Shell, последняя версия уже установлена.

Авторизация доступа к хранилищу BLOB-объектов

Вы можете авторизовать доступ к хранилищу BLOB-объектов из Azure CLI с помощью учетных данных Microsoft Entra или с помощью ключа доступа к учетной записи хранения. Использование учетных данных Microsoft Entra рекомендуется, и в примерах этой статьи используется исключительно идентификатор Microsoft Entra ID.

Команды Azure CLI для операций с данными в хранилище BLOB-объектов поддерживают параметр --auth-mode, что позволяет указать, как авторизовать определенную операцию. --auth-mode Задайте параметр для login авторизации с помощью учетных данных Microsoft Entra. Дополнительные сведения см. в статье Авторизация доступа к данным BLOB-объектов или очередей с помощью Azure CLI.

Выполните команду login, чтобы открыть браузер и подключиться к своей подписке Azure.

az login

Создание контейнера

Чтобы создать контейнер с помощью Azure CLI, выполните команду az storage container create. В следующем примере приведены три варианта для создания контейнеров BLOB-объектов с помощью команды az storage container create. В первом варианте создается один контейнер, а двух других создание контейнера автоматизируется с помощью операций скриптов Bash.

Для этого примера нужно указать значения переменных и выполнить вход в систему. Не забудьте заменить значения заполнителей в скобках собственными значениями.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container-1"
containerPrefix="demo-container-"

# Approach 1: Create a container
az storage container create \
    --name $containerName \
    --account-name $storageAccount \
    --auth-mode login

# Approach 2: Create containers with a loop
for value in {2..5}
do
    az storage container create \
        --name $containerPrefix$value \
        --account-name $storageAccount \
        --auth-mode login
done

# Approach 3: Create containers by splitting multiple values
containerList="${containerPrefix}6 ${containerPrefix}7 ${containerPrefix}8"
for container in $containerList
do
    az storage container create \
        --name $container \
        --account-name $storageAccount \
        --auth-mode login
done

Перечисление контейнеров

Используйте команду az storage container list, чтобы получить список контейнеров хранилища. Чтобы получить список контейнеров, имена которых начинаются с определенной строки символов, передайте строку в виде значения параметра --prefix.

Параметр --num-results позволяет ограничить число контейнеров, возвращаемых запросом. Служба хранилища Azure ограничивает число контейнеров, возвращаемых одной операцией вывода, значением в 5000. Это ограничение гарантирует, что будет возвращен удобный для обработки объем данных. Если число возвращенных контейнеров превышает значение --num-results или предел обслуживания, возвращается маркер продолжения. Этот маркер позволяет использовать несколько запросов для извлечения любого числа контейнеров.

Вы также можете использовать параметр --query для выполнения запроса аутентификации JMESPath для результатов команды. JMESPath — это язык запросов для JSON, позволяющий выбрать и изменить данные, возвращаемые CLI. Запросы к выходным данным JSON выполняются до того, как они будут отформатированы. Дополнительные сведения см. в статье Запрос выходных данных команды Azure CLI с помощью запроса JMESPath.

В следующем примере сначала приводится максимальное число контейнеров (зависит от ограничения службы). Далее он выводит три контейнера, имена которых начинаются с префикса container-, указывая значения для параметров --num-results и --prefix. Наконец, выводится отдельный контейнер путем указания известного имени контейнера в параметре --prefix.

См. дополнительные сведения о команде az storage container list.

#!/bin/bash
storageAccount="<storage-account>"
containerPrefix="demo-container-"
containerName="demo-container-1"
numResults="3"

# Approach 1: List maximum containers
az storage container list \
    --account-name $storageAccount \
    --auth-mode login

# Approach 2: List a defined number of named containers
az storage container list \
    --prefix $containerPrefix \
    --num-results $numResults \
    --account-name $storageAccount \
    --auth-mode login

# Approach 3: List an individual container
az storage container list \
    --prefix $containerPrefix \
    --query "[?name=='$containerName']" \
    --account-name $storageAccount \
    --auth-mode login

Чтение свойств и метаданных контейнера

Контейнер содержит как системные свойства, так и пользовательские метаданные. Системные свойства есть у каждого ресурса Хранилища BLOB-объектов. Некоторые свойства доступны только для чтения, а другие можно прочитать и записать. На самом деле, некоторые системные свойства соответствуют определенным стандартным заголовкам HTTP.

Определяемые пользователем метаданные состоят из одной или нескольких пар "имя-значение", которые можно указать для ресурса Хранилища BLOB-объектов. Вы можете использовать метаданные для хранения дополнительных значений с помощью ресурса хранилища. Значения метаданных предназначены только для ваших собственных целей и не влияют на поведение ресурса.

Свойства контейнера

Чтобы отобразить свойства контейнера с помощью Azure CLI, выполните команду az storage container show.

В следующем примере первый вариант отображает свойства отдельного именованного контейнера. Затем он получает все контейнеры с префиксом demo-container- и выполняет перебор контейнеров с получением их свойств. Не забудьте заменить значения заполнителей собственными значениями.

#!/bin/bash
storageAccount="<storage-account>"
containerPrefix="demo-container-"
containerName="demo-container-1"

# Show a named container's properties
az storage container show \
    --name $containerName \
    --account-name $storageAccount \
    --auth-mode login

# List several containers and show their properties
containerList=$(az storage container list \
    --query "[].name" \
    --prefix $containerPrefix \
    --account-name $storageAccount \
    --auth-mode login \
    --output tsv)

for row in $containerList
do
  tmpRow=$(echo $row | sed -e 's/\r//g')
  az storage container show --name $tmpRow --account-name $storageAccount --auth-mode login
done

Чтение и запись метаданных контейнера

Пользователи, в учетных записях хранения которых содержится несколько тысяч объектов, могут быстро найти нужные контейнеры по их метаданным. Чтобы считать метаданные, используйте команду az storage container metadata show. Чтобы обновить метаданные, необходимо выполнить команду az storage container metadata update. Этот метод применяет только разделенные пробелами пары "ключ-значение". Дополнительные сведения см. в документации по az storage container metadata.

В первом примере ниже выполняется обновление и получение метаданных именованного контейнера. Во втором примере выполняется итерация списка контейнеров, соответствующих значению -prefix. Контейнеры с именами, содержащими четные числа, включают метаданные, заданные с помощью значений в переменной metadata.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container-1"
containerPrefix="demo-container-"

# Create metadata string
metadata="key=value pie=delicious"

# Update named container metadata
az storage container metadata update \
    --name $containerName \
    --metadata $metadata \
    --account-name $storageAccount \
    --auth-mode login

# Display metadata
az storage container metadata show \
    --name $containerName \
    --account-name $storageAccount \
    --auth-mode login

# Get list of containers
containerList=$(az storage container list \
    --query "[].name" \
    --prefix $containerPrefix \
    --account-name $storageAccount \
    --auth-mode login \
    --output tsv)

# Update and display metadata
for row in $containerList
do
  #Get the container's number
  tmpName=$(echo $row | sed -e 's/\r//g')
  if [ `expr ${tmpName: ${#containerPrefix}} % 2` == 0 ]
  then
    az storage container metadata update \
        --name $tmpName \
        --metadata $metadata \
        --account-name $storageAccount \
        --auth-mode login
    
    echo $tmpName

    az storage container metadata show \
    --name $tmpName \
    --account-name $storageAccount \
    --auth-mode login    
  fi
done

Удаление контейнеров

В зависимости от вашего варианта использования вы можете удалить отдельный контейнер или группу контейнеров с помощью команды az storage container delete. При удалении списка контейнеров вам потребуется использовать условные операции, как показано в примере ниже.

Предупреждение

Выполнение приведенных ниже примеров может привести к необратимому удалению контейнеров и BLOB-объектов. Мы рекомендуем включить обратимое удаление для контейнеров, чтобы защитить их и BLOB-объекты от случайного удаления. Дополнительные сведения см. в статье Обратимое удаление для контейнеров.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container-1"
containerPrefix="demo-container-"

# Delete a single named container
az storage container delete \
    --name $containerName \
    --account-name $storageAccount \
    --auth-mode login

# Delete containers by iterating a loop
list=$(az storage container list \
    --query "[].name" \
    --prefix $containerPrefix \
    --account-name $storageAccount \
    --auth-mode login \
    --output tsv)
for row in $list
do
    tmpName=$(echo $row | sed -e 's/\r//g')
    az storage container delete \
    --name $tmpName \
    --account-name $storageAccount \
    --auth-mode login
done

Если для вашей учетной записи хранения включено обратимое удаление контейнеров, вы сможете получить удаленные контейнеры. Если в вашей учетной записи хранения включена защита данных с помощью обратимого удаления, то при указании параметра --include-deleted будут возвращены контейнеры, удаленные в течение связанного периода хранения. Параметр --include-deleted можно использовать для получения контейнеров только при использовании с параметром --prefix. Дополнительные сведения об обратимом удалении см. в статье Обратимое удаление для контейнеров.

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

#!/bin/bash
storageAccount="<storage-account>"
containerPrefix="demo-container-"

# Retrieve a list of containers including those recently deleted
az storage container list \
    --prefix $containerPrefix \
    --include-deleted \
    --account-name $storageAccount\
    --auth-mode login

Восстановление обратимо удаленного контейнера

Как уже упоминалось в разделе Перечисление контейнеров, вы можете настроить защиту данных с помощью обратимого удаления в учетной записи хранения. Если такая защита данных включена, то вы сможете восстановить контейнеры, удаленные в течение связанного периода хранения. Прежде чем использовать этот пример, необходимо включить обратимое удаление и настроить его по крайней мере в одной из ваших учетных записей хранения.

В следующих примерах объясняется, как восстановить контейнер, к которому было применено обратимое удаление, с помощью команды az storage container restore. Вам потребуется указать значения для параметров --name и --version, чтобы гарантировать восстановление нужной версии контейнера. Если вы не знаете номер версии, вы можете использовать команду az storage container list, чтобы получить его, как показано в первом примере. Во втором примере выполняется поиск и восстановление всех удаленных контейнеров в конкретной учетной записи хранения.

Дополнительные сведения о защите данных с помощью обратимого удаления см. в статье Обратимое удаление для контейнеров.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container-1"

# Restore an individual named container
containerVersion=$(az storage container list \
    --account-name $storageAccount \
    --query "[?name=='$containerName'].[version]" \
    --auth-mode login \
    --output tsv \
    --include-deleted | sed -e 's/\r//g')

az storage container restore \
    --name $containerName \
    --deleted-version $containerVersion \
    --account-name $storageAccount \
    --auth-mode login

# Restore a list of deleted containers
containerList=$(az storage container list \
    --account-name $storageAccount \
    --include-deleted \
    --auth-mode login \
    --query "[?deleted].{name:name,version:version}" \
    -o json)

for row in $(echo "${containerList}" | jq -c '.[]' )
do
    tmpName=$(echo $row | jq -r '.name')
    tmpVersion=$(echo $row | jq -r '.version')
    az storage container restore \
        --account-name $storageAccount \
        --name $tmpName \
        --deleted-version $tmpVersion \
        --auth-mode login
done

Получение подписанного URL-адреса для контейнера

Подписанный URL-адрес (SAS) предоставляет делегированный доступ к ресурсам Azure. Благодаря SAS вы получаете детальный контроль над тем, как клиент может обращаться к вашим данным. Например, вы можете указать, какие ресурсы будут доступны клиенту. Вы также можете ограничить типы операций, выполняемых клиентом, и указать интервал для срока действия подписанного URL-адреса.

SAS обычно используется для предоставления временного и безопасного доступа клиенту, у которого нет разрешений. Чтобы создать подписанный URL-адрес службы или учетной записи, вам нужно указать значения для параметров --account-name и --account-key. Примером такого сценария может быть служба, которая позволяет пользователям считывать свои данные из вашей учетной записи хранения и записывать данные в эту учетную запись.

Служба хранилища Azure поддерживает три типа подписанных URL-адресов: SAS делегирования пользователя, SAS службы и SAS учетной записи. Дополнительные сведения о подписанных URL-адресах см. в статье Предоставление ограниченного доступа к ресурсам службы хранилища Azure с помощью подписанных URL-адресов (SAS).

Внимание

Любой клиент, обладающий действительным SAS, может получить доступ к данным в вашей учетной записи хранения в соответствии с тем, как это допускается этим SAS. Важно обеспечить для SAS защиту от вредоносного или непреднамеренного использования. Распространять SAS нужно с осторожность и следует подготовить план для отзыва скомпрометированного SAS.

В следующем примере показано, как настроить подписанный URL-адрес службы для определенного контейнера с помощью команды az storage container generate-sas. Так как она создает подписанный URL-адрес службы, пример сначала получает ключ учетной записи хранения для передачи в виде значения --account-key.

В этом примере для SAS будут заданы время начала и окончания срока действия, а также протокол. Также будут заданы разрешения на удаление, чтение, запись и вывод в подписанном URL-адресе с помощью параметра --permissions. Полный список разрешений можно найти в статье Создание SAS службы.

Скопируйте и вставьте значение маркера SAS BLOB-объекта в защищенное расположение. Он будет отображен только один раз, поэтому вы не сможете получить его после закрытия Bash. Чтобы создать URL-адрес SAS, добавьте маркер SAS (URI) к URL-адресу службы хранилища.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container-1"
permissions="drwl"
expiry=`date -u -d "30 minutes" '+%Y-%m-%dT%H:%MZ'`

accountKey=$(az storage account keys list \
    --account-name $storageAccount \
    --query "[?permissions == 'FULL'].[value]" \
    --output tsv)

accountKey=$( echo $accountKey | cut -d' ' -f1 )
 
az storage container generate-sas \
    --name $containerName \
    --https-only \
    --permissions dlrw \
    --expiry $expiry \
    --account-key $accountKey \
    --account-name $storageAccount

Примечание.

Маркер SAS, возвращаемый Azure CLI, не включает символ разделителя ('?') для строки запроса URL-адреса. Если маркер SAS добавляется к URL-адресу ресурса, не забудьте добавить символ разделителя в URL-адрес ресурса перед добавлением маркера SAS.

Следующие шаги

Из этой статьи вы узнали, как управлять контейнерами в хранилище BLOB-объектов. Для получения дополнительных сведений о работе с хранилищем BLOB-объектов с помощью Azure CLI выберите один из разделов ниже.