PowerShell を使用してブロック BLOB を管理する

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

前提条件

  • Azure サブスクリプション。 Azure 無料試用版の取得に関するページを参照してください。

  • Azure PowerShell モジュール Az。これは、Azure を操作するための推奨の PowerShell モジュールです。 Az PowerShell モジュールの使用を開始するには、「Azure PowerShell をインストールする」を参照してください。

資格情報をカプセル化するコンテキスト オブジェクトを構成する

Azure Storage に対するすべての要求が承認される必要があります。 PowerShell から行われた要求は、Microsoft Entra アカウントまたはアカウント アクセス キーを使用して承認できます。 この記事の例では、コンテキスト オブジェクトと Microsoft Entra 認可を使用します。 コンテキスト オブジェクトでは、Microsoft Entra 資格情報がカプセル化され、後続のデータ操作中に渡されます。

Microsoft Entra アカウントを使用して Azure アカウントにサインインするには、PowerShell を開き、Connect-AzAccount コマンドレットを呼び出します。

#Connect to your Azure subscription
Connect-AzAccount

接続が確立された後、Azure コンテキストを作成します。 Microsoft Entra ID で認証を行うと、既定のサブスクリプションの Azure コンテキストが自動的に作成されます。 場合によっては、認証後に別のサブスクリプションのリソースにアクセスする必要があります。 アクティブなセッションのコンテキストを変更することで、現在の Azure セッションに関連付けられているサブスクリプションを変更します。

既定のサブスクリプションを使用するには、New-AzStorageContext コマンドレットを呼び出してコンテキストを作成します。 -UseConnectedAccount パラメーターを含めて、データ操作が自分の Microsoft Entra 資格情報を使って実行されるようにしてください。

#Create a context object using Azure AD credentials
$ctx = New-AzStorageContext -StorageAccountName <storage account name> -UseConnectedAccount

サブスクリプションを変更するには、Get-AzSubscription コマンドレットを使用してコンテキスト オブジェクトを取得し、Set-AzContext を使用して現在のコンテキストを変更します。 詳細については、「アクティブなサブスクリプションを変更する」を参照してください。

コンテナーの作成

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

#Create a container object
$container = New-AzStorageContainer -Name "mycontainer" -Context $ctx

次の例を使用する場合は、角かっこ内のプレースホルダー値を独自の値に置き換える必要があります。 PowerShell を使用した Azure へのサインインの詳細については、「Azure PowerShell を使用してサインインする」を参照してください。

BLOB をアップロードする

ファイルをブロック BLOB にアップロードするには、必要なパラメーター値を Set-AzStorageBlobContent コマンドレットに渡します。 -File パラメーターを指定してパスとファイル名を指定し、-Container パラメーターを指定してコンテナーの名前を指定します。 また、-Context パラメーターを使用してコンテキスト オブジェクトへの参照を指定する必要があります。

このコマンドにより、BLOB が存在しない場合は作成され、存在する場合は上書き確認を求めるメッセージが表示されます。 -Force パラメーターをコマンドレットに渡した場合、確認せずにファイルを上書きできます。

次の例では、単一の名前付きファイルをアップロードする -File パラメーター値を指定します。 また、PowerShell パイプライン演算子と Get-ChildItem コマンドレットを使用して複数のファイルをアップロードする例も示しています。 Get-ChildItem コマンドレットでは、-Path パラメーターを使用して C:\Temp\*.png を指定しています。 アスタリスク (*) のワイルドカードを含めることで、ファイル名の拡張子が .png のすべてのファイルが指定されます。 -Recurse パラメーターによって、Temp ディレクトリとそのサブディレクトリが検索されます。

#Set variables
$path          = "C:\temp\" 
$containerName = "mycontainer"
$filename      = "demo-file.txt"
$imageFiles    = $path + "*.png"
$file          = $path + $filename

#Upload a single named file
Set-AzStorageBlobContent -File $file -Container $containerName -Context $ctx

#Upload multiple image files recursively
 Get-ChildItem -Path $imageFiles -Recurse | Set-AzStorageBlobContent -Container $containerName -Context $ctx

結果には、ストレージ アカウント名とストレージ コンテナー名が表示され、アップロードされたファイルの一覧が表示されます。

   AccountName: demostorageaccount, ContainerName: demo-container

Name              BlobType   Length  ContentType                LastModified          AccessTier  IsDeleted
----              --------   ------  -----------                ------------          ----------  ---------
demo-file.txt     BlockBlob  222     application/octet-stream   2021-12-14 01:38:03Z  Cool        False     
hello-world.png   BlockBlob  14709   application/octet-stream   2021-12-14 01:38:03Z  Cool        False
hello-world2.png  BlockBlob  12472   application/octet-stream   2021-12-14 01:38:03Z  Cool        False
hello-world3.png  BlockBlob  13537   application/octet-stream   2021-12-14 01:38:03Z  Cool        False

BLOB を一覧表示する

Get-AzStorageBlob コマンドレットは、コンテナー内に格納されている BLOB を一覧表示するために使用されます。 さまざまな方法を使用して、検索の範囲を定義できます。 -Container-Name のパラメーターを使用すると、既知のコンテナー内の特定の BLOB が一覧表示されます。 特定のコンテナー内のすべての BLOB のフィルター処理されていないリストを生成するには、-Name 値を指定せずに、-Container パラメーターを単独で使用します。

ストレージ アカウントが持つことができるコンテナーまたは BLOB の数に制限はありません。 何千もの BLOB を取得しないようにするには、返されるデータの量を制限することをお勧めします。 複数の BLOB を取得するときに、-Prefix パラメーターを使用して、名前が特定の文字列で始まる BLOB を指定できます。 また、-Name パラメーターとワイルドカードを使用して、ファイル名または種類を指定することもできます。

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

次の例では、BLOB の一覧を提供するために使用されるいくつかの方法を示します。 最初の方法では、特定のコンテナー リソース内の 1 つの BLOB を示します。 2 番目の方法では、ワイルドカードを使用して、Louis のプレフィックスを持つすべての .jpg ファイルを一覧表示します。 検索は、-MaxCount パラメーターを使用して 5 つのコンテナーに制限されます。 3 番目の方法では、-MaxCount-ContinuationToken のパラメーターを使用して、コンテナー内のすべての BLOB の取得を制限します。

#Set variables
$namedContainer  = "named-container"
$demoContainer   = "mycontainer"
$containerPrefix = "demo"

$maxCount = 1000
$total     = 0
$token     = $Null

#Approach 1: List all blobs in a named container
Get-AzStorageBlob -Container $namedContainer -Context $ctx

#Approach 2: Use a wildcard to list blobs in all containers
Get-AzStorageContainer -MaxCount 5 -Context $ctx | Get-AzStorageBlob -Blob "*louis*.jpg" 

#Approach 3: List batches of blobs using MaxCount and ContinuationToken parameters
Do
{
     #Retrieve blobs using the MaxCount parameter
     $blobs = Get-AzStorageBlob -Container $demoContainer `
         -MaxCount $maxCount `
         -ContinuationToken $token `
         -Context $ctx
     $blobCount = 1
     
     #Loop through the batch
     Foreach ($blob in $blobs)
     {
         #To-do: Perform some work on individual blobs here

         #Display progress bar
         $percent = $($blobCount/$maxCount*100)
         Write-Progress -Activity "Processing blobs" -Status "$percent% Complete" -PercentComplete $percent
         $blobCount++
     }

     #Update $total
     $total += $blobs.Count
      
     #Exit if all blobs processed
     If($blobs.Length -le 0) { Break; }
      
     #Set continuation token to retrieve the next batch
     $token = $blobs[$blobs.Count -1].ContinuationToken
 }
 While ($null -ne $token)
 Write-Host "`n`n   AccountName: $($ctx.StorageAccountName), ContainerName: $demoContainer `n"
 Write-Host "Processed $total blobs in $namedContainer."

最初の 2 つの方法では、ストレージ アカウントとコンテナー名、および取得した BLOB の一覧が表示されます。 3 番目の方法では、名前付きコンテナー内の BLOB の総数が表示されます。 BLOB はバッチで取得され、ステータス バーにはカウント中の進行状況が表示されます。

   AccountName: demostorageaccount, ContainerName: named-container

Name                 BlobType    Length    ContentType    LastModified          AccessTier    IsDeleted
----                 --------    ------    -----------    ------------          ----------    ---------
index.txt            BlockBlob   222       text/plain     2021-12-15 22:00:10Z  Cool          False
miles-davis.txt      BlockBlob   23454     text/plain     2021-12-15 22:17:59Z  Cool          False
cab-calloway.txt     BlockBlob   18419     text/plain     2021-12-15 22:17:59Z  Cool          False
benny-goodman.txt    BlockBlob   17726     text/plain     2021-12-15 22:17:59Z  Cool          False


   AccountName: demostorageaccount, ContainerName: demo-container

Name                 BlobType    Length    ContentType    LastModified          AccessTier    IsDeleted
----                 --------    ------    -----------    ------------          ----------    ---------
louis-armstrong.jpg  BlockBlob   211482    image/jpeg     2021-12-14 01:38:03Z  Cool          False
louis-jordan.jpg     BlockBlob   55766     image/jpeg     2021-12-14 01:38:03Z  Cool          False
louis-prima.jpg      BlockBlob   290651    image/jpeg     2021-12-14 01:38:03Z  Cool          False


   AccountName: demostorageaccount, ContainerName: demo-container

Processed 5257 blobs in demo-container.

BLOB をダウンロードする

使用状況に応じて、Get-AzStorageBlobContent コマンドレットを使用して、単一または複数の BLOB をダウンロードできます。 ほとんどの操作と同様に、どちらの方法でもコンテキスト オブジェクトが必要です。

1 つの名前付き BLOB をダウンロードするには、コマンドレットを直接呼び出し、-Blob-Container のパラメーターの値を指定します。 BLOB は既定で、PowerShell の作業ディレクトリにダウンロードされますが、別の場所を指定できます。 ターゲットの場所を変更するには、-Destination パラメーターで有効な既存のパスを渡す必要があります。 操作でコピー先を作成できないので、指定したパスが存在しない場合はエラーで失敗します。

Get-AzStorageBlob コマンドレットと PowerShell パイプライン演算子を組み合わせることで、複数の BLOB をダウンロードできます。 最初に、Get-AzStorageBlob コマンドレットを使用して BLOB の一覧を作成します。 次に、パイプライン演算子と Get-AzStorageBlobContent コマンドレットを使用して、コンテナーから BLOB を取得します。

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

#Set variables
$containerName = "mycontainer"
$path          = "C:\temp\downloads\"
$blobName      = "demo-file.txt"
$fileList      = "*.png"
$pipelineList  = "louis*"
$maxCount      = 10

#Download a single named blob
Get-AzStorageBlobContent -Container $containerName -Blob $blobName -Destination $path -Context $ctx

#Download multiple blobs using the pipeline
Get-AzStorageBlob -Container $containerName -Blob $fileList -Context $ctx | Get-AzStorageBlobContent

#Use wildcard to download blobs from all containers
Get-AzStorageContainer -MaxCount $maxCount `
     -Context $ctx | Get-AzStorageBlob `
     -Blob "louis*" | Get-AzStorageBlobContent

結果には、ストレージ アカウントとコンテナー名が表示され、ダウンロードされたファイルの一覧が表示されます。

   AccountName: demostorageaccount, ContainerName: demo-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
demo-file.txt        BlockBlob  222     application/octet-stream 2021-12-14 01:38:03Z  Unknown     False
hello-world.png      BlockBlob  14709   application/octet-stream 2021-12-14 01:38:03Z  Unknown     False
hello-world2.png     BlockBlob  12472   application/octet-stream 2021-12-14 01:38:03Z  Unknown     False
hello-world3.png     BlockBlob  13537   application/octet-stream 2021-12-14 01:38:03Z  Unknown     False

   AccountName: demostorageaccount, ContainerName: public-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
louis-armstrong.jpg  BlockBlob  211482  image/jpeg               2021-12-14 18:56:03Z  Unknown     False

   AccountName: demostorageaccount, ContainerName: read-only-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
louis-jordan.jpg     BlockBlob  55766   image/jpeg               2021-12-14 18:56:21Z  Unknown     False

   AccountName: demostorageaccount, ContainerName: hidden-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
louis-prima.jpg      BlockBlob  290651  image/jpeg               2021-12-14 18:56:45Z  Unknown     False

BLOB プロパティとメタデータの管理

コンテナーでは、システム プロパティとユーザー定義メタデータの両方が公開されます。 システム プロパティは、各 BLOB ストレージ リソース上に存在します。 プロパティによって、読み取り専用のものもあれば、読み取りと設定の両方が可能なものもあります。 内部的に言うと、一部のシステム プロパティは、特定の標準 HTTP ヘッダーにマップされています。

ユーザー定義メタデータは、BLOB ストレージ リソースに対して指定された、1 つ以上の名前と値のペアで構成されます。 メタデータを使用すると、これらの値をリソースと一緒に格納できます。 メタデータ値は独自の目的にのみ使用され、リソースの動作には影響しません。

BLOB プロパティの読み取り

BLOB のプロパティまたはメタデータを読み取る場合は、まずサービスから BLOB を取得する必要があります。 Get-AzStorageBlob コマンドレットを使用して BLOB のプロパティとメタデータを取得しますが、その内容は取得しません。 次に、BlobClient.GetProperties メソッドを使用して、BLOB のプロパティを取り込みます。 すると、プロパティまたはメタデータを必要に応じて読み取りまたは設定できます。

次の例では、BLOB を取得し、そのプロパティを一覧表示します。

$blob = Get-AzStorageBlob -Blob "blue-moon.mp3" -Container "mycontainer" -Context $ctx
$properties = $blob.BlobClient.GetProperties()
Echo $properties.Value

結果には、次の例に示すように BLOB のプロパティの一覧が表示されます。

LastModified                         : 11/16/2021 3:42:07 PM +00:00
CreatedOn                            : 11/16/2021 3:42:07 PM +00:00
Metadata                             : {}
BlobType                             : Block
LeaseDuration                        : Infinite
LeaseState                           : Available
LeaseStatus                          : Unlocked
ContentLength                        : 2163298
ContentType                          : audio/mpeg
ETag                                 : 0x8D9C0AA9E0CBA78
IsServerEncrypted                    : True
AccessTier                           : Cool
IsLatestVersion                      : False
TagCount                             : 0
ExpiresOn                            : 1/1/0001 12:00:00 AM +00:00
LastAccessed                         : 1/1/0001 12:00:00 AM +00:00
HasLegalHold                         : False

BLOB メタデータの読み取りおよび書き込み

BLOB メタデータは、BLOB に関連付けられている名前と値のペアのオプションのセットです。 前の例に示すように、最初は BLOB に関連付けられているメタデータはありませんが、必要に応じて追加できます。 BLOB メタデータを更新するには、BlobClient.UpdateMetadata メソッドを使用します。 このメソッドでは、汎用の IDictionary オブジェクトに格納されているキーと値のペアのみが受け付けられます。 詳細については、BlobClient クラスの定義を参照してください。

次の例では、BLOB のメタデータを最初に更新し、コミットしてから、それを取得します。 サンプルの BLOB はメモリからフラッシュされ、メタデータがメモリ内オブジェクトから読み取られないようにします。

#Set variable
$container = "mycontainer"
$blobName  = "blue-moon.mp3"

#Retrieve blob
$blob = Get-AzStorageBlob -Blob $blobName -Container $container -Context $ctx

#Create IDictionary, add key-value metadata pairs to IDictionary
$metadata = New-Object System.Collections.Generic.Dictionary"[String,String]"
$metadata.Add("YearWritten","1934")
$metadata.Add("YearRecorded","1958")
$metadata.Add("Composer","Richard Rogers")
$metadata.Add("Lyricist","Lorenz Hart")
$metadata.Add("Artist","Tony Bennett")

#Update metadata
$blob.BlobClient.SetMetadata($metadata, $null)

#Flush blob from memory, retrieve updated blob, retrieve properties
$blob = $null
$blob = Get-AzStorageBlob -Blob $blobName -Container $container -Context $ctx
$properties = $blob.BlobClient.GetProperties()
 
#Display metadata
Echo $properties.Value.Metadata

次の例に示すように、BLOB の新しく更新されたメタデータが結果で返されます。

Key          Value         
---          -----         
YearWritten  1934          
YearRecorded 1958          
Composer     Richard Rogers
Lyricist     Lorenz Hart   
Artist       Tony Bennett

BLOB のコピー操作

さまざまな種類の BLOB をコピーできる多くのシナリオがあります。 この記事の例は、ブロック BLOB に限定されています。

コピー元 BLOB をコピー先 BLOB にコピーする

同じストレージ アカウント内の簡単なコピー操作の場合は、Copy-AzStorageBlob コマンドレットを使用します。 この操作は同じストレージ アカウント内の BLOB をコピーする操作であるため、同期操作です。 クロスアカウント操作は非同期です。

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

次の例では、bannerphoto.png BLOB を photos コンテナーから archive コンテナー内の photos フォルダーにコピーします。 両方のコンテナーが同じストレージ アカウント内に存在します。 結果では、コピー操作の成功が確認されます。

$blobname = "bannerphoto.png"
Copy-AzStorageBlob -SrcContainer "photos" `
     -SrcBlob $blobname -DestContainer "archive" `
     -DestBlob $("photos/$blobname") -Context $ctx

AccountName: demostorageaccount, ContainerName: archive

Name                BlobType   Length  ContentType  LastModified          AccessTier  IsDeleted  VersionId
----                --------   ------  -----------  ------------          ----------  ---------  ---------
photos/bannerphoto  BlockBlob  12472   image/png    2021-11-27 23:11:43Z  Cool        False

-Force パラメーターを使用して、コピー先で既存の BLOB を同じ名前で上書きできます。 この操作は、コピー先の BLOB を実質的に置き換える操作です。 さらにこの操作では、コミットされていないブロックはすべて削除され、コピー先 BLOB のメタデータが上書きされます。

スナップショットを別の名前でコピー先 BLOB にコピーする

結果として得られるコピー先 BLOB は書き込み可能な BLOB であり、スナップショットではありません。

コピー操作のコピー元 BLOB にできるのは、ブロック BLOB、アペンド BLOB、ページ BLOB、またはスナップショットです。 コピー先 BLOB が既に存在する場合、コピー元 BLOB と同じ BLOB の種類である必要があります。 既存のコピー先 BLOB は上書きされます。

コピー操作の進行中は、コピー先 BLOB を変更できません。 コピー先 BLOB には、未完了のコピー操作は 1 つしか存在できません。 言い換えると、1 つの BLOB を、複数の保留中のコピー操作のコピー先にすることはできません。

同じストレージ アカウント内で BLOB をコピーすると、同期操作になります。 クロスアカウントのコピー操作は非同期です。

常に、コピー元の BLOB またはファイル全体がコピーされます。 バイト範囲またはブロックのセットのコピーはサポートされていません。

BLOB がコピーされると、そのシステム プロパティが同じ値でコピー先 BLOB にコピーされます。

また、非同期のコピー操作を中止する方法も示します。

スナップショット BLOB

スナップショットは、ある時点で作成された読み取り専用の BLOB です。 BLOB スナップショットはベース BLOB と同じですが、DateTime 値が URI に追加される点が異なります。 この値は、スナップショットが作成された時刻を示し、ベース BLOB とスナップショットの唯一の違いを提供します。

ベース BLOB に関連付けられているリースはスナップショットに影響しません。 スナップショットでリースを取得することはできません。 詳細については、「BLOB スナップショット」を参照してください。

次のサンプル コードは、ストレージ コンテナーから BLOB を取得し、そのスナップショットを作成します。

$blob = Get-AzStorageBlob -Container "manuscripts" -Blob "novels/fast-cars.docx" -Context $ctx
$blob.BlobClient.CreateSnapshot()

BLOB レベルの設定

BLOB の層を変更するときは、その BLOB とそのすべてのデータをターゲット層に移動します。 変更を加えるには、Get-AzStorageBlob コマンドレットを使用して BLOB を取得し、BlobClient.SetAccessTier メソッドを呼び出します。 この方法は、ホットクールアーカイブの間で層を変更するために使用できます。

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

次のサンプル コードでは、archive コンテナー内のすべての BLOB の層をホットに設定します。

$blobs = Get-AzStorageBlob -Container archive -Context $ctx
Foreach($blob in $blobs) {
    $blob.BlobClient.SetAccessTier("Hot")
}

BLOB タグを使用した操作

BLOB インデックス タグを使用すると、データの管理と検出が簡単になります。 BLOB インデックス タグは、BLOB に適用できるユーザー定義のキーと値のインデックス属性です。 構成後は、個々のコンテナー内またはすべてのコンテナー間でオブジェクトを分類して検索できます。 BLOB リソースは、そのインデックス タグを更新することで、コンテナー編成を変更することなく動的に分類できます。 インデックス タグにより、変化するデータ要件に柔軟に対応できます。 メタデータ タグとインデックス タグの両方を同時に使用できます。 インデックス タグの詳細については、「BLOB インデックス タグを使用して Azure BLOB データを管理および検索する」を参照してください。

次の例では、BLOB インデックス タグを一連の BLOB に追加する方法を示しています。 この例では、XML ファイルからデータを読み取り、それを使用して複数の BLOB にインデックス タグを作成します。 サンプル コードを使用するには、C:\temp ディレクトリにローカルの blob-list.xml ファイルを作成します。 次の例に XML データを示します。

<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>

このサンプル コードではハッシュ テーブルを作成し、そのテーブルに $tags 変数を割り当てます。 次に、Get-ContentGet-Data のコマンドレットを使用して、XML 構造に基づいてオブジェクトを作成します。 次に、タグ値として使用するキーと値のペアをハッシュ テーブルに追加します。 最後に、XML オブジェクトを繰り返し処理し、各 File ノードのタグを作成します。

#Set variables
$filePath = "C:\temp\blob-list.xml"
$tags     = @{}

#Get data, set tag key-values
[xml]$data = Get-Content -Path $filepath
$tags.Add("VenueName", $data.Venue.Name)
$tags.Add("VenueType", $data.Venue.Type)
 
#Loop through files and add tag
$data.Venue.Files.ChildNodes | ForEach-Object {
    #break the path: container name, blob
    $path = $_.Path -split "/",2
   
    #set apply the blob tags
    Set-AzStorageBlobTag -Container $location[0] -Blob $location[1] -Tag $tags -Context $ctx
 }

BLOB を削除する

Remove-AzStorageBlob コマンドレットを使用して、1 つの BLOB または一連の BLOB を削除できます。 複数の BLOB を削除する場合は、次の例に示すように、条件演算、ループ、または PowerShell パイプラインを利用できます。

警告

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

#Create variables
$containerName  = "mycontainer"
$blobName       = "demo-file.txt"
$prefixName     = "file"

#Delete a single, named blob
Remove-AzStorageBlob -Blob $blobName -Container $containerName -Context $ctx

#Iterate a loop, deleting blobs
for ($i = 1; $i -le 3; $i++) { 
    Remove-AzStorageBlob -Blob (-join($prefixName, $i, ".txt")) -Container $containerName -Context $ctx
} 

#Retrieve blob list, delete using a pipeline
Get-AzStorageBlob -Prefix $prefixName -Container $containerName -Context $ctx | Remove-AzStorageBlob

場合によっては、削除された BLOB を取得できます。 ストレージ アカウントの論理的な削除のデータ保護オプションが有効になっている場合、-IncludeDeleted パラメーターを指定すると、関連付けられた保持期間中に削除された BLOB が返されます。 論理的な削除の詳細については、「BLOB の論理的な削除」の記事を参照してください。

次の例を使用して、コンテナーに関連付けられている保持期間中に削除された BLOB の一覧を取得します。 結果には、最近削除された BLOB の一覧が表示されます。

#Retrieve a list of blobs including those recently deleted
Get-AzStorageBlob -Prefix $prefixName -IncludeDeleted -Context $ctx

AccountName: demostorageaccount, ContainerName: demo-container

Name       BlobType   Length  ContentType                LastModified          AccessTier    IsDeleted
----       --------   ------  -----------                ------------          ----------    ---------
file.txt   BlockBlob  22      application/octet-stream   2021-12-16 20:59:41Z  Cool          True
file2.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:24Z  Cool          True
file3.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:24Z  Cool          True
file4.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:25Z  Cool          True

削除された BLOB を復元する

BLOB を一覧表示する」セクションで説明したように、ストレージ アカウントで論理的な削除のデータ保護オプションを構成できます。 有効になっていると、関連付けられた保持期間内は、削除されたコンテナーを復元することが可能です。 各個の復旧や復元のために、バージョン管理を使用して以前のバージョンの BLOB を管理することもできます。

BLOB のバージョン管理と BLOB の論理的な削除の両方が有効になっている場合、BLOB を上書き、削除、または復元すると自動的に新しいバージョンが作成されます。 削除された BLOB の復元に使用する方法は、ストレージ アカウントに対してバージョン管理が有効になっているかどうかによって決まります。

次のサンプル コードを実行すると、論理的に削除されたすべての BLOB が復元され、バージョン管理が有効になっている場合は最新バージョンの BLOB が復元されます。 最初に Get-AzStorageBlobServiceProperty コマンドレットによって、バージョン管理が有効になっているかどうかが特定されます。

バージョン管理が有効になっている場合は、Get-AzStorageBlob コマンドレットによって、一意の名前が付けられているすべての BLOB バージョンの一覧が取得されます。 次に、一覧にある BLOB バージョンが取得されて、日付順に並べ替えられます。 LatestVersion 属性値を持つバージョンが見つからない場合は、Copy-AzBlob コマンドレットを使用して最新バージョンのアクティブなコピーが作成されます。

バージョン管理が無効になっている場合は、BlobBaseClient.Undelete メソッドを使用して、コンテナー内の、論理的に削除されたそれぞれの BLOB が復元されます。

この例に従う前に、お使いのストレージ アカウントのうち少なくとも 1 つに対して、論理的な削除またはバージョン管理を有効にしておく必要があります。

重要

次の例では、BLOB のグループを列挙し、それらを処理前にメモリに格納します。 バージョン管理が有効になっている場合、BLOB も並べ替えられます。 -ContinuationToken パラメーターを $maxCount 変数と共に使用すると、リソースを節約するためにグループ内の BLOB の数が制限されます。 コンテナーに何百万もの BLOB がある場合、そのためのコストが非常に高くなります。 $maxCount 変数の値は調整できますが、コンテナーに何百万もの BLOB がある場合は、スクリプトでの BLOB の処理に時間がかかります。

論理的な削除のデータ保護オプションの詳細については、「BLOB の論理的な削除」の記事を参照してください。

$accountName   ="myStorageAccount"
$groupName     ="myResourceGroup"
$containerName ="mycontainer"
$maxCount      = 1000
$token         = $null


$blobSvc = Get-AzStorageBlobServiceProperty `
    -StorageAccountName $accountName `
    -ResourceGroupName $groupName

# If soft delete is enabled
if($blobSvc.DeleteRetentionPolicy.Enabled)
{
    # If versioning is enabled
    if($blobSvc.IsVersioningEnabled -eq $true)
    {
        # Set context
        $ctx = New-AzStorageContext `
            -StorageAccountName $accountName `
            -UseConnectedAccount
        do
        {
            # Get all blobs and versions using -Unique 
            # to avoid processing duplicates/versions
            $blobs = Get-AzStorageBlob `
                -Container $containerName `
                -Context $ctx -IncludeVersion | `
                    Where-Object {$_.VersionId -ne $null} | `
                    Sort-Object -Property Name -Unique

            # Iterate the collection
            foreach ($blob in $blobs)
            {
                # Process versions
                if($blob.VersionId -ne $null)
                {
            
                    # Get all versions of the blob, newest to oldest
                    $delBlob = Get-AzStorageBlob `
                        -Container $containerName `
                        -Context $ctx `
                        -Prefix $blob.Name `
                        -IncludeDeleted -IncludeVersion  | `
                            Sort-Object -Property VersionId -Descending

                    # Verify that the newest version is NOT the latest (that the version is "deleted")
                    if (-Not $delBlob[0].IsLatestVersion)
                    {
                        $delBlob[0] | Copy-AzStorageBlob `
                            -DestContainer $containerName `
                            -DestBlob $delBlob[0].Name
                    }
                
                    #Dispose the temporary object
                    $delBlob = $null
                }
            }
            $token = $blobs[$blobs.Count -1].ContinuationToken;
        }
        while ($null -ne $token)
    }

    # Otherwise (if versioning is disabled)
    else
    {
        $blobs = Get-AzStorageBlob `
            -Container $containerName `
            -Context $ctx -IncludeDeleted | `
                Where-Object {$_.IsDeleted}
        foreach($blob in $blobs)
        {
            if($blob.IsDeleted) { $blob.BlobBaseClient.Undelete() }
        }
    }
}
else
{
    echo "Sorry, the delete retention policy is not enabled."
}

次のステップ