你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 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 命令。以下示例演示了使用命令创建 Blob 容器的 az storage container create 三个选项。 第一种方法创建单个容器,其余两种方法使用 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 命令。

在以下示例中,第一种方法显示单个命名容器的属性。 之后,它会检索具有 演示容器 前缀的所有容器,并循环访问它们,并列出其属性。 请记住将占位符值替换为自己的值。

#!/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 documentation。

下面的第一个示例更新,然后检索命名容器的元数据。 第二个示例遍历与 -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。 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,其中包含开始和到期时间和协议。 它还将使用参数在 SAS 中指定删除读取写入--permissions权限。 可以在 “创建服务 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 存储,请选择下面的选项。