Упражнение. Управление многоуровневым хранилищем с помощью приложений ASP.NET Core

Завершено

Теперь вы протестируете пример кода .NET, который получает и изменяет уровни хранилища для ряда больших двоичных объектов в службе хранилища Azure. Вы создадите новую учетную запись BLOBStorage и задайте для нее значение Cool. Затем вы отправите некоторые данные и используйте приложение для изменения уровней хранилища.

Скачивание кода и примера данных

Сначала нужно скачать исходный код и пример данных в хранилище Cloud Shell.

  1. Выполните следующие команды в Cloud Shell, чтобы скачать исходный код и примеры данных в папку storageapp в хранилище Cloud Shell:

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

Создание учетной записи хранилища BLOB-объектов с помощью CLI

Теперь вы создадите новую учетную запись BLOBStorage и получите ключ хранения учетной записи.

  1. Выполните следующие команды в Cloud Shell, чтобы создать новую учетную запись BLOBStorage, установленную как Cool. Замените <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`
    

Создание контейнера и отправка данных

В этом шаге вы создадите контейнер и три больших двоичных объекта с примером данных в каждом.

  1. В Cloud Shell выполните приведенную ниже команду, чтобы создать контейнер.

    az storage container create \
        --name blobcontainer \
        --account-name $AZURE_STORAGE_ACCOUNT \
        --account-key $AZURE_STORAGE_KEY
    
  2. В Cloud Shell выполните приведенные ниже команды, чтобы создать большие двоичные объекты с примерами данных.

    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
    

Задание уровня для каждого большого двоичного объекта

В этом шаге вы зададите уровень доступа для каждого большого двоичного объекта.

  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. Затем он изменяет уровень хранилища всех трех больших двоичных объектов и запрашивает уровень хранилища каждого большого двоичного объекта еще раз, чтобы проверить изменение. Уровень архива не изменится из-за задержки восстановления.

Просмотр кода приложения

На заключительном этапе вы просмотрите код, используемый приложением ManageStorageTiers для управления уровнями доступа и их изменения.

  1. В Cloud Shell введите code ., а затем используйте редактор, чтобы открыть ManageStorageTiers\Program.cs.

  2. Этот код отображает уровни хранилища для всех больших двоичных объектов в контейнере:

    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. Следующие методы работают вместе для обновления уровня хранилища для набора больших двоичных объектов в контейнере:

    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;
    }