Jalankan Azure Function sebagai respons terhadap peristiwa rehidrasi blob

Untuk membaca blob yang ada di tingkat arsip, Anda harus terlebih dahulu merehidrasi blob ke tingkat panas atau dingin. Proses rehidrasi bisa memakan waktu beberapa jam untuk diselesaikan. Daripada berulang kali men-polling status operasi rehidrasi, Anda dapat mengonfigurasi Azure Event Grid untuk memberhentikan peristiwa ketika operasi rehidrasi blob selesai dan menangani peristiwa ini dalam aplikasi Anda.

Ketika suatu peristiwa terjadi, Azure Event Grid mengirimkan peristiwa ke penanganan aktivitas melalui titik akhir. Sejumlah layanan Azure dapat berfungsi sebagai penanganan peristiwa, termasuk Azure Functions. Azure Function adalah blok kode yang dapat dijalankan sebagai respons terhadap suatu peristiwa. Cara ini memandu Anda melalui proses pengembangan Azure Function dan kemudian mengonfigurasi Azure Event Grid untuk menjalankan fungsi sebagai respons terhadap peristiwa yang terjadi saat blob direhidrasi.

Artikel ini menunjukkan kepada Anda cara membuat dan menguji Azure Function dengan .NET dari Visual Studio. Anda dapat membangun Azure Functions dari berbagai lingkungan pengembangan lokal dan menggunakan berbagai bahasa pemrograman yang berbeda. Untuk informasi selengkapnya tentang bahasa yang didukung untuk Azure Functions, lihat Bahasa yang didukung di Azure Functions. Untuk informasi selengkapnya tentang opsi pengembangan untuk Azure Functions, lihat Kode dan uji Azure Functions secara lokal.

Untuk informasi selengkapnya tentang rehidrasi blob dari tingkat arsip, lihat Gambaran umum rehidrasi blob dari tingkat arsip.

Prasyarat

Artikel ini menunjukkan cara menggunakan Visual Studio 2019 atau yang lebih baru untuk mengembangkan Azure Function dengan .NET. Anda dapat menginstal Visual Studio Community secara gratis. Pastikan Anda mengonfigurasi Visual Studio untuk Pengembangan Azure dengan .NET.

Untuk men-debug Azure Function secara lokal, Anda harus menggunakan alat yang dapat mengirim permintaan HTTP, seperti Postman.

Memerlukan Langganan Azure. Jika Anda belum memiliki akun, buat akun gratis sebelum mulai.

Buat aplikasi Azure Function

Aplikasi fungsi adalah sumber daya Azure yang berfungsi sebagai kontainer untuk Azure Functions Anda. Anda dapat menggunakan aplikasi fungsi baru atau yang sudah ada untuk menyelesaikan langkah-langkah yang dijelaskan dalam artikel ini.

Untuk membuat aplikasi fungsi baru di portal Microsoft Azure, ikuti langkah-langkah berikut:

  1. Di portal Microsoft Azure, cari Function App. Pilih ikon Function App untuk menavigasikan ke daftar aplikasi fungsi di langganan Anda.

  2. Pilih tombol Buat untuk membuat aplikasi fungsi baru.

  3. Pada tab Dasar-Dasar, tentukan grup sumber daya, dan berikan nama yang unik untuk aplikasi fungsi baru.

  4. Pastikan opsi Terbitkan diatur ke Kode.

  5. Dari tarik turun Tumpukan runtime, pilih .NET. Bidang Versi secara otomatis diisi untuk menggunakan versi terbaru .NET core.

  6. Pilih wilayah untuk aplikasi fungsi baru.

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

  7. Setelah Anda melengkapi tab Dasar-Dasar, navigasikan ke tab Hosting.

  8. Pada tab Hosting, pilih akun penyimpanan tempat Azure Function akan disimpan. Anda dapat menggunakan akun penyimpanan yang sudah ada, atau membuat akun penyimpanan baru.

  9. Pastikan bahwa bidang Sistem operasi diatur ke Windows.

  10. Pada bidang Jenis paket, pilih Konsumsi (Nirserver). Untuk informasi selengkapnya tentang paket ini, lihat Hosting paket Konsumsi Azure Functions.

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

  11. Pilih Ulas + Buat untuk membuat aplikasi fungsi baru.

Untuk mempelajari selengkapnya tentang mengonfigurasi aplikasi fungsi Anda, lihat Mengelola aplikasi fungsi Anda di dokumentasi Azure Functions.

Membuat Azure Function sebagai pemicu Azure Event Grid

Selanjutnya, buat Azure Function yang akan berjalan saat blob direhidrasi di akun penyimpanan tertentu. Ikuti langkah-langkah ini untuk membuat Azure Function di Visual Studio dengan C# dan .NET Core:

  1. Luncurkan Visual Studio 2019, dan buat proyek Azure Functions yang baru. Untuk detailnya, ikuti petunjuk yang dijelaskan dalam Buat proyek aplikasi fungsi.

  2. Pada langkah Buat aplikasi Azure Functions baru, pilih nilai berikut:

    • Secara default, runtime Azure Functions diatur ke Azure Functions v3 (.NET Core). Microsoft merekomendasikan untuk menggunakan versi runtime Azure Functions ini.
    • Dari daftar pemicu yang mungkin, pilih Pemicu Azure Event Grid. Untuk informasi lebih lanjut tentang mengapa pemicu Azure Event Grid adalah jenis pemicu yang disarankan untuk menangani aktivitas Azure Blob Storage dengan Azure Function, lihat Menggunakan fungsi sebagai penanganan aktivitas untuk peristiwa Azure Event Grid.
    • Pengaturan Akun Penyimpanan menunjukkan tempat Azure Function Anda akan disimpan. Anda dapat memilih akun penyimpanan yang sudah ada, atau membuat akun baru.
  3. Pilih Buat untuk membuat proyek baru di Visual Studio.

  4. Selanjutnya, ganti nama kelas dan Azure Function, seperti yang dijelaskan dalam Mengganti nama fungsi. Pilih nama yang sesuai untuk skenario Anda.

  5. Di Visual Studio, pilih Alat | Pengelola Paket NuGet | Konsol Pengelola Paket, lalu instal paket berikut dari konsol:

    Install-Package Azure.Storage.Blobs
    Install-Package Microsoft.ApplicationInsights.WorkerService
    Install-Package Microsoft.Azure.WebJobs.Logging.ApplicationInsights
    
  6. Di file kelas untuk Azure Function Anda, tempelkan di berikut menggunakan pernyataan:

    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. Temukan metode Jalankan di file kelas. Ini adalah metode yang berjalan ketika suatu peristiwa terjadi. Tempelkan kode berikut ke isi metode Jalankan. Ingatlah untuk mengganti nilai tempat penampung dalam tanda kurung sudut dengan nilai Anda sendiri:

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

Untuk informasi selengkapnya tentang pengembangan Azure Functions, lihat Panduan untuk mengembangkan Azure Functions.

Untuk mempelajari lebih lanjut tentang informasi yang disertakan saat aktivitas Azure Blob Storage dipublikasikan ke penanganan aktivitas, lihat Azure Blob Storage sebagai sumber Azure Event Grid.

Menjalankan Azure Function secara lokal di debugger

Untuk menguji kode Azure Function Anda secara lokal, Anda perlu mengirim permintaan HTTP secara manual yang memicu peristiwa tersebut. Anda dapat memposting permintaan menggunakan alat seperti Postman.

Di bagian atas file kelas untuk Azure Function Anda terdapat titik akhir URL yang dapat Anda gunakan untuk pengujian di lingkungan lokal. Memposting permintaan dengan URL ini memicu peristiwa di lingkungan lokal sehingga Anda dapat men-debug kode Anda. URL ada dalam format berikut:

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

Permintaan yang Anda kirim ke titik akhir ini adalah permintaan simulasi. Ini tidak mengirim atau menerima data dari akun Azure Storage Anda.

Ikuti langkah-langkah ini untuk membangun dan mengirim permintaan ke titik akhir ini. Contoh ini menunjukkan cara mengirim permintaan dengan Postman.

  1. Di Postman, buat permintaan baru.

  2. Tempelkan URL yang ditunjukkan di atas ke bidang untuk URL permintaan, mengganti nama fungsi Anda untuk {functionname} dan menghapus tanda kurung kurawal. Pastikan kata kerja permintaan diatur ke GET.

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

  3. Tambahkan header Jenis Konten dan atur ke aplikasi/json.

  4. Tambahkan header aeg-event-type dan atur ke Notifikasi.

    Screenshot showing header configuration for local request to trigger event

  5. Di Postman, tetapkan isi permintaan, dengan jenis isi diatur ke JSON dan format ke raw. Contoh berikut mensimulasikan permintaan Salin Blob. Ganti nilai tempat penampung dalam tanda kurung sudut dengan nilai Anda sendiri. Perhatikan bahwa tidak perlu mengubah nilai tanggal /waktu atau pengidentifikasi, karena ini adalah permintaan simulasi:

    [{
      "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. Di Visual Studio, tempatkan titik henti yang diinginkan di kode Anda, dan tekan F5 untuk menjalankan debugger.

  7. Di Postman, pilih tombol Kirim untuk mengirim permintaan ke titik akhir.

Saat Anda mengirim permintaan, Azure Event Grid memanggil Azure Function Anda, dan Anda dapat men-debug secara normal. Untuk informasi tambahan dan contoh, lihat Memposting permintaan secara manual in di dokumentasi Azure Functions.

Permintaan yang memicu aktivitas disimulasikan, tetapi Azure Function yang berjalan ketika menjalankan peristiwa menulis mengaktifkan penulisan informasi log ke blob baru di akun penyimpanan Anda. Anda dapat memverifikasi isi blob dan melihat waktu modifikasi terakhirnya di portal Microsoft Azure, seperti yang ditunjukkan pada gambar berikut:

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

Menerbitkan Azure Function

Setelah Anda menguji Azure Function secara lokal, langkah selanjutnya adalah menerbitkan Azure Function ke Aplikasi Azure Function yang Anda buat sebelumnya. Fungsi harus dipublikasikan agar Anda dapat mengonfigurasi Azure Event Grid untuk mengirim peristiwa yang terjadi pada akun penyimpanan ke titik akhir fungsi.

Ikuti langkah-langkah berikut untuk menerbitkan fungsi:

  1. Pada Penjelajah Solusi, klik kanan proyek Azure Functions Anda dan pilih Terbitkan.

  2. Di jendela Terbitkan, pilih Azure sebagai target, lalu pilih Berikutnya.

  3. Pada halaman Aplikasi Azure Function (Windows) sebagai target khusus, lalu pilih Berikutnya.

  4. Pada tab Contoh Azure Functions pilih langganan Anda dari menu tarik turun, lalu temukan Aplikasi Azure Function Anda di daftar aplikasi fungsi yang tersedia.

  5. Pastikan bahwa kotak centang Jalankan dari file paket dipilih.

  6. Pilih Selesaikan untuk bersiap menerbitkan fungsi.

  7. Pada halaman Terbitkan, verifikasikan bahwa konfigurasi benar. Jika Anda melihat peringatan bahwa dependensi layanan ke Application Insights tidak dikonfigurasi, Anda dapat mengonfigurasinya dari halaman ini.

  8. Pilih tombol Terbitkan untuk mulai menerbitkan Azure Function ke Aplikasi Azure Function yang sudah Anda buat sebelumnya.

    Screenshot showing page to publish Azure Function from Visual Studio

Setiap kali Anda membuat perubahan pada kode di Azure Function, Anda harus mempublikasikan fungsi yang diperbarui ke Azure.

Berlangganan peristiwa rehidrasi blob dari akun penyimpanan

Anda sekarang memiliki aplikasi fungsi yang berisi Azure Function yang dapat berjalan sebagai respons terhadap suatu peristiwa. Langkah selanjutnya adalah membuat langganan peristiwa dari akun penyimpanan Anda. Langganan peristiwa mengonfigurasi akun penyimpanan untuk mempublikasikan acara melalui Azure Event Grid sebagai tanggapan atas operasi pada blob di akun penyimpanan Anda. Azure Event Grid kemudian mengirimkan peristiwa ke titik akhir penanganan peristiwa yang telah Anda tentukan. Dalam hal ini, penanganan peristiwa adalah Azure Function yang Anda buat di bagian sebelumnya.

Saat Anda membuat langganan peristiwa, Anda dapat memfilter peristiwa mana yang dikirim ke penanganan peristiwa. Peristiwa untuk dikumpulkan saat blob dari tingkat arsip adalah Microsoft.Storage.BlobTierChanged, terkait dengan operasi Tingkat Mengatur Blob, dan peristiwa Microsoft.Storage.BlobCreated, terkait dengan operasi Menyalin Blob. Tergantung pada skenario Anda, Anda mungkin ingin menangani hanya satu dari peristiwa ini.

Saat membuat langganan peristiwa, ikuti langkah-langkah berikut:

  1. Di portal Microsoft Azure, navigasikan ke akun penyimpanan yang berisi blob untuk direhidrasi dari tingkat arsip.

  2. Pilih pengaturan Peristiwa di panel navigasi kiri.

  3. Pada halaman Peristiwa, pilih Opsi lain.

  4. Pilih Membuat Langganan Peristiwa.

  5. Pada halaman Membuat Langganan Peristiwa, di bagian Detail langganan peristiwa, berikan nama untuk langganan peristiwa.

  6. Di bagian Detail topik, berikan nama untuk topik sistem. Topik sistem mewakili satu atau beberapa peristiwa yang diterbitkan oleh Azure Storage. Untuk mengetahui informasi selengkapnya tentang topik sistem, lihat Topik sistem di Azure Event Grid.

  7. Di bagian Jenis Peristiwa, pilih peristiwa Blob yang Dibuat dan Tingkat Blob yang Diubah. Tergantung cara Anda memilih untuk rehidrasi blob dari tingkat arsip, salah satu dari dua peristiwa ini akan dimulai.

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

  8. Di bagian Detail titik akhir, pilih Azure Function dari menu tarik turun.

  9. Pilih Pilih titik akhir untuk menetapkan fungsi yang Anda buat di bagian sebelumnya. Di dialog Pilih Azure Function, pilih langganan, grup sumber daya, dan aplikasi fungsi untuk Azure Function Anda. Terakhir, pilih nama fungsi dari tarik turun dan pilih Konfirmasi pilihan.

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

  10. Pilih tombol Buat untuk membuat langganan aktivitas dan mulai mengirim aktivitas ke penangan aktivitas Azure Function.

Untuk mempelajari selengkapnya tentang langganan persitiwa, lihat konsep Azure Event Grid.

Menguji penanganan peristiwa Azure Function

Untuk menguji Azure Function, Anda dapat memicu peristiwa di akun penyimpanan yang berisi langganan peristiwa. Langganan peristiwa yang sebelumnya telah Anda buat memfilter dua peristiwa, Microsoft.Storage.BlobCreated dan Microsoft.Storage.BlobTierChanged. Ketika salah satu dari peristiwa tersebut dimulai, ini akan memicu Azure Function Anda.

Azure Function yang ditampilkan dalam artikel ini menulis ke blob log dalam dua skenario:

  • Saat peristiwa adalah Microsoft.Storage.BlobCreated dan operasi API adalah Menyalin Blob.
  • Saat peristiwa adalah Microsoft.Storage.BlobTierChanged dan operasi API adalah Mengatur Tingkat Blob.

Untuk mempelajari cara menguji fungsi dengan rehidrasi blob, lihat salah satu dari dua prosedur ini:

Setelah rehidrasi selesai, blob log ditulis ke kontainer yang sama dengan blob yang Anda rehidrasi. Misalnya, setelah Anda menghidrasi blob dengan operasi salin, Anda dapat melihat di portal Microsoft Azure bahwa blob sumber asli tetap berada di tingkat arsip, blob tujuan yang sepenuhnya direhidrasi muncul di tingkat online yang ditargetkan, dan blob log yang dibuat oleh Azure Function juga muncul dalam daftar.

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.

Perlu diingat bahwa rehidrasi blob dapat menggunakan waktu hingga 15 jam, tergantung pada pengaturan prioritas rehidrasi. Jika Anda mengatur prioritas rehidrasi ke Tinggi, rehidrasi dapat selesai dalam waktu kurang dari satu jam untuk blob yang berukuran kurang dari 10 GB. Namun, rehidrasi prioritas tinggi menimbulkan biaya yang lebih besar. Untuk informasi selengkapnya, lihat Ringkasan rehidrasi blob dari tingkat arsip.

Tip

Meskipun tujuan dari cara ini adalah untuk menangani peristiwa ini dalam konteks rehidrasi blob, untuk tujuan pengujian, ini juga dapat membantu mengamati peristiwa ini sebagai tanggapan dari pengunggahan blob atau mengubah tingkat blob online(yaitu, dari panas ke dingin), karena peristiwa itu segera dimulai.

Untuk informasi selengkapnya tentang cara memfilter peristiwa di Azure Event Grid, lihat Cara memfilter peristiwa untuk Azure Event Grid.

Baca juga