キャッシュコントロールを追加し、ヘッダーをAzureストレージブロブに有効にします

StackOverflow https://stackoverflow.com/questions/4507657

質問

Azureストレージを使用して静的ファイルブロブを提供しますが、キャッシュコントロールを追加し、帯域幅コストを削減するために提供されるとファイル/ブロブにヘッダーを有効にしたいと思います。

のようなアプリケーション CloudXPlorer そしてセレブラタ クラウドストレージスタジオ コンテナとブロブにメタデータプロパティを設定するオプションを提供しますが、キャッシュ制御を追加しようとすると動揺します。

これらのヘッダーをファイルに設定できるかどうかを知っていますか?

役に立ちましたか?

解決

私は約600kのブロブでバッチジョブを実行しなければなりませんでしたが、本当に役立った2つのことを見つけました。

  1. 同じデータセンターで労働者の役割から操作を実行します。 Azureサービス間の速度は、同じアフィニティグループにある限り、優れています。さらに、データ転送コストはありません。
  2. 操作を並行して実行します。 .NET V4のタスクパラレルライブラリ(TPL)は、これを非常に簡単にします。以下は、コンテナ内のすべてのBLOBのキャッシュコントロールヘッダーを並行して設定するコードです。

    // get the info for every blob in the container
    var blobInfos = cloudBlobContainer.ListBlobs(
        new BlobRequestOptions() { UseFlatBlobListing = true });
    Parallel.ForEach(blobInfos, (blobInfo) =>
    {
        // get the blob properties
        CloudBlob blob = container.GetBlobReference(blobInfo.Uri.ToString());
        blob.FetchAttributes();
    
        // set cache-control header if necessary
        if (blob.Properties.CacheControl != YOUR_CACHE_CONTROL_HEADER)
        {
            blob.Properties.CacheControl = YOUR_CACHE_CONTROL_HEADER;
            blob.SetProperties();
        }
    });
    

他のヒント

Joel Fillmoreの答えの更新バージョンは次のとおりです。

Azureは、Webサイトを作成してWorkErroleを使用する代わりに、「WebJobs」を実行できるようになりました。ストレージアカウントがキャッシュヘッダーまたはその他のヘッダーフィールドを設定するために配置されている同じデータセンターのWebサイトで、任意の実行可能ファイルを実行できます。

  1. 捨てられた一時的なウェブサイトを作成します 同じデータセンターで ストレージアカウントとして。アフィニティグループについて心配しないでください。空のASP.NETサイトまたはその他の簡単なサイトを作成します。コンテンツは重要ではありません。
  2. 更新されたAzureストレージAPIで動作するコードを使用してコンソールプログラムを作成します。リリースのためにコンパイルし、実行可能ファイルとすべての必要なDLLを.zipファイルにzipします。
  3. WebJobを作成し、ステップ#2から.Zipファイルをアップロードします。enter image description here
  4. webjobを実行します。コンソールに書かれたものはすべて、WebJob Controlページから作成され、アクセス可能なログファイルで表示できます。
  5. updateazureServiceversionメソッドに注意してください。どうやら、デフォルトでは、Azureストレージは不適切にフォーマットされたETAGSを提供するため、このコードを一度実行することをお勧めします。詳細については、以下を参照してください。 これ

以下のコードは、コンテナごとに個別のタスクを実行し、コンテナごとに約70のヘッダーが秒ごとに更新されています。出力料はありません。

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;

namespace AzureHeaders
{
    class Program
    {
        static StorageCredentials storageCredentials =
            new StorageCredentials("azureaccountname", @"azzureaccountkey");
        private static string newCacheSettings = "public, max-age=7776000"; // 3 months
        private static string[] containersToProcess = { "container1", "container2" };

        static void Main(string[] args)
        {
            var account = new CloudStorageAccount(
                storageCredentials,
                false /* useHttps */);

            CloudBlobClient blobClient = account.CreateCloudBlobClient();

            var tasks = new List<Task>();
            foreach (var container in blobClient.ListContainers())
            {
                if (containersToProcess.Contains(container.Name))
                {
                    var c = container;
                    tasks.Add(Task.Run(() => FixHeaders(c)));
                }
            }
            Task.WaitAll(tasks.ToArray());
        }

        private static async Task FixHeaders(CloudBlobContainer cloudBlobContainer)
        {
            int totalCount = 0, updateCount = 0, errorCount = 0;

            Console.WriteLine("Starting container: " + cloudBlobContainer.Name);
            IEnumerable<IListBlobItem> blobInfos = cloudBlobContainer.ListBlobs(useFlatBlobListing: true);

            foreach (var blobInfo in blobInfos)
            {
                try
                {
                    CloudBlockBlob blockBlob = (CloudBlockBlob)blobInfo;
                    var blob = await cloudBlobContainer.GetBlobReferenceFromServerAsync(blockBlob.Name);
                    blob.FetchAttributes();

                    // set cache-control header if necessary
                    if (blob.Properties.CacheControl != newCacheSettings)
                    {
                        blob.Properties.CacheControl = newCacheSettings;
                        blob.SetProperties();
                        updateCount++;
                    }
                }
                catch (Exception ex)
                {
                    // Console.WriteLine(ex.Message);
                    errorCount++;
                }
                totalCount++;
            }
            Console.WriteLine("Finished container: " + cloudBlobContainer.Name + 
                ", TotalCount = " + totalCount + 
                ", Updated = " + updateCount + 
                ", Errors = " + errorCount);
        }

        // http://geekswithblogs.net/EltonStoneman/archive/2014/10/09/configure-azure-storage-to-return-proper-response-headers-for-blob.aspx
        private static void UpdateAzureServiceVersion(CloudBlobClient blobClient)
        {
            var props = blobClient.GetServiceProperties();
            props.DefaultServiceVersion = "2014-02-14";
            blobClient.SetServiceProperties(props);
        }
    }
}

の最新バージョン セレブラタクラウドストレージスタジオ, 、V2011.04.23.00は、個々のBLOBオブジェクトのキャッシュコントロールの設定をサポートしています。 Blobオブジェクトを右クリックして、「Blobプロパティを表示/編集」を選択し、の値を設定します Cache-Control 属性。 (例えば public, max-age=2592000).

Curlを使用してBLOBオブジェクトのHTTPヘッダーを確認すると、設定した値でキャッシュコントロールヘッダーが返されることがわかります。

最新 CloudBerry Explorer 現在、キャッシュ制御をサポートしています。http://www.cloudberrab.com/forum/default.aspx?g=posts&t=3047

時には、最も単純な答えが最高の答えです。少量の塊を管理したい場合は、使用できます Azure Management ブロブのヘッダー/メタデータを変更します。

  1. クリック ストレージ, 、ストレージアカウント名をクリックします。
  2. クリック コンテナ タブ、次にコンテナをクリックします。
  3. ブロブをクリックして、クリックします 編集 画面の下部に。

その編集ウィンドウでは、カスタマイズできます キャッシュコントロール, コンテンツエンコーディング, コンテンツ言語, 、 もっと。

ノート: 現在、このデータを編集することはできません Azureポータル

これは答えるには遅すぎるかもしれませんが、最近、私は画像のリストがあり、PowerShellスクリプトを使用して(もちろんAzure Storage Assemblyの助けを借りて)適用する必要があるさまざまな方法で同じことをしたかったのです。将来は。

で与えられた完全な説明 PowerShellスクリプトを使用して、Azure Blobキャッシュ制御を設定します

Add-Type -Path "C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\v2.3\ref\Microsoft.WindowsAzure.StorageClient.dll"

$accountName = "[azureaccountname]"
$accountKey = "[azureaccountkey]"
$blobContainerName = "images"

$storageCredentials = New-Object Microsoft.WindowsAzure.StorageCredentialsAccountAndKey -ArgumentList $accountName,$accountKey
$storageAccount = New-Object Microsoft.WindowsAzure.CloudStorageAccount -ArgumentList $storageCredentials,$true
#$blobClient = $storageAccount.CreateCloudBlobClient()
$blobClient =  [Microsoft.WindowsAzure.StorageClient.CloudStorageAccountStorageClientExtensions]::CreateCloudBlobClient($storageAccount)

$cacheControlValue = "public, max-age=604800"

echo "Setting cache control: $cacheControlValue"

Get-Content "imagelist.txt" | foreach {     
    $blobName = "$blobContainerName/$_".Trim()
    echo $blobName
    $blob = $blobClient.GetBlobReference($blobName)
    $blob.Properties.CacheControl = $cacheControlValue
    $blob.SetProperties()
}

PowerShellスクリプトによってストレージブロブキャッシュ制御プロパティを設定します

https://gallery.technet.microsoft.com/how-to-set-storage-blob-4774aca5

#creat CloudBlobClient 
Add-Type -Path "C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\v2.3\ref\Microsoft.WindowsAzure.StorageClient.dll" 
$storageCredentials = New-Object Microsoft.WindowsAzure.StorageCredentialsAccountAndKey -ArgumentList $StorageName,$StorageKey 
$blobClient =   New-Object Microsoft.WindowsAzure.StorageClient.CloudBlobClient($BlobUri,$storageCredentials) 
#set Properties and Metadata 
$cacheControlValue = "public, max-age=60480" 
foreach ($blob in $blobs) 
{ 
  #set Metadata 
  $blobRef = $blobClient.GetBlobReference($blob.Name) 
  $blobRef.Metadata.Add("abcd","abcd") 
  $blobRef.SetMetadata() 

  #set Properties 
  $blobRef.Properties.CacheControl = $cacheControlValue 
  $blobRef.SetProperties() 
}

Joel Fillmoreの回答の更新バージョンは、Windowsazure.storage v9.3.3を消費します。 ListBlobsSegmentedAsyncは5,000のページサイズを返すことに注意してください。そのため、BlobContinuationTokenが使用されます。

    public async Task BackfillCacheControlAsync()
    {
        var container = await GetCloudBlobContainerAsync();
        BlobContinuationToken continuationToken = null;

        do
        {
            var blobInfos = await container.ListBlobsSegmentedAsync(string.Empty, true, BlobListingDetails.None, null, continuationToken, null, null);
            continuationToken = blobInfos.ContinuationToken;
            foreach (var blobInfo in blobInfos.Results)
            {
                var blockBlob = (CloudBlockBlob)blobInfo;
                var blob = await container.GetBlobReferenceFromServerAsync(blockBlob.Name);
                if (blob.Properties.CacheControl != "public, max-age=31536000")
                {
                    blob.Properties.CacheControl = "public, max-age=31536000";
                    await blob.SetPropertiesAsync();
                }
            }               
        }
        while (continuationToken != null);
    }

    private async Task<CloudBlobContainer> GetCloudBlobContainerAsync()
    {
        var storageAccount = CloudStorageAccount.Parse(_appSettings.AzureStorageConnectionString);
        var blobClient = storageAccount.CreateCloudBlobClient();
        var container = blobClient.GetContainerReference("uploads");
        return container;
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top