Azure CLI でブロック BLOB を管理する

Blob Storage は、ブロック BLOB、追加 BLOB、およびページ BLOB をサポートします。 ブロック BLOB は、大量のデータを効率的にアップロードするために最適化されています。 ブロック BLOB は、ランダムな読み取りや書き込み操作の対象でない画像、ドキュメント、その他の種類のデータを格納する場合に最適です。 この記事では、ブロック BLOB を使用する方法について説明します。

前提条件

Azure Storage にアクセスするには、Azure サブスクリプションが必要です。 まだサブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

Azure Storage へのアクセスはすべて、ストレージ アカウント経由で行われます。 このクイック スタートでは、Azure portal、Azure PowerShell、または Azure CLI を使用して、ストレージ アカウントを作成します。 ストレージ アカウントの作成については、「ストレージ アカウントの作成」を参照してください。

Azure CLI の環境を準備する

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。

  • CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

  • この記事では、Azure CLI のバージョン 2.0.46 以降が必要です。 Azure Cloud Shell を使用している場合は、最新バージョンが既にインストールされています。

Blob Storage へのアクセスを承認する

Blob Storage へのアクセスは、Azure CLI から Microsoft Entra 資格情報を使用するか、またはストレージ アカウントのアクセス キーを使用して承認することができます。 Microsoft Entra 資格情報を使用することをお勧めします。この記事の例では、Microsoft Entra ID のみを使用します。

Blob Storage を対象とするデータの操作では、Azure CLI コマンドで --auth-mode パラメーターがサポートされます。特定の操作を承認する方法をパラメーターで指定できます。 Microsoft Entra の資格情報を使用して承認するには、--auth-mode パラメーターを login に設定します。 --auth-mode パラメーターがサポートされるのは、Blob Storage のデータの操作だけです。 リソース グループの作成やストレージ アカウントの作成など、管理操作の承認では自動的に Microsoft Entra の資格情報が使用されます。 詳細については、「Azure CLI で BLOB データへのアクセスの承認方法を選択する」を参照してください。

login コマンドを実行してブラウザーを開き、お使いの Azure サブスクリプションに接続します。


az login

コンテナーの作成

すべての BLOB データはコンテナー内に格納されます。そのため、データをアップロードするには、少なくとも 1 つのコンテナー リソースが必要です。 必要に応じて、次の例を使用してストレージ コンテナーを作成します。 詳細については、Azure CLI を使用して BLOB コンテナーを管理する方法に関するページを参照してください。


#!/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 CLI を使用した Azure へのサインインの詳細については、「Azure CLI を使用してサインインする」を参照してください。

BLOB をアップロードする

Azure CLI には、要件に応じて、1 つのリソースまたは複数のリソースに対して操作を実行するコマンドが用意されています。

ファイルをブロック BLOB にアップロードするには、必要なパラメーター値を az storage blob upload コマンドに渡します。 --file パラメーターを指定してソース パスとファイル名を指定し、--container-name パラメーターを指定して宛先コンテナーの名前を指定します。 また、--account-name パラメーターも指定する必要があります。 このコマンドは、新しい BLOB を作成するか、元の BLOB がすでに存在する場合は上書きします。

az storage blob upload-batch コマンドを使用すると、複数の BLOB をストレージ コンテナーに再帰的にアップロードできます。 Unix ファイル名パターン マッチングを使用すると、--pattern パラメーターを使用して、アップロードするファイルの範囲を指定できます。 サポートされているパターンは *?[seq]、および [!seq] です。 詳細については、Unix ファイル名パターン マッチングに関する Python ドキュメントを参照してください。

次の例では、最初の操作で az storage blob upload コマンドを使用して、1 つの名前付きファイルをアップロードします。 ソース ファイルと宛先のストレージ コンテナーは、--file--container-name のパラメーターを使用して指定します。

2 番目の操作は、az storage blob upload-batch コマンドを使用して複数のファイルをアップロードする方法を示しています。 --if-modified-since パラメーターを指定すると、過去 7 日以内に変更されたファイルのみがアップロードされます。 このパラメーターで指定する値は、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

BLOB を一覧表示する

既定では、この az storage blob list コマンドを実行すると、コンテナー内に格納されているすべての BLOB が一覧表示されます。 さまざまな方法を使用して、検索の範囲を絞り込むことができます。 ストレージ アカウントが持つことができるコンテナーまたは BLOB の数に制限はありません。 何千もの BLOB を取得しないようにするには、返されるデータの量を制限することをお勧めします。

--prefix パラメーターを使用して、定義された文字列で始まる名前を持つ単一の既知のファイルまたはファイルの範囲を選択します。 --prefix パラメーターの一部に、仮想ディレクトリを指定できます。

既定では、一覧作成操作を行うと BLOB だけが返されます。 一部のシナリオでは、--include パラメーターに値を渡して、論理的に削除された BLOB、スナップショット、バージョンなど、追加の種類のオブジェクトを返したい場合があります。 これらの値を組み合わせることで、複数のオブジェクトの種類を返すことができます。

--num-results パラメーターを使用して、コンテナーから返される BLOB の数を制限できます。 すべての Azure リソースに対して 5,000 のサービス制限が課されます。 この制限により、管理可能な量のデータが取得され、パフォーマンスに影響が出なくなります。 返される BLOB の数が、--num-results 値またはサービス制限を超えた場合は、後続トークンが返されます。 このトークンを使用すると、複数の要求を使用して任意の数の BLOB を取得できます。 詳細については、BLOB リソースの列挙に関する記事を参照してください。

次の例では、BLOB の一覧を提供するために使用されるいくつかの方法を示します。 最初の方法では、指定したコンテナー内のすべての BLOB が一覧表示されます。 2 番目の方法では、--prefix パラメーターを使用して、指定したプレフィックスで始まるコンテナー内のすべての BLOB を一覧表示します。3 番目の方法では、--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

BLOB をダウンロードする

ユース ケースに応じて、az storage blob download または az storage blob download-batch コマンドを使用して BLOB をダウンロードします。 個々の BLOB をダウンロードするには、az storage blob download コマンドを直接呼び出して --container-name--file、および --name のパラメーターの値を渡します。 既定では、BLOB は shell ディレクトリにダウンロードされますが、別の場所を指定することもできます。 指定したパスが存在しない場合、操作はエラーで失敗します。

ストレージ コンテナーから複数の BLOB を再帰的にダウンロードするには、az storage blob download-batch コマンドを使用します。 このコマンドでは、--pattern パラメーターを使用した Unix ファイル名パターン マッチングがサポートされています。 サポートされているパターンは *?[seq]、および [!seq] です。 詳細については、Unix ファイル名パターン マッチングに関する Python ドキュメントを参照してください。

次のサンプル コードでは、1 回と複数回の両方のダウンロード方法の例を示しています。 また、ワイルドカードを使用して、特定の複数のファイルに対してすべてのコンテナーを検索するための簡単な方法も示しています。 一部の環境には何千ものリソースが含まれていることがあるため、--num-results パラメーターの使用をお勧めします。

詳細については、az storage blob downloadaz 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 ストレージ リソースに対して指定された、1 つ以上の名前と値のペアで構成されます。 メタデータを使用すると、リソースに関する追加の値を格納できます。 メタデータ値は独自の目的に使用され、リソースの動作には影響しません。

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 には、要件に応じて、1 つのリソースまたは複数のリソースに対して操作を実行するコマンドが用意されています。

特定の BLOB をコピーするには、az storage blob copy start コマンドを使用して、コピー元とコピー先のコンテナーと BLOB の値を指定します。 また、コピー元には、Uniform Resource Identifier (URI)、共有、または共有アクセス署名 (SAS) を指定することもできます。

それだけでなく、BLOB をコピーする条件を指定することもできます。 これらの条件は、コピー元またはコピー先 BLOB のいずれかに設定できます。 最終更新日、タグ データ、または ETag 値を参照することができます。 たとえば、最近変更されていない BLOB を別のコンテナーにコピーするなどが可能です。 詳細については、BLOB サービス操作の条件ヘッダーを指定する方法に関するページを参照してください。

az storage blob copy start-batch コマンドを使用すると、同じストレージ アカウント内のストレージ コンテナー間で複数の BLOB を再帰的にコピーすることができます。 このコマンドを利用するには --source-container--destination-container パラメーターの値を指定する必要があり、こうすることでコピー元とコピー先の間ですべてのファイルをコピーできます。 他の CLI バッチ コマンドと同様に、このコマンドでは --pattern パラメーターを使用した Unix ファイル名パターン マッチングがサポートされています。 サポートされているパターンは *?[seq]、および [!seq] です。 詳細については、Unix ファイル名パターン マッチングに関する Python ドキュメントを参照してください。

注意

特にストレージ アカウント間で BLOB をコピーする場合は、簡単さとパフォーマンス上の理由から AzCopy の使用を検討してください。 AzCopy は、ストレージ アカウント間の BLOB またはファイル コピーに利用できるコマンドライン ユーティリティです。 「AzCopy を使ってみる」で、方法の詳細をご覧ください。

詳細については、az storage blob copy のリファレンスを参照してください。

次のサンプル コードでは、1 回と複数回の両方のコピー操作の例を示しています。 一部の環境には何千ものリソースが含まれていることがあるため、--num-results パラメーターの使用をお勧めします。 最初の例では、secret-town-road.png BLOB を 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 の層を変更するときは、その BLOB とそのすべてのデータをターゲット層に移動します。 az storage blob set-tier コマンドを使用すると、ホットクールアーカイブの間で層を変更することができます。

要件によっては、Copy Blob 操作を利用して、ある層から別の層に BLOB をコピーすることもできます。 Copy Blob 操作は、コピー元 BLOB を元の層に残したまま、目的の層に新しい BLOB を作成します。

クールまたはホットからアーカイブへの層の変更は、ほぼ瞬時に行われます。 BLOB がアーカイブ層に移動されると、オフラインであると見なされ、読み取りや変更ができません。 アーカイブされた BLOB のデータを読み取りまたは変更するには、そのデータをオンライン層にリハイドレートする必要があります。 詳細については、「アーカイブ層からの BLOB のリハイドレート」を参照してください。

詳細については、az storage blob set-tier のリファレンスをご覧ください。

次のサンプル コードでは、archive コンテナー内にある 1 つの名前付き BLOB の層をホットに設定します。

#!/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 ファイルからパターン マッチングでテキストを取得します。 この例は、Bash の基本的な機能を使用して BLOB タグを追加する簡単な方法を示すために使用されています。 実運用ワークロードでデータを使用する場合は、必ず実際のデータ解析ツールを使用することをお勧めします。

次の例では、BLOB インデックス タグを一連の BLOB に追加する方法を示しています。 この例では、XML ファイルからデータを読み取り、それを使用して複数の BLOB にインデックス タグを作成します。 サンプル コードを使用するには、C:\temp ディレクトリにローカルの blob-list.xml ファイルを作成します。 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 要素を見つけ、NameType の値の変数を作成します。 次に、残りの行の反復処理を行い、File ノードによって参照される各 BLOB のタグを作成します。

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

BLOB を削除する

az storage blob deleteaz storage blob delete-batch コマンドを使用して、1 つの BLOB または一連の BLOB を削除できます。 複数の BLOB を削除する場合は、次の例に示すように、条件演算、ループ、またはオートメーションを利用できます。

警告

下記の例を実行すると、BLOB が完全に削除される可能性があります。 誤ってコンテナーや BLOB を削除しないように、コンテナーの論理的な削除を有効にすることをお勧めします。 詳細については、「コンテナーの論理的な削除」を参照してください。

次のサンプル コードでは、個別の削除操作とバッチの削除操作両方の例を示しています。 最初の例では、1 つの名前付き BLOB を削除します。 2 つ目の例では、複数の BLOB を削除するために、Bash で論理演算を使用する方法を示します。 3 番目の例では、delete-batch コマンドを使用して、bennett-2 を除く bennett-x というフォーマットを持つすべての BLOB を削除します。

詳細については、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 が削除された日付の一覧が表示されます。 2 番目の例では、特定のプレフィックスに一致するすべての削除済み 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 が復元されます。

この例を使用するには、少なくとも 1 つのストレージ アカウントで論理的な削除を有効にしておく必要があります。 論理的な削除のデータ保護オプションの詳細については、「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

次のステップ