PowerShell を使用してコンテナーを管理する

Azure Blob Storage では、大量の非構造化オブジェクト データを格納できます。 BLOB ストレージは、メディア、コンテンツ、またはアプリケーション データを収集したり、ユーザーに公開したりするために使用できます。 すべての BLOB データはコンテナー内に格納されるため、データのアップロードを開始する前に、ストレージ コンテナーを作成する必要があります。 BLOB ストレージの詳細については、「Azure BLOB ストレージの概要」を参照してください。

このハウツー記事では、個々のストレージ コンテナー オブジェクトと複数のストレージ コンテナー オブジェクトの両方の操作方法について説明しています。

前提条件

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

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

この記事の例を使用するには、まず Azure サブスクリプションの承認を取得する必要があります。 認可は、Microsoft Entra アカウントによる認証か、共有キーを使用して行うことができます。 この記事の例では、Microsoft Entra 認証とコンテキスト オブジェクトを組み合わせて使用しています。 コンテキスト オブジェクトを使用することで、Microsoft Entra の資格情報がカプセル化され、後続のデータ操作時にそれらが渡されるようになるので、再認証する必要がなくなります。

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

# Connect to your Azure subscription
 Connect-AzAccount

接続が確立されたら、New-AzStorageContext コマンドレットを呼び出してストレージ アカウント コンテキストを作成します。 -UseConnectedAccount パラメーターを含めて、データ操作が自分の Microsoft Entra 資格情報を使って実行されるようにしてください。

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

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

コンテナーの作成

PowerShell を使ってコンテナーを作成するには、New-AzStorageContainer コマンドレットを呼び出します。 1 つのストレージ アカウント内で作成できる BLOB やコンテナーの数に制限はありません。 コンテナーを、他のコンテナー内で入れ子にすることはできません。

次の例は、New-AzStorageContainer コマンドレットを使用して BLOB コンテナーを作成するための、3 つのオプションを示したものです。 1 つ目のアプローチは、単一のコンテナーを作成するものです。残りの 2 つのアプローチは、PowerShell 操作を利用してコンテナーの作成を自動化するものです。

この例を使用するには、変数の値を指定し、Azure サブスクリプションへの接続が作成されていることを確認する必要があります。 角かっこ内のプレースホルダー値を独自の値で置き換えてください。

# Create variables
 $containerName  = "individual-container"
 $prefixName     = "loop"

# Approach 1: Create a container
 New-AzStorageContainer -Name $containerName -Context $ctx

# Approach 2: Create containers with a PowerShell loop
 for ($i = 1; $i -le 3; $i++) { 
     New-AzStorageContainer -Name (-join($prefixName, $i)) -Context $ctx
    } 

# Approach 3: Create containers using the PowerShell Split method
 "$($prefixName)4 $($prefixName)5 $($prefixName)6".split() | New-AzStorageContainer -Context $ctx

結果の出力には、ストレージ アカウントの名前と、作成された新規コンテナーが表示されます。

Storage Account Name: demostorageaccount

Name                   PublicAccess   LastModified
----                   ------------   ------------
individual-container   Off            11/2/2021 4:09:05 AM +00:00
loop-container1        Off            11/2/2021 4:09:05 AM +00:00
loop-container2        Off            11/2/2021 4:09:05 AM +00:00
loop-container3        Off            11/2/2021 4:09:05 AM +00:00           
loop-container4        Off            11/2/2021 4:09:05 AM +00:00           
loop-container5        Off            11/2/2021 4:09:05 AM +00:00           
loop-container6        Off            11/2/2021 4:09:05 AM +00:00          

コンテナーの一覧表示

ストレージ コンテナーを取得するには、Get-AzStorageContainer コマンドレットを使用します。 1 つのコンテナーを取得するには、-Name パラメーターを含めます。 指定された文字列で始まるコンテナーの一覧を返すには、-Prefix パラメーターの値を指定します。

次の例では、個々のコンテナーと、コンテナー リソースの一覧の両方を取得しています。

# Create variables
 $containerName  = "individual-container"
 $prefixName     = "loop-"

# Approach 1: Retrieve an individual container
 Get-AzStorageContainer -Name $containerName -Context $ctx
 Write-Host

# Approach 2: Retrieve a list of containers
 Get-AzStorageContainer -Prefix $prefixName -Context $ctx

結果の出力には、BLOB エンドポイントの URI が示され、名前とプレフィックスによって取得されたコンテナーの一覧が表示されます。

   Storage Account Name: demostorageaccount

Name                 PublicAccess         LastModified                   IsDeleted  VersionId        
----                 ------------         ------------                   ---------  ---------        
individual-container                      11/2/2021 5:52:08 PM +00:00                                

loop-container1                           11/2/2021 12:22:00 AM +00:00                               
loop-container2                           11/2/2021 12:22:00 AM +00:00                               

loop-container1                           11/2/2021 12:22:00 AM +00:00                               
loop-container2                           11/2/2021 12:22:00 AM +00:00
loop-container3                           11/2/2021 12:22:00 AM +00:00   True       01D7E7129FDBD7D4
loop-container4                           11/2/2021 12:22:00 AM +00:00   True       01D7E8A5EF01C787 

コンテナーのプロパティとメタデータを読み取る

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

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

コンテナーのプロパティ

次の例では、demo プレフィックスを持つすべてのコンテナーを取得し、それらを反復処理して、プロパティを一覧表示しています。

# Create variable
 $prefix = "loop"

# Get containers
 $containers = Get-AzStorageContainer -Prefix $prefix -Context $ctx

# Iterate containers, display properties
 Foreach ($container in $containers) 
 {
    $containerProperties = $container.BlobContainerClient.GetProperties()
    Write-Host $container.Name "properties:"
    $containerProperties.Value
 }

結果の出力には、プレフィックス loop を含むすべてのコンテナーが表示され、そのプロパティが一覧表示されます。

loop-container1 properties:

LastModified                      : 12/7/2021 7:47:17 PM +00:00
LeaseStatus                       : Unlocked
LeaseState                        : Available
LeaseDuration                     : Infinite
PublicAccess                      : 
HasImmutabilityPolicy             : False
HasLegalHold                      : False
DefaultEncryptionScope            : $account-encryption-key
PreventEncryptionScopeOverride    : False
DeletedOn                         : 
RemainingRetentionDays            : 
ETag                              : 0x8D9B9BA602806DA
Metadata                          : {}
HasImmutableStorageWithVersioning : False

loop-container2 properties:
LastModified                      : 12/7/2021 7:47:18 PM +00:00
LeaseStatus                       : Unlocked
LeaseState                        : Available
LeaseDuration                     : Infinite
PublicAccess                      : 
HasImmutabilityPolicy             : False
HasLegalHold                      : False
DefaultEncryptionScope            : $account-encryption-key
PreventEncryptionScopeOverride    : False
DeletedOn                         : 
RemainingRetentionDays            : 
ETag                              : 0x8D9B9BA605996AE
Metadata                          : {}
HasImmutableStorageWithVersioning : False

コンテナー メタデータの読み取りと書き込み

ストレージ アカウント内に何千ものオブジェクトがある場合、ユーザーはメタデータに基づいて特定のコンテナーをすばやく検索できます。 メタデータにアクセスするには、BlobContainerClient オブジェクトを使用します。 このオブジェクトを使用すると、コンテナーとその BLOB にアクセスし、それらを操作できます。 メタデータを更新するには、SetMetadata() メソッドを呼び出す必要があります。 このメソッドでは、汎用の IDictionary オブジェクトに格納されているキーと値のペアのみが受け付けられます。 詳細については、BlobContainerClient クラスを参照してください

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

# Create variable
  $containerName = "individual-container"

# Retrieve container
 $container = Get-AzStorageContainer -Name $containerName -Context $ctx

# Create IDictionary, add key-value metadata pairs to IDictionary
 $metadata = New-Object System.Collections.Generic.Dictionary"[String,String]"
 $metadata.Add("CustomerName","Anthony Bennedetto")
 $metadata.Add("CustomerDOB","08/03/1926")
 $metadata.Add("CustomerBirthplace","Long Island City")

# Update metadata
  $container.BlobContainerClient.SetMetadata($metadata, $null)

# Flush container from memory, retrieve updated container
 $container = $null
 $container = Get-AzStorageContainer -Name $containerName -Context $ctx
 
# Display metadata
 $properties = $container.BlobContainerClient.GetProperties()
 Write-Host $container.Name "metadata:" 
 Write-Host $properties.Value.Metadata

結果の出力には、コンテナーの完全なメタデータが表示されます。

individual-container metadata:

[CustomerName, Anthony Bennedetto] [CustomerDOB, 08/03/1926] [CustomerBirthplace, Long Island City]

コンテナーの Shared Access Signature を取得する

Shared Access Signature (SAS) を使用すると、Azure リソースへの委任アクセスが可能になります。 SAS を使用することで、クライアントがデータにアクセスする方法をきめ細かく制御できます。 たとえば、クライアントがどのリソースにアクセスできるかを指定することもできます。 また、クライアントが実行できる操作の種類を制限したり、アクションを実行できる時間を指定したりすることもできます。

SAS は、通常ならアクセス許可を持たないクライアントに対し、一時的かつ安全なアクセスを提供するために、広く使用されます。 たとえば、自分のストレージ アカウントに対し、他のユーザーがデータの読み書きを行えるようにしたいような場合に使用できます。

Azure Storage では、3 つの種類の Shared Access Signature がサポートされています。ユーザー委任、サービス、およびアカウント SAS です。 Shared Access Signature の詳細については、コンテナー用または BLOB 用のサービス SAS の作成に関する記事を参照してください。

注意

有効な SAS を所有するすべてのクライアントは、その SAS で許可されているストレージ アカウントのデータにアクセスできます。 SAS を悪意のある、または意図しない用途から保護することが重要です。 SAS の配布は慎重に行い、侵害された SAS を失効させるための計画を用意しておいてください。

次の例は、New-AzStorageContainerSASToken コマンドレットを使用して、特定のコンテナーに対するサービス SAS を構成するプロセスを示したものです。 この例では、開始時間と有効期限、およびプロトコルを使用して SAS を構成しています。 また、-Permission パラメーターを使用して、SAS での読み取り書き込み、および一覧表示のアクセス許可を指定しています。 アクセス許可の完全な表については、サービス SAS の作成に関する記事を参照してください。

# Create variables
 $accountName   = "<storage-account>"
 $containerName = "individual-container"
 $startTime     = Get-Date
 $expiryTime    = $startTime.AddDays(7)
 $permissions   = "rwl"
 $protocol      = "HttpsOnly"

# Create a context object using Azure AD credentials, retrieve container
 $ctx = New-AzStorageContext -StorageAccountName $accountName -UseConnectedAccount
 
# Approach 1: Generate SAS token for a specific container
 $sas = New-AzStorageContainerSASToken `
 -Context $ctx `
 -Name $containerName `
 -StartTime $startTime `
 -ExpiryTime $expiryTime `
 -Permission $permissions `
 -Protocol $protocol

# Approach 2: Generate SAS tokens for a container list using pipeline
  Get-AzStorageContainer -Container $filterName -Context $ctx | New-AzStorageContainerSASToken `
 -Context $ctx `
 -StartTime $startTime `
 -ExpiryTime $expiryTime `
 -Permission $permissions `
 -Protocol $protocol | Write-Output

Note

Blob Storage から返される SAS トークンには、URL クエリ文字列の区切り文字 ('?') が含まれていません。 SAS トークンをリソース URL に追加する場合は、必ず区切り文字も追加してください。

コンテナーを削除する

ユース ケースによっては、Remove-AzStorageContainer コマンドレットを使用して、1 つまたは複数のコンテナーを削除することができます。 複数のコンテナーを削除する場合は、次の例に示すように、条件演算、ループ、または PowerShell パイプラインを利用できます。

# Create variables
 $accountName    = "<storage-account>"
 $containerName  = "individual-container"
 $prefixName     = "loop-"

# Delete a single named container
 Remove-AzStorageContainer -Name $containerName -Context $ctx

# Iterate a loop, deleting containers
 for ($i = 1; $i -le 2; $i++) { 
     Remove-AzStorageContainer -Name (-join($containerPrefix, $i)) -Context $ctx
    } 

# Retrieve container list, delete using a pipeline
 Get-AzStorageContainer -Prefix $prefixName -Context $ctx | Remove-AzStorageContainer

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

次の例を実行すると、ストリート アカウントに関連付けられている保持期間中に削除されたコンテナーの一覧が取得されます。

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

論理的に削除されたコンテナーを復元する

コンテナーの一覧表示」セクションで説明したように、ストレージ アカウントでは、論理的な削除によるデータ保護オプションを構成することができます。 これを有効にすると、関連付けられた保持期間中に削除されたコンテナーを復元することが可能になります。

次の例は、Restore-AzStorageContainer コマンドレットを使用して、論理的に削除されたコンテナーを復元する方法を示したものです。 この例を使用するには、まず論理的な削除を有効にして、少なくとも 1 つのストレージ アカウントでそのオプションを構成する必要があります。

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

# Create variables
 $accountName = "<storage-account>"
 $prefixName  = "loop-"

# Create a context object using Azure AD credentials
 $ctx = New-AzStorageContext -StorageAccountName $accountName -UseConnectedAccount

# Retrieve all containers, filter deleted containers, restore deleted containers
 Get-AzStorageContainer -Prefix $prefixName -IncludeDeleted `
    -Context $ctx | ? { $_.IsDeleted } | Restore-AzStorageContainer

結果の出力には、プレフィックス demo を含むコンテナーのうち、復元されたものがすべて表示されます。

    Storage Account Name: demostorageaccount

Name                 PublicAccess         LastModified                   IsDeleted  VersionId        
----                 ------------         ------------                   ---------  ---------        
loop-container3                                                                                       
loop-container4               

関連項目