Поделиться через


Управляйте блочными блобами с помощью Azure CLI

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

Предварительные условия

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

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

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

  • Для работы с этой статьей требуется Azure CLI версии 2.0.46 или более поздней. Если вы используете Azure Cloud Shell, последняя версия уже установлена.

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

Вы можете авторизовать доступ к Blob Storage в 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 +%Y:%m:%d -d "7 days ago")

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 перечисляет все блобы, хранящиеся в контейнере. Для определения области поиска можно использовать различные подходы. Нет ограничений на количество контейнеров или блобов, которые может иметь учетная запись хранения. Чтобы избежать извлечения тысяч больших двоичных объектов, рекомендуется ограничить объем возвращаемых данных.

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

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

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

В следующем примере показаны несколько подходов к предоставлению списка объектов. Первый подход перечисляет все блобы, находящиеся в указанном контейнере. Второй подход использует --prefix параметр для перечисления всех объектов Blob в контейнерах, начинающихся с указанного префикса. Третий подход использует --num-results параметр для ограничения возвращаемых результатов и --show-next-marker параметр для включения маркера продолжения в результаты. Когда маркер продолжения присутствует в результатах, он передается следующему вызову az storage blob list для получения следующего набора результатов.

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

#!/bin/bash
storageAccount="<storage-account>"
containerName="<container-name>"
blobPrefix="<prefix-string>"
numResults=5

#Approach 1: List all blobs in a container by name.

az storage blob list \
    --account-name $storageAccount \
    --container $containerName \
    --query "[].name" \
    --auth-mode login \
    --output tsv

#Approach 2: Use the --prefix parameter to list blobs starting with specified prefix.

az storage blob list \
    --account-name $storageAccount \
    --container $containerName \
    --prefix $blobPrefix \
    --query "[].name" \
    --auth-mode login \
    --output tsv

#Approach 3: Use the continuation token to return the complete set of results.

get_blobs() {
    if [ -z "$nextMarker" ]; then
        az storage blob list --container-name $containerName --num-results $numResults --account-name $storageAccount --show-next-marker --only-show-errors --auth-mode login
    else
        az storage blob list --container-name $containerName --num-results $numResults --marker $nextMarker --account-name $storageAccount --show-next-marker --only-show-errors --auth-mode login
    fi
}
 
total=0
nextMarker=""
while true; do
    blobs=$(get_blobs $containerName $numResults $storageAccount $nextMarker) 
    nextMarker=""
    blobsLength=$(echo $blobs | jq length)
    
    if [ $blobsLength -le 0 ]; then
        break
    fi
    
    blobIndex=0
    while read blob; do
        if [ $blobIndex -eq $(($blobsLength-1)) ]; 
        then
            nextMarker="$(echo $blob | jq -r .nextMarker)"
        else
            blobName=$(echo $blob | jq .name)
            echo "blobname: $blobName"
        fi
        ((blobIndex++))
    done <<<$(echo $blobs | jq -c '.[]')
 
    total=$(($total+$blobsLength-1))
    echo "Processed $total blobs so far"
    # echo "nextMarker: $nextMarker"
    if [ "${nextMarker}" = "null" ]; then
        echo -e "\nAccountName: $storageAccount, ContainerName: $containerName "
        echo "Processed $total blobs in total."
        break
    fi
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.

В следующем примере кода показаны как одиночный, так и множественный подходы к скачиванию. Кроме того, предлагается упрощенный подход к поиску определенных файлов во всех контейнерах с помощью подстановочного знака. Так как в некоторых средах может быть много тысяч ресурсов, рекомендуется использовать --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 и подайте массив пар "ключ-значение". Дополнительные сведения см. в справочнике по метаданным blob-объектов az storage .

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

Приведенный ниже пример сначала обновляет и фиксирует метаданные большого двоичного объекта, а затем извлекает его.

#!/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

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

Существует множество сценариев, в которых можно скопировать блобы различных типов. Примеры в этой статье касаются только блобов блоков (block blobs). Azure CLI предлагает команды, выполняющие операции с одним ресурсом или с несколькими ресурсами в зависимости от требований.

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

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

С помощью команды az storage blob copy start-batch можно рекурсивно копировать несколько объектов блоб между контейнерами хранения в одной учетной записи хранения. Эта команда требует значения для параметров --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 из контейнера хранения и создается его моментальный снимок.

#!/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-объектов из архивного уровня.

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

Следующий пример кода устанавливает уровень горячий для одного именованного BLOB в контейнере 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-объектов Azure и их поиск с помощью тегов индекса BLOB-объектов.

Tip

В приведенном ниже примере кода используется сопоставление шаблонов для получения текста из 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. Затем он выполняет итерацию по оставшимся строкам и создает теги для каждого блоба, на который ссылается 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-объектов можно использовать условные операции, циклы или другие методы автоматизации, как показано в примерах ниже.

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

Выполнение следующих примеров может навсегда удалить блобы. Компания Microsoft рекомендует включить мягкое удаление контейнеров, чтобы защитить контейнеры и 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

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

Используйте следующие примеры, чтобы получить список блобов, удаленных в течение установленного срока хранения контейнера. В первом примере отображается список недавно удаленных 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, можно настроить параметр защиты данных мягкого удаления в учетной записи хранения. Если такая защита данных включена, то вы сможете восстановить контейнеры, удаленные в течение связанного периода хранения. Вы также можете использовать управление версиями для поддержания предыдущих версий объектов BLOB при каждом восстановлении и обратном восстановлении.

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

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

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

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

Прежде чем следовать этому примеру, необходимо включить мягкое удаление по крайней мере для одной из учетных записей хранения. Чтобы узнать больше о параметре защиты данных с помощью мягкого удаления, см. статью Мягкое удаление для BLOB-объектов или руководство по команде 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

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