使用 Azure CLI 管理 Blob 容器

Azure blob 存储允许存储大量非结构化对象数据。 你可以使用 Blob 存储来收集媒体、内容或应用程序数据或者将其公开给用户。 由于所有 blob 数据都存储在容器中,因此必须先创建存储容器,然后才能开始上传数据。 要详细了解 Blob 存储,请参阅 Azure Blob 存储简介

Azure CLI 是 Azure 用于管理 Azure 资源的跨平台命令行体验。 你可以在 macOS、Linux 或 Windows 上安装它,然后通过命令行在本地运行它。

本操作指南文章介绍了如何搭配使用 Azure CLI 与 Bash 来处理容器对象。

先决条件

若要访问 Azure 存储,需要一个 Azure 订阅。 如果还没有订阅,请在开始前创建一个试用版订阅

对 Azure 存储进行的所有访问都要通过存储帐户完成。 对于本快速入门,请使用 Azure 门户、Azure PowerShell 或 Azure CLI 创建存储帐户。 有关如何创建存储帐户的帮助,请参阅创建存储帐户

  • 如需在本地运行 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 一直是一个不错的主意。

授予对 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 参数对命令结果执行 --query。 JMESPath 是 JSON 的查询语言,让用户可以选择和修改从 CLI 输出返回的数据。 先对 JSON 输出执行查询,然后才能设置格式。 有关详细信息,请参阅如何使用 JMESPath 查询查询 Azure CLI 命令输出

以下示例首先列出了最大容器数量(须符号服务限制)。 接下来,通过为 --prefix 参数提供值,它列出了名称以前缀 container- 开头的三个容器。 最后,通过向 --prefix 参数提供已知的容器名称来列出单个容器。

详细了解 AZ 存储容器列表

#!/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 存储容器元数据文档。

下面的第一个示例会更新并检索命名容器的元数据。 第二个示例会循环访问与 -prefix 值匹配的容器列表。 名称包含偶数的容器包含元数据集和元数据变量中包含的值。

#!/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。 Azure 建议启用容器软删除,防止意外删除容器和 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 参数将返回在关联保留期内删除的容器。 与 --prefix 参数一同使用时,--include-deleted 参数只能用于返回容器。 若要详细了解软删除,请参阅容器软删除一文。

使用以下示例检索在存储帐户的关联保留期内删除的容器列表。

#!/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。 它还使用 参数指定 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 存储,请选择下面某个选项。