演習 - ASP.NET Core アプリを使用して階層型ストレージを管理する

完了

いくつかのサンプル .NET コードをテストして、Azure Storage 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 コンテナーと 3 つの 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 Storage に接続し、blob1、blob2、blob3 という名前の 3 つの BLOB に対してクエリを実行します。 次に、3 つの 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;
    }