Blob yeniden doldurma olayına yanıt olarak Azure İşlevi çalıştırma

Arşiv katmanındaki bir blobu okumak için önce blobu sık erişimli veya seyrek erişimli katmana yeniden doldurmanız gerekir. Yeniden doldurma işleminin tamamlanması birkaç saat sürebilir. Yeniden doldurma işleminin durumunu tekrar tekrar yoklama yerine Azure Event Grid'i blob yeniden doldurma işlemi tamamlandığında bir olayı tetikleyecek şekilde yapılandırabilir ve bu olayı uygulamanızda işleyebilirsiniz.

Bir olay oluştuğunda Event Grid, olayı bir uç nokta aracılığıyla bir olay işleyicisine gönderir. Azure İşlevleri dahil olmak üzere bir dizi Azure hizmeti olay işleyicisi olarak görev yapabilir. Azure İşlevi, bir olaya yanıt olarak yürütülebilen bir kod bloğudur. Bu nasıl yapılır, bir Azure İşlevi geliştirme ve ardından bir blob yeniden doldurulduğunda oluşan bir olaya yanıt olarak event Grid'i işlevi çalıştıracak şekilde yapılandırma işleminde size yol gösterir.

Bu makalede, Visual Studio'dan .NET ile Azure İşlevi oluşturma ve test etme adımları gösterilmektedir. Çeşitli yerel geliştirme ortamlarından ve çeşitli programlama dillerinden Azure İşlevleri oluşturabilirsiniz. Azure İşlevleri için desteklenen diller hakkında daha fazla bilgi için bkz. Azure İşlevleri'da desteklenen diller. Azure İşlevleri geliştirme seçenekleri hakkında daha fazla bilgi için bkz. Yerel olarak kod ve test Azure İşlevleri.

Arşiv katmanından blobları yeniden doldurma hakkında daha fazla bilgi için bkz . Arşiv katmanından blob yeniden doldurmaya genel bakış.

Ön koşullar

Bu makalede, .NET ile bir Azure İşlevi geliştirmek için Visual Studio 2019 veya sonraki bir sürümün nasıl kullanılacağı gösterilmektedir. Visual Studio Community'yi ücretsiz yükleyebilirsiniz. .NET ile Azure Geliştirme için Visual Studio'yu yapılandırdığınızdan emin olun.

Azure İşlevi'nin hatalarını yerel olarak ayıklamak için Postman gibi bir HTTP isteği gönderebilen bir araç kullanmanız gerekir.

Azure aboneliği gereklidir. Henüz bir hesabınız yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Azure İşlev uygulaması oluşturma

İşlev uygulaması, Azure İşlevleri için kapsayıcı olarak hizmet veren bir Azure kaynağıdır. Bu makalede açıklanan adımları tamamlamak için yeni veya mevcut bir işlev uygulamasını kullanabilirsiniz.

Azure portalında yeni bir işlev uygulaması oluşturmak için şu adımları izleyin:

  1. Azure portalında İşlev Uygulaması'nı arayın. Aboneliğinizdeki işlev uygulamaları listesine gitmek için İşlev Uygulaması simgesini seçin.

  2. Yeni bir işlev uygulaması oluşturmak için Oluştur düğmesini seçin.

  3. Temel Bilgiler sekmesinde bir kaynak grubu belirtin ve yeni işlev uygulaması için benzersiz bir ad sağlayın.

  4. Yayımla seçeneğinin Kod olarak ayarlandığından emin olun.

  5. Çalışma Zamanı yığını açılan listesinden .NET'i seçin. Sürüm alanı, .NET core'un en son sürümünü kullanmak için otomatik olarak doldurulur.

  6. Yeni işlev uygulamasının bölgesini seçin.

    Screenshot showing how to create a new function app in Azure - Basics tab

  7. Temel Bilgiler sekmesini tamamladıktan sonra Barındırma sekmesine gidin.

  8. Barındırma sekmesinde Azure İşlevinizin depolanacağı depolama hesabını seçin. Mevcut bir depolama hesabını seçebilir veya yeni bir hesap oluşturabilirsiniz.

  9. İşletim sistemi alanının Windows olarak ayarlandığından emin olun.

  10. Plan türü alanında Tüketim (Sunucusuz) öğesini seçin. Bu plan hakkında daha fazla bilgi için bkz. Azure İşlevleri Tüketim planı barındırma.

    Screenshot showing how to create a new function app in Azure - Hosting tab

  11. Yeni işlev uygulamasını oluşturmak için Gözden Geçir + Oluştur'u seçin.

İşlev uygulamanızı yapılandırma hakkında daha fazla bilgi edinmek için Azure İşlevleri belgelerindeki İşlev uygulamanızı yönetme bölümüne bakın.

Event Grid tetikleyicisi olarak Azure İşlevi oluşturma

Ardından, belirli bir depolama hesabında blob yeniden doldurulduğunda çalışacak bir Azure İşlevi oluşturun. Visual Studio'da C# ve .NET Core ile bir Azure İşlevi oluşturmak için şu adımları izleyin:

  1. Visual Studio 2019'u başlatın ve yeni bir Azure İşlevleri projesi oluşturun. Ayrıntılar için İşlev uygulaması projesi oluşturma başlığında açıklanan yönergeleri izleyin.

  2. Yeni Azure İşlevleri uygulaması oluştur adımında aşağıdaki değerleri seçin:

    • Varsayılan olarak, Azure İşlevleri çalışma zamanı Azure İşlevleri v3 (.NET Core) olarak ayarlanır. Microsoft, Azure İşlevleri çalışma zamanının bu sürümünü kullanmanızı önerir.
    • Olası tetikleyiciler listesinden Event Grid Tetikleyicisi'ni seçin. Event Grid tetikleyicisinin neden Azure İşlevi ile Blob Depolama olayını işlemek için önerilen tetikleyici türü olduğu hakkında daha fazla bilgi için bkz. Event Grid olayları için olay işleyicisi olarak işlev kullanma.
    • Depolama Hesabı ayarı, Azure İşlevinizin depolanacağı yeri gösterir. Mevcut bir depolama hesabını seçebilir veya yeni bir hesap oluşturabilirsiniz.
  3. Visual Studio'da yeni proje oluşturmak için Oluştur'u seçin.

  4. Ardından, işlevi yeniden adlandırma bölümünde açıklandığı gibi sınıfı ve Azure İşlevi'ni yeniden adlandırın. Senaryonuza uygun bir ad seçin.

  5. Visual Studio'da Araçlar | NuGet Paket Yöneticisi | Paket Yöneticisi Konsolu'nu seçin ve ardından konsoldan aşağıdaki paketleri yükleyin:

    Install-Package Azure.Storage.Blobs
    Install-Package Microsoft.ApplicationInsights.WorkerService
    Install-Package Microsoft.Azure.WebJobs.Logging.ApplicationInsights
    
  6. Azure İşlevinizin sınıf dosyasına aşağıdaki using deyimlerini yapıştırın:

    using System;
    using System.IO;
    using System.Text;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.EventGrid.Models;
    using Microsoft.Azure.WebJobs.Extensions.EventGrid;
    using Microsoft.Extensions.Logging;
    using Azure;
    using Azure.Storage.Blobs;
    using Azure.Storage.Blobs.Models;
    
  7. Sınıf dosyasında Run yöntemini bulun. Bu, bir olay gerçekleştiğinde çalışan yöntemdir. Aşağıdaki kodu Run yönteminin gövdesine yapıştırın. Köşeli ayraçlardaki yer tutucu değerleri kendi değerlerinizle değiştirmeyi unutmayın:

    // When either Microsoft.Storage.BlobCreated or Microsoft.Storage.BlobTierChanged
    // event occurs, write the event details to a log blob in the same container
    // as the event subject (the blob for which the event occurred).
    
    // Create a unique name for the log blob.
    string logBlobName = string.Format("function-log-{0}.txt", DateTime.UtcNow.Ticks);
    
    // Populate connection string with your Shared Key credentials.
    const string ConnectionString = "DefaultEndpointsProtocol=https;AccountName=<account-name>;AccountKey=<account-key>;EndpointSuffix=core.windows.net";
    
    // Get data from the event.
    dynamic data = eventGridEvent.Data;
    string eventBlobUrl = Convert.ToString(data.url);
    string eventApi = Convert.ToString(data.api);
    
    // Build string containing log information.
    StringBuilder eventInfo = new StringBuilder();
    eventInfo.AppendLine(string.Format("{0} operation occurred.", eventApi));
    eventInfo.AppendLine(string.Format("Blob URL: {0}", eventBlobUrl));
    eventInfo.AppendLine($@"Additional event details:
        Id=[{eventGridEvent.Id}]
        EventType=[{eventGridEvent.EventType}]
        EventTime=[{eventGridEvent.EventTime}]
        Subject=[{eventGridEvent.Subject}]
        Topic=[{eventGridEvent.Topic}]");
    
    // If event was BlobCreated and API call was CopyBlob, respond to the event.
    bool copyBlobEventOccurred = (eventGridEvent.EventType == "Microsoft.Storage.BlobCreated") &&
                                 (eventApi == "CopyBlob");
    
    // If event was BlobTierChanged and API call was SetBlobTier, respond to the event.
    bool setTierEventOccurred = (eventGridEvent.EventType == "Microsoft.Storage.BlobTierChanged") &&
                                (eventApi == "SetBlobTier");
    
    // If one of these two events occurred, write event info to a log blob.
    if (copyBlobEventOccurred | setTierEventOccurred)
    {
        // Create log blob in same account and container.
        BlobUriBuilder logBlobUriBuilder = new BlobUriBuilder(new Uri(eventBlobUrl))
        {
            BlobName = logBlobName
        };
    
        BlobClient logBlobClient = new BlobClient(ConnectionString,
                                                  logBlobUriBuilder.BlobContainerName,
                                                  logBlobName);
    
        byte[] byteArray = Encoding.ASCII.GetBytes(eventInfo.ToString());
    
        try
        {
            // Write the log info to the blob.
            // Overwrite if the blob already exists.
            using (MemoryStream memoryStream = new MemoryStream(byteArray))
            {
                BlobContentInfo blobContentInfo =
                    logBlobClient.Upload(memoryStream, overwrite: true);
            }
        }
        catch (RequestFailedException e)
        {
            Console.WriteLine(e.Message);
            throw;
        }
    }
    

Azure İşlevleri geliştirme hakkında daha fazla bilgi için bkz. Azure İşlevleri geliştirme kılavuzu.

Blob Depolama olayı bir olay işleyicisinde yayımlandığında dahil edilen bilgiler hakkında daha fazla bilgi edinmek için bkz. Event Grid kaynağı olarak Azure Blob Depolama.

Azure İşlevi'ni hata ayıklayıcıda yerel olarak çalıştırma

Azure İşlev kodunuzu yerel olarak test etmek için olayı tetikleyen bir HTTP isteğini el ile göndermeniz gerekir. Postman gibi bir araç kullanarak isteği gönderebilirsiniz.

Azure İşlevinizin sınıf dosyasının en üstünde, yerel ortamda test için kullanabileceğiniz bir URL uç noktası bulunur. İsteğin bu URL ile gönderilmesi, yerel ortamda olayı tetikler, böylece kodunuzda hata ayıklayabilirsiniz. URL aşağıdaki biçimdedir:

http://localhost:7071/runtime/webhooks/EventGrid?functionName={functionname}

Bu uç noktaya gönderdiğiniz istek, sanal bir istektir. Azure Depolama hesabınızdan veri göndermez veya almaz.

Bu uç noktayı oluşturmak ve bu uç noktaya istek göndermek için bu adımları izleyin. Bu örnekte, isteğin Postman ile nasıl gönderilmisi gösterilmektedir.

  1. Postman’de yeni bir istek oluşturun.

  2. Yukarıda gösterilen URL'yi istek URL'sinin alanına yapıştırın; işlevinizin {functionname} adını yazın ve küme ayraçlarını kaldırın. İstek fiilinin GET olarak ayarlandığından emin olun.

    Screenshot showing how to specify local URL for event trigger in Postman

  3. content-Type üst bilgisini ekleyin ve application/json olarak ayarlayın.

  4. aeg-event-type üst bilgisini ekleyin ve Bildirim olarak ayarlayın.

    Screenshot showing header configuration for local request to trigger event

  5. Postman'de, gövde türü JSON ve biçim ham olarak ayarlanmış istek gövdesini belirtin. Aşağıdaki örnek, Blob Kopyalama isteğinin benzetimini yapar. Köşeli ayraçlardaki yer tutucu değerlerini kendi değerlerinizle değiştirin. Bu bir simülasyon isteği olduğundan tarih/saat veya tanımlayıcı değerlerinin değiştirilmesinin gerekli olmadığını unutmayın:

    [{
      "topic": "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
      "subject": "/blobServices/default/containers/<container-name>/blobs/<blob-name>",
      "eventType": "Microsoft.Storage.BlobCreated",
      "id": "2bfb587b-501e-0094-2746-8b2884065d32",
      "data": {
        "api": "CopyBlob",
        "clientRequestId": "3d4dedc7-6c27-4816-9405-fdbfa806b00c",
        "requestId": "2bfb587b-501e-0094-2746-8b2884000000",
        "eTag": "0x8D9595DCA505BDF",
        "contentType": "text/plain",
        "contentLength": 48,
        "blobType": "BlockBlob",
        "url": "https://<storage-account>.blob.core.windows.net/<container-name>/<blob-name>",
        "sequencer": "0000000000000000000000000000201B00000000004092a5",
        "storageDiagnostics": {
          "batchId": "8a92736a-6006-0026-0046-8bd7f5000000"
        }
      },
      "dataVersion": "",
      "metadataVersion": "1",
      "eventTime": "2021-08-07T04:42:41.0730463Z"
    }]
    
  6. Visual Studio'da, istediğiniz kesme noktalarını kodunuza yerleştirin ve hata ayıklayıcısını çalıştırmak için F5 tuşuna basın.

  7. Postman'de, isteği uç noktaya göndermek için Gönder düğmesini seçin.

İsteği gönderdiğinizde Event Grid, Azure İşlevinizi çağırır ve normal şekilde hata ayıklayabilirsiniz. Ek bilgi ve örnekler için Azure İşlevleri belgelerinde isteği el ile gönderme bölümüne bakın.

Olayı tetikleyen istek simülasyonu yapılır, ancak olay tetiklendiğinde çalıştırılan Azure İşlevi günlük bilgilerini depolama hesabınızdaki yeni bir bloba yazar. Blobun içeriğini doğrulayabilir ve son değiştirme zamanını aşağıdaki görüntüde gösterildiği gibi Azure portalında görüntüleyebilirsiniz:

Screenshot showing the contents of the log blob in the Azure portal

Azure İşlevini yayımlama

Azure İşlevinizi yerel olarak test ettikten sonra, sonraki adım Azure İşlevini daha önce oluşturduğunuz Azure İşlev Uygulaması'na yayımlamaktır. Event Grid'i depolama hesabında gerçekleşen olayları işlev uç noktasına gönderecek şekilde yapılandırabilmeniz için işlevin yayımlanması gerekir.

İşlevi yayımlamak için şu adımları izleyin:

  1. Çözüm Gezgini Azure İşlevleri projenizi seçip basılı tutun (veya sağ tıklayın) ve Yayımla'yı seçin.

  2. Yayımla penceresinde hedef olarak Azure'ı ve ardından İleri'yi seçin.

  3. Belirli bir hedef olarak Azure İşlev Uygulaması (Windows) öğesini ve ardından İleri'yi seçin.

  4. İşlevler örneği sekmesinde, açılan menüden aboneliğinizi seçin ve ardından kullanılabilir işlev uygulamaları listesinde Azure İşlev Uygulamanızı bulun.

  5. Paket dosyasından çalıştır onay kutusunun seçili olduğundan emin olun.

  6. İşlevi yayımlamaya hazırlanmak için Son'u seçin.

  7. Yayımla sayfasında yapılandırmanın doğru olduğunu doğrulayın. Uygulama Analizler hizmet bağımlılığının yapılandırılmadığını belirten bir uyarı görürseniz, bu sayfadan yapılandırabilirsiniz.

  8. Azure İşlevi'ni daha önce oluşturduğunuz Azure İşlev Uygulaması'na yayımlamaya başlamak için Yayımla düğmesini seçin.

    Screenshot showing page to publish Azure Function from Visual Studio

Azure İşlevinizdeki kodda her değişiklik yaptığınızda, güncelleştirilmiş işlevi Azure'da yayımlamanız gerekir.

Depolama hesabından blob yeniden doldurma olaylarına abone olma

Artık bir olaya yanıt olarak çalıştırabilen bir Azure İşlevi içeren bir işlev uygulamanız var. Sonraki adım, depolama hesabınızdan bir olay aboneliği oluşturmaktır. Olay aboneliği depolama hesabı, depolama hesabınızdaki bir blob üzerindeki işleme yanıt olarak Event Grid aracılığıyla bir olay yayımlayacak şekilde yapılandırılır. Ardından Event Grid, olayı belirttiğiniz olay işleyicisi uç noktasına gönderir. Bu durumda, olay işleyicisi önceki bölümde oluşturduğunuz Azure İşlevi'dir.

Olay aboneliğini oluşturduğunuzda, olay işleyicisine hangi olayların gönderileceğini filtreleyebilirsiniz. Arşiv katmanından bir blob yeniden doldurma sırasında yakalanacak olaylar Microsoft.Depolama'dır. Blob KatmanıNı Ayarla işlemine karşılık gelen BlobTierChanged ve Microsoft.Depolama. Blobu Kopyalama işlemine karşılık gelen BlobOluşturan olaylar. Senaryonuza bağlı olarak, bu olaylardan yalnızca birini işlemek isteyebilirsiniz.

Olay aboneliğini oluşturmak için şu adımları izleyin:

  1. Azure portalında, arşiv katmanından yeniden doldurmanız için blobları içeren depolama hesabına gidin.

  2. Sol gezinti bölmesinde Olaylar ayarını seçin.

  3. Olaylar sayfasında Diğer seçenekler'i seçin.

  4. Olay Aboneliği Oluştur'u seçin.

  5. Olay Aboneliği Oluştur sayfasının Olay aboneliği ayrıntıları bölümünde, olay aboneliği için bir ad girin.

  6. Konu ayrıntıları bölümünde sistem konusu için bir ad belirtin. Sistem konusu, Azure Depolama tarafından yayımlanan bir veya daha fazla olayı temsil eder. Sistem konuları hakkında daha fazla bilgi için bkz . Azure Event Grid'de sistem konuları.

  7. Olay Türleri bölümünde Blob Oluşturuldu ve Blob Katmanı Değiştirildi olaylarını seçin. Arşiv katmanından bir blobu nasıl yeniden doldurmayı seçtiğinize bağlı olarak, bu iki olaydan biri tetiklenir.

    Screenshot showing how to select event types for blob rehydration events in the Azure portal

  8. Uç nokta ayrıntıları bölümünde açılan menüden Azure İşlevi'ni seçin.

  9. Önceki bölümde oluşturduğunuz işlevi belirtmek için Uç nokta seçin'i seçin. Azure İşlevi Seç iletişim kutusunda Azure İşleviniz için abonelik, kaynak grubu ve işlev uygulamasını seçin. Son olarak, açılan listeden işlev adını seçin ve Seçimi onayla'yı seçin.

    Screenshot showing how to select an Azure Function as the endpoint for an Event Grid subscription

  10. Olay aboneliğini oluşturmak ve olayları Azure İşlevi olay işleyicisine göndermeye başlamak için Oluştur düğmesini seçin.

Olay abonelikleri hakkında daha fazla bilgi edinmek için bkz . Azure Event Grid kavramları.

Azure İşlevi olay işleyicisini test edin

Azure İşlevi'ni test etmek için olay aboneliğini içeren depolama hesabında bir olay tetikleyebilirsiniz. Daha önce oluşturduğunuz olay aboneliği, Microsoft.Depolama olarak iki olayı filtreleiyor. BlobCreated ve Microsoft.Depolama. BlobTierChanged. Bu olaylardan biri tetiklendiğinde Azure İşlevinizi tetikler.

Bu makalede gösterilen Azure İşlevi iki senaryoda günlük blobu yazar:

  • Olay Microsoft.Depolama olduğunda. BlobOluştur ve API işlemi Blobu Kopyala'dır.
  • Olay Microsoft.Depolama olduğunda. BlobTierChanged ve API işlemi Blob KatmanıNı Ayarla'dır.

Bir blobu yeniden doldurma yoluyla işlevi test etmeyi öğrenmek için şu iki yordamdan birine bakın:

Yeniden doldurma işlemi tamamlandıktan sonra günlük blobu, yeniden doldurulduğunuz blobla aynı kapsayıcıya yazılır. Örneğin, bir blobu kopyalama işlemiyle yeniden doldurmanın ardından Azure portalında özgün kaynak blobunun arşiv katmanında kaldığını, tamamen yeniden doldurulan hedef blob'un hedeflenen çevrimiçi katmanda göründüğünü ve Azure İşlevi tarafından oluşturulan günlük blobunun da listede göründüğünü görebilirsiniz.

Screenshot showing the original blob in the archive tier, the rehydrated blob in the hot tier, and the log blob written by the event handler.

Yeniden doldurma önceliği ayarına bağlı olarak blobu yeniden doldurmanın 15 saate kadar sürebileceğini unutmayın. Yeniden doldurma önceliğini Yüksek olarak ayarlarsanız, boyutu 10 GB'tan küçük bloblar için yeniden doldurma işlemi bir saatten kısa sürede tamamlanabilir. Ancak, yüksek öncelikli yeniden doldurma daha yüksek bir maliyete neden olur. Daha fazla bilgi için bkz . Arşiv katmanından blob yeniden doldurmaya genel bakış.

Bahşiş

Bu nasıl yapılır işleminin amacı bu olayları blob yeniden doldurma bağlamında işlemek olsa da, test amacıyla bir blobu karşıya yüklemeye veya çevrimiçi blobun katmanını değiştirmeye (örneğin, sık erişimliden seyrek erişimliye) yanıt olarak bu olayları gözlemlemek de yararlı olabilir çünkü olay hemen tetiklenir.

Event Grid'de olayları filtreleme hakkında daha fazla bilgi için bkz . Azure Event Grid için olayları filtreleme.

Ayrıca bkz.