使用 Azure CLI 管理 Blob 容器

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

Azure CLI 是用來管理 Azure 資源的 Azure 跨平台命令列體驗。 您可以在瀏覽器中使用它搭配 Azure Cloud Shell。 您也可以將它安裝在 macOS、Linux 或 Windows 上,然後從本機的命令列執行。

在本操作說明文章中,您將了解如何使用 Azure CLI 搭配 Bash 來使用容器物件。

必要條件

若要存取 Azure 儲存體,您需要有 Azure 訂用帳戶。 如果您還沒有訂用帳戶,請先建立免費帳戶,再開始操作。

對 Azure 儲存體的所有存取都是透過儲存體帳戶進行。 在本快速入門中,使用 Azure 入口網站、Azure PowerShell 或 Azure CLI 建立儲存體帳戶。 如需建立儲存體帳戶的協助,請參閱建立儲存體帳戶

備妥環境以使用 Azure CLI

  • 安裝最新版本的 Azure CLI 一直都是最佳選擇。 如果您是使用 Azure Cloud Shell,就已安裝最新版本。

授與 Blob 儲存體的存取權

您可以使用 Microsoft Entra 認證或使用儲存體帳戶存取金鑰,授權從 Azure CLI 存取 Blob 儲存體。 建議使用 Microsoft Entra 認證,本文的範例只使用 Microsoft Entra ID。

針對 Blob 儲存體的資料作業 Azure CLI 命令可支援 --auth-mode 參數,這可讓您指定如何授權指定的作業。 將 --auth-mode 參數設定為 login,以使用 Microsoft Entra 認證進行授權。 如需詳細資訊,請參閱使用 Azure CLI 授與 Blob 或佇列資料的存取權

執行 login 命令,以開啟瀏覽器並連線到您的 Azure 訂用帳戶。

az login

建立容器

若要使用 Azure CLI 建立容器,請呼叫 az storage container create 命令。下列範例說明使用 az storage container create 命令建立 Blob 容器的三個選項。 第一個方法會建立單一容器,而其餘兩個方法會使用 Bash 指令碼作業來自動建立容器。

若要使用此範例,請提供變數值並確定您已登入。 請記得將括弧中的預留位置值更換成您自己的值。

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container-1"
containerPrefix="demo-container-"

# Approach 1: Create a container
az storage container create \
    --name $containerName \
    --account-name $storageAccount \
    --auth-mode login

# Approach 2: Create containers with a loop
for value in {2..5}
do
    az storage container create \
        --name $containerPrefix$value \
        --account-name $storageAccount \
        --auth-mode login
done

# Approach 3: Create containers by splitting multiple values
containerList="${containerPrefix}6 ${containerPrefix}7 ${containerPrefix}8"
for container in $containerList
do
    az storage container create \
        --name $container \
        --account-name $storageAccount \
        --auth-mode login
done

列出容器

使用 az storage container list 命令以擷取儲存體容器清單。 若要傳回名稱開頭為指定字元字串的容器清單,請將字串當成 --prefix 參數值傳遞。

可以使用 --num-results 參數來限制要求傳回的容器數目。 Azure 儲存體將單一清單作業傳回的容器數目限制為 5000。 這項限制確保擷取可管理的資料量。 如果傳回的容器數目超過 --num-results 值或服務限制,則會傳回接續權杖。 此權杖可讓您使用多個要求來擷取任意數量的容器。

您也可以使用 --query 參數,對命令的結果執行 JMESPath 查詢。 JMESPath 是 JSON 的查詢語言,可讓您選取及修改 CLI 輸出傳回的資料。 查詢要先在 JSON 輸出中執行,然後才能格式化。 如需詳細資訊,請參閱如何使用 JMESPath 查詢來查詢 Azure CLI 的命令輸出

下列範例會先列出容器數目上限 (遵循服務限制)。 接下來,範例會提供 --num-results--prefix 參數,以列出名稱以前置詞 container- 開頭的三個容器。 最後,將已知的容器名稱提供給 --prefix 參數,以列出單一容器。

進一步了解 az storage container list

#!/bin/bash
storageAccount="<storage-account>"
containerPrefix="demo-container-"
containerName="demo-container-1"
numResults="3"

# Approach 1: List maximum containers
az storage container list \
    --account-name $storageAccount \
    --auth-mode login

# Approach 2: List a defined number of named containers
az storage container list \
    --prefix $containerPrefix \
    --num-results $numResults \
    --account-name $storageAccount \
    --auth-mode login

# Approach 3: List an individual container
az storage container list \
    --prefix $containerPrefix \
    --query "[?name=='$containerName']" \
    --account-name $storageAccount \
    --auth-mode login

讀取容器屬性和中繼資料

容器會公開系統屬性和使用者定義的中繼資料。 系統屬性存在於每個 BLOb 儲存體資源上。 有些屬性是唯讀的,有些則可以讀取或設定。 實際上,有些系統屬性會對應至特定的標準 HTTP 標頭。

使用者定義的中繼資料由您為 BLOb 儲存體資源指定的一個或多個名稱/值對所組成。 您可以使用中繼資料來儲存資源的額外值。 中繼資料值僅供您自己使用,並不會影響資源的運作方式。

容器屬性

若要使用 Azure CLI 顯示容器的屬性,請呼叫 az storage container show 命令。

在下列範例中,第一種方法會顯示單一具名容器的屬性。 之後,則會擷取前置詞為 demo-container- 的所有容器,然後逐一查看並列出其屬性。 請記得以您自己的值取代預留位置值。

#!/bin/bash
storageAccount="<storage-account>"
containerPrefix="demo-container-"
containerName="demo-container-1"

# Show a named container's properties
az storage container show \
    --name $containerName \
    --account-name $storageAccount \
    --auth-mode login

# List several containers and show their properties
containerList=$(az storage container list \
    --query "[].name" \
    --prefix $containerPrefix \
    --account-name $storageAccount \
    --auth-mode login \
    --output tsv)

for row in $containerList
do
  tmpRow=$(echo $row | sed -e 's/\r//g')
  az storage container show --name $tmpRow --account-name $storageAccount --auth-mode login
done

讀取和寫入容器中繼資料

在其儲存體帳戶內有數千個物件的使用者,可以根據其中繼資料快速找出特定容器。 若要讀取中繼資料,請使用 az storage container metadata show 命令。 若要更新中繼資料,則必須呼叫 az storage container metadata update 命令。 此方法只接受以空格分隔的機碼值組。 如需詳細資訊,請參閱 az storage container metadata 文件。

下列第一個範例會更新並擷取具名容器的中繼資料。 第二個範例會逐一查看符合 -prefix 值的容器清單。 名稱含有偶數的容器會將其中繼資料設定為 metadata 變數所含的值。

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container-1"
containerPrefix="demo-container-"

# Create metadata string
metadata="key=value pie=delicious"

# Update named container metadata
az storage container metadata update \
    --name $containerName \
    --metadata $metadata \
    --account-name $storageAccount \
    --auth-mode login

# Display metadata
az storage container metadata show \
    --name $containerName \
    --account-name $storageAccount \
    --auth-mode login

# Get list of containers
containerList=$(az storage container list \
    --query "[].name" \
    --prefix $containerPrefix \
    --account-name $storageAccount \
    --auth-mode login \
    --output tsv)

# Update and display metadata
for row in $containerList
do
  #Get the container's number
  tmpName=$(echo $row | sed -e 's/\r//g')
  if [ `expr ${tmpName: ${#containerPrefix}} % 2` == 0 ]
  then
    az storage container metadata update \
        --name $tmpName \
        --metadata $metadata \
        --account-name $storageAccount \
        --auth-mode login
    
    echo $tmpName

    az storage container metadata show \
    --name $tmpName \
    --account-name $storageAccount \
    --auth-mode login    
  fi
done

刪除容器

依據您的使用案例,您可以使用 az storage container delete 命令來刪除單一容器或容器群組。 刪除容器清單時,您必須使用條件式運算,如下列範例所示。

警告

執行下列範例可能會永久刪除容器和 Blob。 Microsoft 建議啟用容器虛刪除,以防止容器和 Blob 遭到意外刪除。 如需詳細資訊,請參閱容器的虛刪除

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container-1"
containerPrefix="demo-container-"

# Delete a single named container
az storage container delete \
    --name $containerName \
    --account-name $storageAccount \
    --auth-mode login

# Delete containers by iterating a loop
list=$(az storage container list \
    --query "[].name" \
    --prefix $containerPrefix \
    --account-name $storageAccount \
    --auth-mode login \
    --output tsv)
for row in $list
do
    tmpName=$(echo $row | sed -e 's/\r//g')
    az storage container delete \
    --name $tmpName \
    --account-name $storageAccount \
    --auth-mode login
done

如果您的儲存體帳戶已啟用容器虛刪除,則可以擷取已刪除的容器。 如果您的儲存體帳戶已啟用「虛刪除資料保護」選項,則 --include-deleted 參數將會傳回在相關保留期限內刪除的容器。 --include-deleted 參數只有在與 --prefix 參數一起使用時,可以用來傳回容器。 若要深入瞭解虛刪除,請參閱容器的虛刪除一文。

使用下列範例來擷取在儲存體帳戶相關保留期間內所刪除的容器清單。

#!/bin/bash
storageAccount="<storage-account>"
containerPrefix="demo-container-"

# Retrieve a list of containers including those recently deleted
az storage container list \
    --prefix $containerPrefix \
    --include-deleted \
    --account-name $storageAccount\
    --auth-mode login

還原遭到虛刪除的容器

列出容器一節所述,您可以在儲存體帳戶中設定 [虛刪除資料保護] 選項。 啟用此選項時,就可以還原在相關保留期限內刪除的容器。 在您遵循這個範例之前,必須先啟用虛刪除,並在至少一個儲存體帳戶中設定此選項。

下列範例說明如何使用 az storage container restore 命令來還原遭到虛刪除的容器。 您必須提供 --name--version 參數的值,確保還原正確版本的容器。 如果您不知道版本號碼,可以使用 az storage container list 命令來擷取,如第一個範例所示。 第二個範例會尋找並還原特定儲存體帳戶內所有已刪除的容器。

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

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container-1"

# Restore an individual named container
containerVersion=$(az storage container list \
    --account-name $storageAccount \
    --query "[?name=='$containerName'].[version]" \
    --auth-mode login \
    --output tsv \
    --include-deleted | sed -e 's/\r//g')

az storage container restore \
    --name $containerName \
    --deleted-version $containerVersion \
    --account-name $storageAccount \
    --auth-mode login

# Restore a list of deleted containers
containerList=$(az storage container list \
    --account-name $storageAccount \
    --include-deleted \
    --auth-mode login \
    --query "[?deleted].{name:name,version:version}" \
    -o json)

for row in $(echo "${containerList}" | jq -c '.[]' )
do
    tmpName=$(echo $row | jq -r '.name')
    tmpVersion=$(echo $row | jq -r '.version')
    az storage container restore \
        --account-name $storageAccount \
        --name $tmpName \
        --deleted-version $tmpVersion \
        --auth-mode login
done

取得容器的共用存取簽章

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

SAS 通常用來提供暫時且安全的存取權給通常沒有使用權限的用戶端。 若要產生服務或帳戶 SAS,您必須提供 --account-name--account-key 參數的值。 此情況的範例就是可以讓使用者將自己的資料讀取和寫入到儲存體帳戶的服務。

Azure 儲存體支援三種類型的共用存取簽章:使用者委派、服務和帳戶 SAS。 如需共用存取簽章的詳細資訊,請參閱使用共用存取簽章對 Azure 儲存體資源授與有限存取權一文。

警告

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

下列範例說明使用 az storage container generate-sas 命令,為特定容器設定服務 SAS 的程序。 因為此範例會產生服務 SAS,所以先擷取儲存體帳戶金鑰以作為 --account-key 值傳遞。

此範例將設定 SAS 的開始和到期時間,以及通訊協定。 此外,也會使用 --permissions 參數,在 SAS 中指定刪除讀取寫入列出權限。 您可以參考建立服務 SAS 一文中的完整使用權限表。

將 Blob SAS 權杖值複製並貼到安全的位置。 這些值只會顯示一次,一旦 Bash 關閉就無法再擷取。 若要建構 SAS URL,請將 SAS 權杖 (URI) 附加至儲存體服務的 URL。

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container-1"
permissions="drwl"
expiry=`date -u -d "30 minutes" '+%Y-%m-%dT%H:%MZ'`

accountKey=$(az storage account keys list \
    --account-name $storageAccount \
    --query "[?permissions == 'FULL'].[value]" \
    --output tsv)

accountKey=$( echo $accountKey | cut -d' ' -f1 )
 
az storage container generate-sas \
    --name $containerName \
    --https-only \
    --permissions dlrw \
    --expiry $expiry \
    --account-key $accountKey \
    --account-name $storageAccount

注意

Azure CLI 傳回的 SAS 權杖不包含 URL 查詢字串的分隔符號字元 ('?')。 如果您要將 SAS 權杖附加至資源 URL,請記得在附加 SAS 權杖之前,先將分隔符號字元附加至資源 URL。

下一步

在此操作說明文章中,您已了解如何管理 Blob 儲存體中的容器。 若要深入了解如何利用 Azure CLI 來使用 Blob 儲存體,請選取下方的選項。