演练 - 使用 ASP.NET Core 应用管理分层存储

已完成

你现在将测试一些示例 .NET 代码,检索和修改某些示例 Azure 存储 blob 的层级别。 你将创建新的 BlobStorage 帐户,并将帐户设置为“冷”。 然后上传一些数据,使用应用修改存储层。

下载代码和示例数据

在此第一步中,将源代码和示例数据下载到 Cloud Shell 存储。

  1. 在 Cloud Shell 中运行以下命令,将源代码和示例数据下载到 Cloud Shell 存储中的 storageapp 文件夹:

    git clone https://github.com/MicrosoftDocs/mslearn-optimize-blob-storage-costs storageapp
    cd storageapp
    

使用 CLI 新建 Blob 存储帐户

现在将新建 BlobStorage 帐户,并检索帐户存储密钥。

  1. 在 Cloud Shell 中运行以下命令,新建访问层设置为“冷”的 BlobStorage 帐户。 将以下代码中的 <random string> 替换为字母或数字字符串:

    export RESOURCE_GROUP=<rgn>[sandbox resource group name]</rgn>
    
    export AZURE_STORAGE_ACCOUNT=<random string>storageaccount
    
    az storage account create \
        --resource-group $RESOURCE_GROUP \
        --name $AZURE_STORAGE_ACCOUNT \
        --kind BlobStorage \
        --access-tier Cool
    
  2. 在 Cloud Shell 中运行以下命令,检索帐户存储密钥,并将其存储在变量中:

    export AZURE_STORAGE_KEY=`az storage account keys list -g $RESOURCE_GROUP -n $AZURE_STORAGE_ACCOUNT --query [0].value --output tsv`
    

创建容器和上传数据

在本步骤中,你将创建一个 blob 容器和三个 blob,每个都包含一些示例数据。

  1. 在 Cloud Shell 中运行以下命令,新建容器:

    az storage container create \
        --name blobcontainer \
        --account-name $AZURE_STORAGE_ACCOUNT \
        --account-key $AZURE_STORAGE_KEY
    
  2. 在 Cloud Shell 中使用示例数据对 blob 运行以下命令:

    cd ManageStorageTiers
    az storage blob upload --file testdata.txt --container-name blobcontainer --name blob1
    az storage blob upload --file testdata.txt --container-name blobcontainer --name blob2
    az storage blob upload --file testdata.txt --container-name blobcontainer --name blob3
    

设置每个 blob 的层

在本步骤中,你将设置每个 blob 的访问层。

  1. 在 Cloud Shell 中运行以下命令,将 blob1 设置为“存档”:

    az storage blob set-tier \
        --container-name blobcontainer \
        --name blob1 \
        --tier Archive
    
  2. 在 Cloud Shell 中运行以下命令,将 blob2 设置为“冷”:

    az storage blob set-tier \
        --container-name blobcontainer \
        --name blob2 \
        --tier Cool
    
  3. 在 Cloud Shell 中运行以下命令,将 blob3 设置为“热”:

    az storage blob set-tier \
        --container-name blobcontainer \
        --name blob3 \
        --tier Hot
    

使用代码管理存储层

现在可以部署和测试一些代码。 首先,设置示例应用所需的环境变量。 然后构建并运行示例应用(忽略关于 Microsoft.Azure.KeyVault.Core 的警告)。

  1. 在 Cloud Shell 中运行以下命令,存储应用所用的环境变量:

    export STORAGE_CONNECTION_STRING=`az storage account show-connection-string -g $RESOURCE_GROUP -n $AZURE_STORAGE_ACCOUNT --output tsv`
    export CONTAINER_NAME=blobcontainer
    
  2. 在 Cloud Shell 中运行以下命令,构建和运行 ManageStorageTiers 应用:

    cd ManageStorageTiers
    dotnet build
    dotnet run
    
  3. ManageStorageTiers 应用现在连接到 blob 存储,并查询名为 blob1、blob2 和 blob3 的三个 blob。 然后,它会更改所有三个 blob 的存储层,并再次查询每个 blob 的存储层以验证更改。 由于解除冻结延迟,“存档”层将不会更改。

查看应用代码

在此最后一步中,查看 ManageStorageTiers 应用用于管理和更改访问层的代码。

  1. 在 Cloud Shell 中,输入 code .,然后使用编辑器打开 ManageStorageTiers\Program.cs。

  2. 此代码显示容器中所有 Blob 的存储层:

    private static async Task DisplayBlobTiers(BlobContainerClient blobContainerClient)
    {
        AsyncPageable<BlobItem> blobItems = blobContainerClient.GetBlobsAsync();
    
        await foreach (var blobItem in blobItems)
        {
            Console.WriteLine($"  Blob name {blobItem.Name}:   Tier {blobItem.Properties.AccessTier}");
        }
    }
    
  3. 以下方法协同工作,更新容器中一组 Blob 的存储层:

    private static async Task UpdateBlobTiers(BlobContainerClient blobContainerClient)
    {
        AsyncPageable<BlobItem> blobItems = blobContainerClient.GetBlobsAsync();
    
        await foreach (var blobItem in blobItems)
        {
            string blobName = blobItem.Name;
            AccessTier? currentAccessTier = blobItem.Properties.AccessTier;
            AccessTier newAccessTier = GetNewAccessTier(currentAccessTier);
    
            Console.WriteLine($"  Blob name: {blobItem.Name}   Current tier: {currentAccessTier}   New tier: {newAccessTier}");
    
            BlobClient blobClient = blobContainerClient.GetBlobClient(blobItem.Name);
            blobClient.SetAccessTier(newAccessTier);
        }
    }
    
    private static AccessTier GetNewAccessTier(AccessTier? accessTier)
    {
        if (accessTier == AccessTier.Hot)
            return AccessTier.Cool;
        else if (accessTier == AccessTier.Cool)
            return AccessTier.Archive;
        else
            return AccessTier.Hot;
    }