使用 PowerShell 管理 Blob 容器

Azure Blob 儲存體可讓您儲存大量非結構化物件資料。 您可以使用 Blob 儲存體來收集或向使用者公開媒體、內容或應用程式資料。 因為所有 Blob 資料都儲存在容器內,所以您必須先建立儲存體容器,才能開始上傳資料。 若要深入了解 Blob 儲存體,請參閱 Azure Blob 儲存體簡介

此操作說明文章說明如何使用個別和多個儲存體容器物件。

必要條件

您將必須先取得 Azure 訂用帳戶的授權,才能使用本文中的範例。 使用 Microsoft Entra 帳戶或使用共用金鑰進行驗證,便會執行授權。 本文中的範例會使用 Microsoft Entra 驗證搭配內容物件。 內容物件會封裝您的 Microsoft Entra 認證,並在後續的資料作業中傳遞認證,而不需要重新驗證。

若要使用 Microsoft Entra 帳戶登入您的 Azure 帳戶,請開啟 PowerShell 並呼叫 Connect-AzAccount Cmdlet。

# Connect to your Azure subscription
 Connect-AzAccount

建立連線之後,請透過呼叫 New-AzStorageContext Cmdlet 來建立儲存體帳戶內容。 納入 -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 Cmdlet。 可以在儲存體帳戶內建立的 Blob 或容器數目沒有任何限制。 容器無法在其他容器內巢狀化。

下列範例說明使用 New-AzStorageContainer Cmdlet 建立 Blob 容器的三個選項。 第一個方法會建立單一容器,而其餘兩個方法會利用 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 Cmdlet 來擷取儲存體容器。 若要擷取單一容器,請納入 -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 儲存體資源指定的一個或多個名稱/值對所組成。 您可以使用中繼資料來儲存資源的額外值。 中繼資料值僅供您自己使用,並不會影響資源的運作方式。

容器屬性

下列範例會擷取首碼為 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]

取得容器的共用存取簽章

共用存取簽章 (SAS) 提供委派的 Azure 資源存取權。 SAS 可讓您精準控制用戶端存取您資料的方式。 例如,您可以指定可供用戶端使用的資源。 您也可以限制用戶端可以執行的作業類型,並指定可採取動作的時間長度。

SAS 通常用來提供暫時且安全的存取權給通常沒有使用權限的用戶端。 此情況的範例就是可以讓使用者將自己的資料讀取和寫入到儲存體帳戶的服務。

Azure 儲存體支援三種類型的共用存取簽章:使用者委派、服務和帳戶 SAS。 如需共用存取簽章的詳細資訊,請參閱建立容器或 Blob 的服務 SAS 一文。

警告

擁有有效 SAS 的任何用戶端在該 SAS 允許的範圍內,可存取儲存體帳戶中的資料。 保護 SAS 防止遭到惡意使用或誤用至關重要。 在散發 SAS 時請謹慎使用,並備妥方案以撤銷遭盜用的 SAS。

下列範例說明使用 New-AzStorageContainerSASToken Cmdlet,為特定容器設定服務 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

注意

Blob 儲存體傳回的 SAS 權杖不包含 URL 查詢字串的分隔符號字元 ('?')。 如果您要將 SAS 權杖附加至資源 URL,請記得同時附加分隔符號字元。

刪除容器

取決於您的使用案例,您可以使用 Remove-AzStorageContainer Cmdlet 來刪除容器或容器清單。 刪除容器清單時,您可以利用條件式作業、迴圈或 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 Cmdlet 來還原遭到虛刪除的容器。 在您遵循這個範例之前,必須先啟用虛刪除,並在至少一個儲存體帳戶中設定此選項。

若要深入瞭解虛刪除資料保護選項,請參閱容器的虛刪除一文。

# 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               

另請參閱