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

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

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

Для доступа к службе хранилища 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 версии 2.0.46 или более поздней. Если вы используете Azure Cloud Shell, последняя версия уже установлена.

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

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

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

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


az login

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

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


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

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

При использовании примеров в этой статье замените значения в квадратных скобках собственными значениями. Дополнительные сведения о входе в Azure с помощью Azure CLI см. в разделе Вход с помощью Azure CLI.

отправка больших двоичных объектов;

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

Чтобы отправить файл в блочный BLOB-объект, передайте необходимые значения параметров в команду az storage blob upload. Укажите путь источника и имя файла с помощью параметра --file и имя контейнера назначения с помощью параметра --container-name. Также необходимо указать параметр --account-name. Эта команда создает новый большой двоичный объект или перезаписывает исходный большой двоичный объект, если он уже существует.

С помощью команды az storage blob upload-batch можно рекурсивно отправлять несколько больших двоичных объектов в контейнер хранилища. С помощью сопоставления шаблонов имен файлов UNIX можно указать диапазон файлов для передачи вместе с параметром --pattern. Поддерживаются шаблоны *, ?, [seq] и [!seq]. Дополнительные сведения см. в документации Python по сопоставлению шаблонов имен файлов UNIX.

В следующем примере первая операция использует команду az storage blob upload для отправки одного именованного файла. Исходный файл и целевой контейнер хранилища указываются с помощью параметров --file и --container-name.

Вторая операция демонстрирует использование команды az storage blob upload-batch для отправки нескольких файлов. Параметр --if-modified-since гарантирует, что будут отправлены только файлы, измененные за последние семь дней. Значение, предоставленное этим параметром, должно быть указано в формате UTC.


#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
lastModified=`date -d "7 days ago" '+%Y-%m-%dT%H:%MZ'`

path="C:\\temp\\"
filename="demo-file.txt"
imageFiles="*.png"
file="$path$filename"

#Upload a single named file
az storage blob upload \
    --file $file \
    --container-name $containerName \
    --account-name $storageAccount \
    --auth-mode login

#Upload multiple image files recursively
az storage blob upload-batch \
    --destination $containerName \
    --source $path \
    --pattern *.png \
    --account-name $storageAccount \
    --auth-mode login \
    --if-modified-since $lastModified

Список больших двоичных объектов

По умолчанию команда az storage blob list выводит список всех больших двоичных объектов, хранящихся в контейнере. Для определения области поиска можно использовать различные подходы. Ограничений на количество контейнеров и BLOB-объектов, которые может содержать учетная запись хранения, нет. Чтобы избежать извлечения тысяч BLOB-объектов, лучше ограничить объем возвращаемых данных.

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

По умолчанию в операции перечисления возвращаются только большие двоичные объекты. В некоторых сценариях может потребоваться передать значение для параметра --include, чтобы получить дополнительные типы объектов, такие как обратимо удаленные большие двоичные объекты, моментальные снимки и версии. Эти значения можно комбинировать, чтобы получить несколько типов объектов.

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

В следующем примере показано несколько подходов, которые используются для вывода списка BLOB-объектов. При первом подходе выводятся отдельные BLOB-ресурсы в определенном ресурсе контейнера. Второй подход использует параметр --prefix для перечисления всех больших двоичных объектов во всех контейнерах с префиксом louis. За счет параметра --num-results поиск ограничивается пятью контейнерами. Третий способ использует параметры --num-results и --marker для ограничения извлечения всех BLOB-объектов в контейнере.

Дополнительные сведения см. в справочнике по команде az storage blob list.


#!/bin/bash
storageAccount="<storage-account>"
blobName="demo-file.txt"
containerName="demo-container"
blobPrefix="img-louis"
numResults=5

#Approach 1: List all blobs in a named container
az storage blob list \
    --container $containerName \
    --account-name $storageAccount \
    --prefix $blobName
    --auth-mode login

#Approach 2: Use the --prefix parameter to list blobs in all containers

containerList=$( \
    az storage container list \
        --query "[].name" \
        --num-results $numResults \
        --account-name $storageAccount \
        --auth-mode login \
        --output tsv 
)
for row in $containerList
do
    tmpName=$(echo $row | sed -e 's/\r//g')
    echo $tmpName
    az storage blob list \
        --prefix $blobPrefix \
        --container $tmpName \
        --account-name $storageAccount \
        --auth-mode login
done

Скачивание большого двоичного объекта

В зависимости от варианта использования для скачивания больших двоичных объектов используется команда az storage blob download или az storage blob download-batch. Чтобы скачать отдельный большой двоичный объект, вызовите команду az storage blob download напрямую и передайте значения для параметров --container-name, --file и --name. BLOB-объект будет по умолчанию загружен в рабочий каталог оболочки, но можно указать альтернативное расположение. Операция завершится сбоем, если указанный путь не существует.

Чтобы рекурсивно скачивать несколько больших двоичных объектов из контейнера хранилища, используйте команду az storage blob download-batch. Эта команда поддерживает сопоставление шаблонов имен файлов UNIX с параметром --pattern. Поддерживаются шаблоны *, ?, [seq] и [!seq]. Дополнительные сведения см. в документации Python по сопоставлению шаблонов имен файлов UNIX.

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

Дополнительные сведения см. в справке по командам az storage blob download и az storage blob download batch.

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

destinationPath="C:\\temp\\downloads\\"
destinationFilename="downloadedBlob.txt"
file="$destinationPath$destinationFilename"
sourceBlobName="demo-file.txt"

#Download a single named blob

az storage blob download \
    --container $containerName \
    --file $file \
    --name $sourceBlobName \
    --account-name $storageAccount \
    --auth-mode login

#Download multiple blobs using a pattern value

az storage blob download-batch \
    --destination $destinationPath \
    --source $containerName \
    --pattern images/*.png \
    --account-name $storageAccount \
    --auth-mode login

#Use a loop to download matching blobs in a list of containers

containerList=$( \
    az storage container list \
        --query "[].name" \
        --num-results 5 \
        --account-name $storageAccount \
        --auth-mode login \
        --output tsv 
)
for row in $containerList
do
    tmpName=$(echo $row | sed -e 's/\r//g')
    echo $tmpName
   
    az storage blob download-batch \
        --destination $destinationPath \
        --source $tmpName \
        --pattern *louis*.* \
        --account-name $storageAccount \
        --auth-mode login
done

Управление свойствами и метаданными BLOB-объектов

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

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

Чтение свойств BLOB-объектов

Чтобы прочитать свойства или метаданные BLOB-объекта, необходимо сначала извлечь его из службы. Используйте команду az storage blob show для извлечения свойств и метаданных BLOB-объекта, но не его содержимого. В следующем примере извлекается BLOB-объект и перечисляются его свойства.

Дополнительные сведения см. в справочнике по команде az storage blob show.

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

az storage blob show \
    --container  demo-container \
    --name demo-file.txt \
    --account-name $storageAccount \
    --auth-mode login

Чтение и запись метаданных BLOB-объекта

Метаданные BLOB-объекта — это необязательный набор пар имен и значений, связанных с BLOB-объектом. Как показано в предыдущем примере, метаданные изначально не связаны с BLOB-объектом, но их можно добавить при необходимости. Для чтения используйте команду az storage blob metadata show. Для обновления метаданных BLOB-объекта используйте az storage blob metadata update и предоставьте массив пар "ключ-значение". Дополнительные сведения см. в документации по команде az storage blob metadata.

Дополнительные сведения см. в справочнике по команде az storage blob metadata.

В приведенном ниже примере сначала обновляются, а затем фиксируются метаданные BLOB-объекта, после чего они извлекаются.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
blobName="blue-moon.mp3"

metadata=("Written=1934" "Recorded=1958")
metadata+=("Lyricist=Lorenz Hart")
metadata+=("Composer=Richard Rogers")
metadata+=("Artist=Tony Bennett")

#Update metadata
az storage blob metadata update \
    --container-name $containerName \
    --name $blobName \
    --metadata "${metadata[@]}" \
    --account-name $storageAccount \
    --auth-mode login

#Retrieve updated blob metadata
az storage blob metadata show \
    --container-name $containerName \
    --name $blobName \
    --account-name $storageAccount \
    --auth-mode login

Операции копирование BLOB-объектов

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

Чтобы скопировать конкретный большой двоичный объект, используйте команду az storage blob copy start и укажите значения для контейнеров источника и назначения и BLOB-объект. В качестве источника также можно указать универсальный код ресурса (URI), общую папку или подписанный URL-адрес (SAS).

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

С помощью команды az storage blob copy start-batch можно рекурсивно копировать несколько BLOB-объектов между контейнерами хранилища в одной учетной записи хранения. Эта команда требует значения для параметров --source-container и --destination-container и может скопировать все файлы между источником и назначением. Как и другие пакетные команды CLI, эта команда поддерживает сопоставление шаблонов имен файлов UNIX с параметром --pattern. Поддерживаются шаблоны *, ?, [seq] и [!seq]. Дополнительные сведения см. в документации Python по сопоставлению шаблонов имен файлов UNIX.

Примечание.

Для повышения удобства и производительности рассмотрите возможность использования AzCopy, особенно при копировании BLOB-объектов между учетными записями хранения. AzCopy — это служебная программа командной строки, которую можно использовать для копирования больших двоичных объектов или файлов в учетную запись хранения или из нее. Узнайте больше о том, как начать работу с AzCopy.

Дополнительные сведения см. в документации по команде az storage blob copy.

В примере кода ниже приводится пример одной и нескольких операций копирования. Так как некоторые среды могут содержать много тысяч ресурсов, рекомендуется использовать параметр --num-results. В первом примере BLOB-объект secret-town-road.png копируется из контейнера photos в контейнер locations. Оба контейнера существуют в одной учетной записи хранения. Результат проверяет успешность копирования.

#!/bin/bash
storageAccount="<storage-account>"
sourceContainer="photos"
blobName="secret-town-road.jpg"
destContainer="locations"

az storage blob copy start \
    --destination-container $destContainer \
    --destination-blob $blobName \
    --source-container $sourceContainer \
    --source-blob $blobName \
    --account-name $storageAccount \
    --auth-mode login

Создание моментального снимка BLOB-объекта

Свойства аренды, связанные с базовым BLOB-объектом, не влияют на моментальный снимок. Вы не можете получить аренду в моментальном снимке. См. дополнительные сведения о моментальных снимках BLOB-объектов. Дополнительные сведения см. в документации по команде az storage blob snapshot.

Следующий пример кода извлекает BLOB-объект из контейнера хранилища и создает его моментальный снимок.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
blobName="demo-file.txt"

az storage blob snapshot \
    --container-name $containerName \
    --name Blue-Moon.mp3 \
    --account-name $storageAccount \
    --auth-mode login

Установка уровня BLOB-объекта

При изменении уровня BLOB-объекта он и все его данные перемещаются на целевой уровень. Вы можете изменить уровень между горячим, холодным и архивным с помощью az storage blob set-tier команды.

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

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

Дополнительные сведения см. в справочнике по команде az storage blob set-tier.

Следующий пример кода задает уровень горячим для одного именованного большого двоичного объекта в контейнере archive .

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

az storage blob set-tier 
    --container-name $containerName \
    --name Blue-Moon.mp3 \
    --tier Hot \
    --account-name $storageAccount \
    --auth-mode login

Операции, использующие теги BLOB-объектов

Теги индекса BLOB-объектов упрощают управление данными и их обнаружение. Теги индекса BLOB-объектов — это определяемые пользователем атрибуты индекса "ключ — значение", которые можно применять к BLOB-объектам. После настройки вы сможете классифицировать и находить объекты в отдельном контейнере или во всех контейнерах. Ресурсы BLOB-объектов можно динамически классифицировать, обновляя их теги индекса без изменений в организации контейнеров. Этот подход предлагает гибкий способ обеспечения соответствия меняющимся требованиям к данным. Метаданные и тег индекса можно использовать одновременно. Дополнительные сведения об тегах индекса см. в статье Управление данными BLOB-объектов Azure и их поиск с помощью тегов индекса BLOB-объектов.

Совет

В приведенном ниже примере кода используется сопоставление шаблонов для получения текста из XML-файла, имеющего известную структуру. Этот пример используется для иллюстрации упрощенного подхода к добавлению тегов BLOB-объектов с помощью базовых функций Bash. При использовании данных для производственных рабочих нагрузок всегда рекомендуется использовать средство анализа фактических данных.

В следующем примере показано, как добавить теги индекса к ряду BLOB-объектов. В этом примере считываются данные из XML-файла и используются для создания тегов индекса для нескольких BLOB-объектов. Чтобы использовать образец кода, создайте локальный файл blob-list.xml в каталоге C:\temp. Данные XML предоставлены ниже.

Дополнительные сведения см. в справочнике по команде az storage blob set-tier.

<Venue Name="House of Prime Rib" Type="Restaurant">
  <Files>
    <File path="transactions/12027121.csv" />
    <File path="campaigns/radio-campaign.docx" />
    <File path="photos/bannerphoto.png" />
    <File path="archive/completed/2020review.pdf" />
    <File path="logs/2020/01/01/logfile.txt" />
  </Files>
</Venue>

В примере кода выполняется итерация по строкам в XML-файле. После обнаружения элемента Venue создаются переменные для значений Name и Type. Затем выполняется проход по оставшимся строкам и создаются теги для каждого BLOB-объекта, на который ссылается узел File.

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

while read line
do
  
#Set Tag values 
if echo "$line" | grep -q "<Venue";then
    name=`echo "$line" | cut -d'"' -f 2`
    type=`echo "$line" | cut -d'"' -f 4`
    tags=("name=$name")
    tags+=("type=$type")
fi

#Add tags to blobs
if echo "$line" | grep -q "<File ";then
    blobName=`echo "$line" | cut -d'"' -f 2`
    
    echo az storage blob tag set \
        --container-name $containerName \
        --name $blobName \
        --account-name $storageAccount \
        --auth-mode login \
        --tags "{$tags[@]}"
fi

done < /mnt/c/temp/bloblist.xml

удаление больших двоичных объектов.

С помощью команд az storage blob delete и az storage blob delete-batch можно удалить один BLOB-объект или ряд BLOB-объектов. При удалении нескольких BLOB-объектов можно использовать условные операции, циклы или другие методы автоматизации, как показано в примерах ниже.

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

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

В следующем образце кода приведен пример как отдельных, так и пакетных операций удаления. В первом примере удаляется один именованный BLOB-объект. Во втором примере показано использование логических операций в Bash для удаления нескольких BLOB-объектов. В третьем примере используется команда delete-batch для удаления всех BLOB-объектов в формате bennett-x, кроме bennett-2.

Дополнительные сведения см. в справке по командам az storage blob delete и az storage blob delete-batch.

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

blobName="demo-file.txt"
blobPrefix="sinatra-"

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

#Iterate a blob list, deleting blobs whose names end with even numbers

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

## Delete all blobs with the format *bennett-x* except *bennett-2.*
for row in $blobList
do
    #Get the blob's number
    tmpBlob=$(echo $row | sed -e 's/\r//g') 
    tmpName=$(echo ${row%.*} | sed -e 's/\r//g')

    if [ `expr ${tmpName: ${#blobPrefix}} % 2` == 0 ]
    then
        
        echo "Deleting $tmpBlob"
        az storage blob delete \
            --container-name $containerName \
            --name $tmpBlob \
            --account-name $storageAccount \
            --auth-mode login

  fi
done

#Delete multiple blobs using delete-batch
az storage blob delete-batch \
    --source $containerName \
    --pattern bennett-[!2].* \
    --account-name $storageAccount \
    --auth-mode login

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

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

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

blobPrefix="sinatra-"

#Retrieve a list of all deleted blobs
az storage blob list \
    --container-name $containerName \
    --include d \
    --output table \
    --account-name $storageAccount \
    --auth-mode login \
    --query "[?deleted].{name:name,deleted:properties.deletedTime}"

#Retrieve a list of all deleted blobs matching a specific prefix
az storage blob list \
    --container-name $containerName \
    --prefix $blobPrefix \
    --output table \
    --include d \
    --account-name $storageAccount \
    --auth-mode login \
    --query "[].{name:name,deleted:deleted}"

Восстановление удаленного BLOB-объекта

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

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

В следующем примере кода восстанавливаются все обратимо удаленные большие двоичные объекты или, если включена поддержка управления версиями, восстанавливается последняя версия большого двоичного объекта. Сначала в нем с помощью команды az storage account blob-service-properties show определяется, включено ли управление версиями.

Если поддержка управления версиями включена, команда az storage blob list извлекает список всех версий BLOB-объектов с уникальными именами. Затем версии большого двоичного объекта в списке извлекаются и упорядочиваются по датам. Если с значением атрибута isCurrentVersion не найдено ни одной версии, команда az storage blob copy start используется для создания активной копии последней версии BLOB-объекта.

Если управление версиями отключено, команда az storage blob undelete используется для восстановления каждого обратимо удаленного большого двоичного объекта в контейнере.

Прежде чем использовать этот пример, необходимо включить обратимое удаление по крайней мере в одной из ваших учетных записей хранения. Дополнительные сведения о защите данных с помощью обратимого удаления см. в статье Обратимое удаление для больших двоичных объектов и в справке по команде az storage blob undelete.

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

blobSvcProps=$(
    az storage account blob-service-properties show \
        --account-name $storageAccount \
        --resource-group $groupName)

softDelete=$(echo "${blobSvcProps}" | jq -r '.deleteRetentionPolicy.enabled')
versioning=$(echo "${blobSvcProps}" | jq -r '.isVersioningEnabled')

# If soft delete is enabled
if $softDelete
then
    
    # If versioning is enabled
    if $versioning
    then

        # Get all blobs and versions using -Unique to avoid processing duplicates/versions
        blobList=$(
            az storage blob list \
                --account-name $storageAccount \
                --container-name $containerName \
                --include dv \--query "[?versionId != null].{name:name}" \
                --auth-mode login -o tsv | uniq)
        
        # Iterate the collection
        for blob in $blobList
        do
            # Get all versions of the blob, newest to oldest
            blobVers=$(
                az storage blob list \
                    --account-name $storageAccount \
                    --container-name $containerName \
                    --include dv \
                    --prefix $blob \
                    --auth-mode login -o json | jq 'sort_by(.versionId) | reverse | .[]')
            # Select the first (newest) object
            delBlob=$(echo "$blobVers" | jq -sr '.[0]')
            
            # Verify that the newest version is NOT the latest (that the version is "deleted")
            if [[ $(echo "$delBlob" | jq '.isCurrentVersion') != true ]]; 
            then
                # Get the blob's versionId property, build the URI to the blob
                versionID=$(echo "$delBlob" | jq -r '.versionId')
                uri="https://$storageAccount.blob.core.windows.net/$containerName/$blob?versionId=$versionID"
                
                # Copy the latest version 
                az storage blob copy start \
                    --account-name $storageAccount \
                    --destination-blob $blob \
                    --destination-container $containerName \
                    --source-uri $uri \
                    --auth-mode login
       
                delBlob=""
            fi
        done

    else

        #Retrieve all deleted blobs
        blobList=$( \
            az storage blob list \
                --container-name $containerName \
                --include d \
                --output tsv \
                --account-name $storageAccount \
                --auth-mode login \
                --query "[?deleted].[name]" \
        )

        #Iterate list of deleted blobs and restore
        for row in $blobList
        do
            tmpName=$(echo $row | sed -e 's/\r//g')
            echo "Restoring $tmpName"
            az storage blob undelete \
                --container-name $containerName \
                --name $tmpName \
                --account-name $storageAccount \
                --auth-mode login
        done

    fi

else
    
    #Soft delete is not enabled
    echo "Sorry, the delete retention policy is not enabled."

fi

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