pemicu Azure Blob storage untuk Azure Functions

Pemicu Blob storage memulai fungsi saat blob baru atau yang diperbarui terdeteksi. Konten blob disediakan sebagai input ke fungsi.

Petunjuk / Saran

Ada beberapa cara untuk menjalankan kode fungsi Anda berdasarkan perubahan pada blob dalam kontainer storage. Jika Anda memilih untuk menggunakan pemicu Blob storage, ada dua implementasi yang ditawarkan: yang berbasis polling (dirujuk dalam artikel ini) dan yang berbasis peristiwa. Disarankan agar Anda menggunakan implementasi berbasis peristiwa karena memiliki latensi yang lebih rendah daripada yang lain. Selain itu, paket Konsumsi Flex hanya mendukung pemicu Blob storage berbasis peristiwa.

Untuk detail tentang perbedaan antara dua implementasi pemicu Blob storage, serta opsi pemicu lainnya, lihat Berkerja dengan blob.

Untuk informasi tentang detail penyiapan dan konfigurasi, lihat ringkasan.

Penting

Artikel ini menggunakan tab untuk mendukung beberapa versi model pemrograman Node.js. Model v4 umumnya tersedia dan dirancang untuk memiliki pengalaman yang lebih fleksibel dan intuitif untuk pengembang JavaScript dan TypeScript. Untuk detail selengkapnya tentang cara kerja model v4, lihat panduan pengembang Azure Functions Node.js. Untuk mempelajari selengkapnya tentang perbedaan antara v3 dan v4, lihat panduan migrasi.

Azure Functions mendukung dua model pemrograman untuk Python. Cara Anda menentukan pengikatan tergantung pada model pemrograman yang Anda pilih.

Model pemrograman Python v2 memungkinkan Anda menentukan pengikatan menggunakan dekorator langsung dalam kode fungsi Python Anda. Untuk informasi selengkapnya, lihat panduan pengembang Python.

Artikel ini mendukung kedua model pemrograman.

Contoh

Fungsi C# dapat dibuat dengan menggunakan salah satu mode C# berikut:

  • Model pekerja terisolasi: Fungsi C# terkompilasi yang berjalan dalam proses pekerja yang terisolasi dari runtime. Proses pekerja terisolasi diperlukan untuk mendukung fungsi C# yang berjalan pada versi LTS dan non-LTS .NET dan .NET Framework. Ekstensi untuk fungsi proses pekerja yang terisolasi menggunakan namespace Microsoft.Azure.Functions.Worker.Extensions.*.
  • Model dalam proses: Fungsi C# yang dikompilasi yang berjalan dalam proses yang sama dengan runtime Functions. Dalam variasi model ini, Functions dapat dijalankan menggunakan scripting C#, yang didukung terutama untuk pengeditan portal C#. Ekstensi untuk fungsi dalam proses menggunakan namespace Microsoft.Azure.WebJobs.Extensions.*.

Contoh berikut adalah fungsi C# yang berjalan dalam proses pekerja yang terisolasi dan menggunakan pemicu blob dengan input blob dan pengikatan blob output blob. Fungsi ini dipicu oleh pembuatan blob dalam kontainer test-samples-trigger. Fungsi ini membaca file teks dari kontainer test-samples-input dan membuat file teks baru dalam kontainer output berdasarkan nama file yang dipicu.

public static class BlobFunction
{
    [Function(nameof(BlobFunction))]
    [BlobOutput("test-samples-output/{name}-output.txt")]
    public static string Run(
        [BlobTrigger("test-samples-trigger/{name}")] string myTriggerItem,
        [BlobInput("test-samples-input/sample1.txt")] string myBlob,
        FunctionContext context)
    {
        var logger = context.GetLogger("BlobFunction");
        logger.LogInformation("Triggered Item = {myTriggerItem}", myTriggerItem);
        logger.LogInformation("Input Item = {myBlob}", myBlob);

        // Blob Output
        return "blob-output content";
    }
}

Fungsi ini menggunakan array byte untuk menulis log saat blob ditambahkan atau diperbarui dalam myblob kontainer.

Berbasis polling:

Contoh berikut menggunakan pemicu polling default:

@FunctionName("blobprocessor")
public void run(
  @BlobTrigger(name = "file",
               dataType = "binary",
               path = "myblob/{name}",
               connection = "MyStorageAccountAppSetting") byte[] content,
  @BindingName("name") String filename,
  final ExecutionContext context
) {
  context.getLogger().info("Name: " + filename + " Size: " + content.length + " bytes");
}

Contoh berikut menggunakan pemicu Event Grid:

@FunctionName("blobprocessor")
public void run(
  @BlobTrigger(name = "file",
               dataType = "binary",
               path = "myblob/{name}",
               source = "EventGrid",
               connection = "MyStorageAccountAppSetting") byte[] content,
  @BindingName("name") String filename,
  final ExecutionContext context
) {
  context.getLogger().info("Name: " + filename + " Size: " + content.length + " bytes");
}

Contoh jenis SDK ini menggunakan BlobClient untuk access properti blob.

@FunctionName("processBlob")
public void run(
        @BlobTrigger(
                name = "content",
                path = "images/{name}",
                connection = "AzureWebJobsStorage") BlobClient blob,
        @BindingName("name") String file,
        ExecutionContext ctx)
{
    ctx.getLogger().info("Size = " + blob.getProperties().getBlobSize());
}

Contoh jenis SDK ini menggunakan BlobContainerClient untuk access info tentang blob dalam kontainer yang memicu fungsi.

@FunctionName("containerOps")
public void run(
        @BlobTrigger(
                name = "content",
                path = "images/{name}",
                connection = "AzureWebJobsStorage") BlobContainerClient container,
        ExecutionContext ctx)
{
    container.listBlobs()
            .forEach(b -> ctx.getLogger().info(b.getName()));
}

Contoh jenis SDK ini menggunakan BlobClient untuk mendapatkan informasi dari pengikatan input tentang blob yang memicu eksekusi.

@FunctionName("checkAgainstInputBlob")
public void run(
        @BlobInput(
                name = "inputBlob",
                path = "inputContainer/input.txt") BlobClient inputBlob,
        @BlobTrigger(
                name = "content",
                path = "images/{name}",
                connection = "AzureWebJobsStorage",
                dataType = "string") String triggerBlob,
        ExecutionContext ctx)
{
    ctx.getLogger().info("Size = " + inputBlob.getProperties().getBlobSize());
}

Contoh ini menunjukkan cara mendapatkan BlobClient dari pemicu Blob Storage dan dari pengikatan input pada pemicu HTTP:

import "@azure/functions-extensions-blob"; // This is the mandatory first import for SDK binding
import { StorageBlobClient } from "@azure/functions-extensions-blob";
import { app, InvocationContext } from "@azure/functions";

export async function storageBlobTrigger(
  blobStorageClient: StorageBlobClient, // SDK binding provides this client
  context: InvocationContext
): Promise<void> {
  context.log(`Blob trigger processing: ${context.triggerMetadata.name}`);

  // Access to full SDK capabilities
  const blobProperties = await blobStorageClient.blobClient.getProperties();
  context.log(`Blob size: ${blobProperties.contentLength}`);

  // Download blob content
  const downloadResponse = await blobStorageClient.blobClient.download();
  context.log(`Content: ${downloadResponse}`);
}

// Register the function
app.storageBlob("storageBlobTrigger", {
  path: "snippets/{name}",
  connection: "AzureWebJobsStorage",
  sdkBinding: true, // Enable SDK binding
  handler: storageBlobTrigger,
});

Contoh ini menunjukkan cara mendapatkan ContainerClient dari pengikatan input Blob Storage menggunakan pemicu HTTP:

import "@azure/functions-extensions-blob"; // This is the mandatory first import for SDK binding
import { StorageBlobClient } from "@azure/functions-extensions-blob";
import {
  app,
  HttpRequest,
  HttpResponseInit,
  input,
  InvocationContext,
} from "@azure/functions";

const blobInput = input.storageBlob({
  path: "snippets",
  connection: "AzureWebJobsStorage",
  sdkBinding: true,
});

export async function listBlobs(
  request: HttpRequest,
  context: InvocationContext
): Promise<HttpResponseInit> {
  // Get input binding for a specific container
  const storageBlobClient = context.extraInputs.get(
    blobInput
  ) as StorageBlobClient;

  // List all blobs in the container
  const blobs = [];
  for await (const blob of storageBlobClient.containerClient.listBlobsFlat()) {
    blobs.push(blob.name);
  }

  return { jsonBody: { blobs } };
}

app.http("listBlobs", {
  methods: ["GET"],
  authLevel: "function",
  extraInputs: [blobInput],
  handler: listBlobs,
});

Contoh berikut menunjukkan kode TypeScript pemicu blob. Fungsi ini menulis log ketika blob ditambahkan atau diperbarui dalam kontainer samples-workitems.

String {name} di jalur pemicu blob samples-workitems/{name} membuat ekspresi binding yang dapat Anda gunakan dalam kode fungsi untuk access nama file blob pemicu. Untuk informasi selengkapnya, lihat Pola nama Blob nanti di artikel ini.

import { app, InvocationContext } from '@azure/functions';

export async function storageBlobTrigger1(blob: Buffer, context: InvocationContext): Promise<void> {
    context.log(
        `Storage blob function processed blob "${context.triggerMetadata.name}" with size ${blob.length} bytes`
    );
}

app.storageBlob('storageBlobTrigger1', {
    path: 'samples-workitems/{name}',
    connection: 'MyStorageAccountAppSetting',
    handler: storageBlobTrigger1,
});

Contoh berikut menunjukkan kode JavaScript pemicu blob. Fungsi ini menulis log ketika blob ditambahkan atau diperbarui dalam kontainer samples-workitems.

String {name} di jalur pemicu blob samples-workitems/{name} membuat ekspresi binding yang dapat Anda gunakan dalam kode fungsi untuk access nama file blob pemicu. Untuk informasi selengkapnya, lihat Pola nama Blob nanti di artikel ini.

const { app } = require('@azure/functions');

app.storageBlob('storageBlobTrigger1', {
    path: 'samples-workitems/{name}',
    connection: 'MyStorageAccountAppSetting',
    handler: (blob, context) => {
        context.log(
            `Storage blob function processed blob "${context.triggerMetadata.name}" with size ${blob.length} bytes`
        );
    },
});

Contoh berikut menunjukkan cara membuat fungsi yang berjalan saat file ditambahkan ke kontainer source blob storage.

File konfigurasi fungsi (function.json) menyertakan pengikatan dengan type dari blobTrigger dan direction diatur ke in.

{
  "bindings": [
    {
      "name": "InputBlob",
      "type": "blobTrigger",
      "direction": "in",
      "path": "source/{name}",
      "connection": "MyStorageAccountConnectionString"
    }
  ]
}

Berikut adalah kode terkait untuk file run.ps1.

param([byte[]] $InputBlob, $TriggerMetadata)

Write-Host "PowerShell Blob trigger: Name: $($TriggerMetadata.Name) Size: $($InputBlob.Length) bytes"

Contoh ini menggunakan jenis SDK untuk secara langsung access objek BlobClient yang mendasar yang disediakan oleh pemicu Blob storage:

import azure.functions as func
import azurefunctions.extensions.bindings.blob as blob

app = func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION)
@app.blob_trigger(
    arg_name="client", path="PATH/TO/BLOB", connection="AzureWebJobsStorage"
)
def blob_trigger(client: blob.BlobClient):
    logging.info(
        f"Python blob trigger function processed blob \n"
        f"Properties: {client.get_blob_properties()}\n"
        f"Blob content head: {client.download_blob().read(size=1)}"
    )

Untuk contoh penggunaan jenis SDK lainnya, lihat sampel ContainerClient dan StorageStreamDownloader. Untuk tutorial langkah demi langkah tentang cara menyertakan pengikatan jenis SDK di aplikasi fungsi Anda, ikuti pengikatan SDK Python untuk Sampel Blob.

Untuk mempelajari lebih lanjut, termasuk pengikatan jenis SDK lainnya yang didukung, lihat Pengikatan jenis SDK.

Contoh ini mencatat nama dan ukuran blob dari pemicu blob masuk.

import logging
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="BlobTrigger1")
@app.blob_trigger(arg_name="myblob", 
                  path="samples-workitems/{name}",
                  connection="MyStorageAccountAppSetting")
def test_function(myblob: func.InputStream):
   logging.info(f"Python blob trigger function processed blob \n"
                f"Name: {myblob.name}\n"
                f"Blob Size: {myblob.length} bytes")

Atribut

Baik in dan proses pekerja isolasi pustaka C# menggunakan atribut BlobAttribute untuk menentukan fungsi. Skrip C# sebagai gantinya menggunakan file konfigurasi function.json seperti yang dijelaskan dalam panduan pembuatan skrip C#.

Konstruktor atribut membutuhkan parameter berikut:

Pengaturan Deskripsi
BlobPath Jalan menuju blob.
Koneksi Nama pengaturan aplikasi atau kumpulan pengaturan yang menentukan cara menyambungkan ke blob Azure. Lihat Koneksi.
Access Menunjukkan apakah Anda akan membaca atau menulis.
Sumber Mengatur sumber peristiwa pemicu. Gunakan BlobTriggerSource.EventGrid untuk pemicu blob berbasis Event Grid, yang memberikan latensi yang lebih rendah. Defaultnya adalah BlobTriggerSource.LogsAndContainerScan, yang menggunakan mekanisme polling standar untuk mendeteksi perubahan dalam kontainer.

Berikut ini adalah atributBlobTrigger dalam metode yang khas:

[Function(nameof(BlobFunction))]
[BlobOutput("test-samples-output/{name}-output.txt")]
public static string Run(
    [BlobTrigger("test-samples-trigger/{name}")] string myTriggerItem,
    [BlobInput("test-samples-input/sample1.txt")] string myBlob,
    FunctionContext context)

Ketika Anda mengembangkan secara lokal, tambahkan pengaturan aplikasi di file local.settings.json dalam koleksi Values.

Dekorator

Hanya berlaku untuk model pemrograman Python v2.

Untuk fungsi Python v2 yang ditentukan menggunakan dekorator, properti berikut pada dekorator blob_trigger menentukan pemicu Blob Storage:

Properti Deskripsi
arg_name Menyatakan nama parameter dalam tanda tangan fungsi. Ketika fungsi dipicu, nilai parameter ini memiliki isi pesan antrean.
path container untuk dipantau. Mungkin pola nama blob.
connection Akun storage connection string.
source Mengatur sumber peristiwa pemicu. Gunakan EventGrid untuk pemicu blob berbasis Event Grid, yang memberikan latensi yang lebih rendah. Defaultnya adalah LogsAndContainerScan, yang menggunakan mekanisme polling standar untuk mendeteksi perubahan dalam kontainer.

Untuk fungsi Python yang ditentukan dengan menggunakan function.json, lihat bagian Konfigurasi .

Anotasi

Atribut @BlobTrigger digunakan untuk memberi Anda access ke blob yang memicu fungsi. Lihat contoh pemicu untuk detailnya. source Gunakan properti untuk mengatur sumber peristiwa pemicu. Gunakan EventGrid untuk pemicu blob berbasis Event Grid, yang memberikan latensi yang lebih rendah. Defaultnya adalah LogsAndContainerScan, yang menggunakan mekanisme polling standar untuk mendeteksi perubahan dalam kontainer. |

Konfigurasi

Hanya berlaku untuk model pemrograman Python v1.

Tabel berikut menjelaskan properti yang bisa Anda atur pada objek yang options diteruskan ke app.storageBlob() metode .

Properti Deskripsi
jalan container untuk dipantau. Mungkin pola nama blob.
koneksi Nama pengaturan aplikasi atau kumpulan pengaturan yang menentukan cara menyambungkan ke blob Azure. Lihat Koneksi.
sumber Mengatur sumber peristiwa pemicu. Gunakan EventGrid untuk pemicu blob berbasis Event Grid, yang memberikan latensi yang lebih rendah. Defaultnya adalah LogsAndContainerScan, yang menggunakan mekanisme polling standar untuk mendeteksi perubahan dalam kontainer.

Tabel berikut menjelaskan properti konfigurasi pengikatan yang Anda atur di file function.json.

Properti function.json Deskripsi
jenis Harus diatur ke blobTrigger. Properti ini diatur secara otomatis saat Anda membuat pemicu di Azure portal.
arah Harus diatur ke in. Properti ini diatur secara otomatis saat Anda membuat pemicu di Azure portal. Pengecualian di bagian penggunaan.
nama Nama variabel yang mewakili blob dalam kode fungsi.
jalan container untuk dipantau. Mungkin pola nama blob.
koneksi Nama pengaturan aplikasi atau kumpulan pengaturan yang menentukan cara menyambungkan ke blob Azure. Lihat Koneksi.
sumber Mengatur sumber peristiwa pemicu. Gunakan EventGrid untuk pemicu blob berbasis Event Grid, yang memberikan latensi yang lebih rendah. Defaultnya adalah LogsAndContainerScan, yang menggunakan mekanisme polling standar untuk mendeteksi perubahan dalam kontainer.

Lihat Bagian contoh untuk contoh lengkapnya.

Metainformasi

Pemicu blob menyediakan beberapa properti metadata. Properti ini dapat digunakan sebagai bagian dari ekspresi pengikatan dalam pengikatan lain atau sebagai parameter dalam kode Anda. Nilai-nilai ini memiliki semantik yang sama dengan jenis CloudBlob.

Properti Tipe Deskripsi
BlobTrigger string Jalur menuju blob pemicu.
Uri System.Uri URI blob untuk lokasi utama.
Properties BlobProperties Properti sistem blob.
Metadata IDictionary<string,string> Metadata yang ditentukan pengguna untuk blob.

Contoh berikut mencatat jalur ke blob pemicu, termasuk kontainer:

public static void Run(string myBlob, string blobTrigger, ILogger log)
{
    log.LogInformation($"Full blob path: {blobTrigger}");
} 

Metainformasi

Pemicu blob menyediakan beberapa properti metadata. Properti ini dapat digunakan sebagai bagian dari ekspresi pengikatan dalam pengikatan lain atau sebagai parameter dalam kode Anda.

Properti Deskripsi
blobTrigger Jalur menuju blob pemicu.
uri URI blob untuk lokasi utama.
properties Properti sistem blob.
metadata Metadata yang ditentukan pengguna untuk blob.

Metadata dapat diperoleh dari properti triggerMetadata objek yang disediakan context, seperti yang ditunjukkan dalam contoh berikut, yang mencatat jalur ke blob pemicu (blobTrigger), termasuk kontainer:

context.log(`Full blob path: ${context.triggerMetadata.blobTrigger}`);

Metainformasi

Metadata tersedia melalui parameter $TriggerMetadata.

Penggunaan

Jenis pengikatan yang didukung oleh pemicu Blob bergantung pada versi paket ekstensi dan modalitas C# yang digunakan di aplikasi fungsi Anda.

Pemicu blob dapat mengikat ke jenis berikut:

Tipe Deskripsi
string Konten blob sebagai string. Gunakan saat konten blob adalah teks sederhana.
byte[] Byte konten blob.
Jenis yang bisa diserialisasikan JSON Saat blob berisi data JSON, Functions mencoba mendeserialisasi data JSON ke dalam jenis objek CLR (POCO) yang berusia biasa.
Aliran1 Aliran input konten blob.
BlobClient1,
BlockBlobClient1,
PageBlobClient1,
AppendBlobClient1,
BlobBaseClient1
Klien yang terhubung ke blob. Set jenis ini menawarkan kontrol paling besar untuk memproses blob dan dapat digunakan untuk menulis kembali ke blob jika koneksi memiliki izin yang memadai.

1 Untuk menggunakan jenis ini, Anda perlu mereferensikan Microsoft. Azure. Functions.Worker.Extensions. Storage. Blob 6.0.0 atau yang lebih baru dan dependensi common untuk pengikatan jenis SDK.

Mengikat ke string, atau Byte[] hanya direkomendasikan jika ukuran blobnya kecil. Hal ini direkomendasikan karena seluruh konten blob dimuat ke dalam memori. Untuk sebagian besar blob, gunakan jenis Stream atau BlobClient. Untuk informasi selengkapnya, lihat Konkurensi dan penggunaan memori.

Jika Anda mendapatkan pesan kesalahan saat mencoba mengikat ke salah satu jenis SDK Storage, pastikan Anda memiliki referensi ke versi SDK Storage yang benar.

Anda juga dapat menggunakan StorageAccountAttribute untuk menentukan akun storage yang akan digunakan. Anda dapat melakukan ini ketika Anda perlu menggunakan akun storage yang berbeda dari fungsi lain di pustaka. Konstruktor mengambil nama pengaturan aplikasi yang berisi storage connection string. Atribut dapat diterapkan pada parameter, metode, atau tingkat kelas. Contoh berikut menunjukkan tingkat kelas dan tingkat metode:

[StorageAccount("ClassLevelStorageAppSetting")]
public static class AzureFunctions
{
    [FunctionName("BlobTrigger")]
    [StorageAccount("FunctionLevelStorageAppSetting")]
    public static void Run( //...
{
    ....
}

Akun storage yang akan digunakan ditentukan dalam urutan berikut:

  • Properti BlobTrigger milik atribut Connection.
  • Atribut StorageAccount yang diterapkan ke parameter yang sama dengan atribut BlobTrigger.
  • Atribut StorageAccount yang diterapkan ke fungsi.
  • StorageAccountAtribut yang diterapkan ke kelas.
  • Akun storage default untuk aplikasi fungsi, yang ditentukan dalam pengaturan aplikasi AzureWebJobsStorage.

Nota

Dukungan untuk pengikatan ke jenis SDK saat ini dalam pratinjau dan terbatas pada SDK Azure Blob Storage. Untuk informasi selengkapnya, lihat Jenis SDK di artikel referensi Java.

Access data blob sebagai argumen pertama untuk fungsi Anda.

Access data blob melalui parameter yang cocok dengan nama yang ditunjuk oleh parameter nama pengikatan dalam file function.json.

Access data blob melalui parameter yang ditik sebagai InputStream. Lihat contoh pemicu untuk detailnya.

Functions juga mendukung pengikatan jenis Python SDK untuk Azure Blob storage, yang memungkinkan Anda bekerja dengan data blob menggunakan jenis SDK yang mendasar ini:

Nota

Hanya jenis SDK sinkron yang didukung.

Penting

Dukungan jenis SDK untuk Python umumnya tersedia dan hanya didukung untuk model pemrograman Python v2. Untuk informasi selengkapnya, lihat Jenis SDK di Python.

Koneksi

Properti connection adalah referensi ke konfigurasi lingkungan yang menentukan bagaimana aplikasi harus terhubung ke blob Azure. Ini mungkin menentukan:

Jika nilai yang dikonfigurasi adalah kecocokan persis untuk pengaturan tunggal dan kecocokan awalan untuk pengaturan lainnya, kecocokan persis akan digunakan.

Rangkaian koneksi

Untuk mendapatkan connection string, ikuti langkah-langkah yang ditampilkan di Kelola kunci access akun storage. connection string harus untuk akun storage tujuan umum, bukan akun Blob storage.

Connection string ini harus disimpan dalam pengaturan aplikasi dengan nama yang cocok dengan nilai yang ditentukan oleh properti connection dari konfigurasi pengikatan.

Jika nama pengaturan aplikasi dimulai dengan "AzureWebJobs", Anda hanya dapat menentukan sisa namanya di sini. Misalnya, jika Anda mengatur connection ke "MyStorage", runtime Functions mencari pengaturan aplikasi yang bernama "MyStorage". Jika Anda membiarkan connection kosong, runtime Functions menggunakan Storage connection string default dalam pengaturan aplikasi yang bernama AzureWebJobsStorage.

Koneksi berbasis identitas

Jika Anda menggunakan version 5.x atau yang lebih tinggi dari ekstensi (bundle 3.x atau lebih tinggi untuk tumpukan bahasa non-.NET), alih-alih menggunakan connection string dengan rahasia, Anda dapat meminta aplikasi menggunakan identitas Microsoft Entra. Untuk menggunakan identitas, Anda menentukan pengaturan di bawah awalan umum yang memetakan ke connection properti dalam konfigurasi pemicu dan pengikatan.

Jika Anda mengatur connection ke "AzureWebJobsStorage", lihat Sambungkan ke host storage dengan identitas. Untuk semua koneksi lainnya, ekstensi tersebut memerlukan properti berikut:

Properti Templat variabel lingkungan Deskripsi Contoh nilai
URI Layanan Blob <CONNECTION_NAME_PREFIX>__serviceUri 1 URI sarana data dari layanan blob yang Anda sambungkan, menggunakan skema HTTPS. <https:// storage_account_name.blob.core.windows.net>

1<CONNECTION_NAME_PREFIX>__blobServiceUri dapat digunakan sebagai alias. Jika konfigurasi koneksi akan digunakan oleh pemicu blob, blobServiceUri juga harus disertai dengan queueServiceUri. Lihat bawah.

Formulir serviceUri tidak dapat digunakan saat konfigurasi koneksi keseluruhan akan digunakan di seluruh blob, antrean, dan/atau tabel. URI hanya dapat menunjuk layanan blob. Sebagai alternatif, Anda dapat menyediakan URI khusus untuk setiap layanan, sehingga memungkinkan penggunaan koneksi tunggal. Jika kedua versi disediakan, formulir multi-layanan digunakan. Untuk mengonfigurasi koneksi pada beberapa layanan, jangan gunakan <CONNECTION_NAME_PREFIX>__serviceUri, sebaiknya atur:

Properti Templat variabel lingkungan Deskripsi Contoh nilai
URI Layanan Blob <CONNECTION_NAME_PREFIX>__blobServiceUri URI sarana data dari layanan blob yang Anda sambungkan, menggunakan skema HTTPS. <https:// storage_account_name.blob.core.windows.net>
URI Layanan Antrean (diperlukan untuk pemicu blob2) <CONNECTION_NAME_PREFIX>__queueServiceUri URI data plane layanan antrean menggunakan skema HTTPS. Nilai ini hanya diperlukan untuk pemicu blob. <https://storage_account_name.queue.core.windows.net>

2 Pemicu blob menangani kegagalan di beberapa percobaan ulang dengan menulis blob poison ke antrean. Dalam formulir serviceUri, koneksi AzureWebJobsStorage digunakan. Namun, saat menentukan blobServiceUri, URI layanan antrean juga harus disediakan dengan queueServiceUri. Disarankan agar Anda menggunakan layanan dari akun storage yang sama dengan layanan blob. Anda juga perlu memastikan pemicu dapat membaca dan menulis pesan dalam layanan antrean yang dikonfigurasi dengan menetapkan peran seperti Storage Kontributor Data Antrean.

Properti lain mungkin diatur untuk menyesuaikan koneksi. Lihat Properti umum untuk koneksi berbasis identitas.

Identitas terkelola yang ditetapkan pengguna

Untuk menggunakan identitas terkelola yang ditetapkan pengguna, tambahkan credential properti dan clientId selain URI layanan:

Properti Templat variabel lingkungan Deskripsi Contoh nilai
URI Layanan Blob <CONNECTION_NAME_PREFIX>__blobServiceUri URI sarana data dari layanan blob. https://mystorageaccount.blob.core.windows.net
URI Layanan Antrean <CONNECTION_NAME_PREFIX>__queueServiceUri URI sarana data dari layanan antrean (diperlukan untuk pemicu blob). https://mystorageaccount.queue.core.windows.net
Credential <CONNECTION_NAME_PREFIX>__credential Harus diatur ke managedidentity. managedidentity
ID Pelanggan <CONNECTION_NAME_PREFIX>__clientId ID klien dari identitas terkelola yang ditetapkan pengguna. 00000000-0000-0000-0000-000000000000

Misalnya, jika konfigurasi pengikatan Anda menentukan connection = "BlobStorageConnection", Anda akan mengonfigurasi pengaturan aplikasi berikut:

{
    "BlobStorageConnection__blobServiceUri": "https://mystorageaccount.blob.core.windows.net",
    "BlobStorageConnection__queueServiceUri": "https://mystorageaccount.queue.core.windows.net",
    "BlobStorageConnection__credential": "managedidentity",
    "BlobStorageConnection__clientId": "00000000-0000-0000-0000-000000000000"
}

Petunjuk / Saran

Identitas terkelola yang ditetapkan pengguna direkomendasikan untuk skenario produksi di mana Anda memerlukan kontrol mendasar atas izin identitas di beberapa sumber daya.

Saat dihosting di layanan Azure Functions, koneksi berbasis identitas menggunakan identitas managed. Identitas yang ditetapkan sistem digunakan secara default, meskipun identitas yang ditetapkan pengguna dapat ditentukan dengan credential dan clientID properti. Perhatikan bahwa mengonfigurasi identitas yang ditetapkan oleh pengguna dengan ID sumber daya tidak didukung. Saat dijalankan dalam konteks lain, seperti pengembangan lokal, identitas pengembang Anda digunakan sebagai gantinya, meskipun ini dapat dikustomisasi. Lihat Pengembangan lokal dengan koneksi berbasis identitas.

Memberikan izin kepada identitas

Identitas apa pun yang digunakan harus memiliki izin untuk melakukan tindakan yang dimaksudkan. Untuk sebagian besar layanan Azure, ini berarti Anda perlu menetapkan peran dalam Azure RBAC, menggunakan peran bawaan atau kustom yang menyediakan izin tersebut.

Penting

Beberapa izin mungkin diekspos oleh layanan target yang tidak diperlukan untuk semua konteks. Jika memungkinkan, patuhi prinsip hak istimewa paling rendah, dengan memberikan identitas hanya hak istimewa yang diperlukan. Misalnya, jika aplikasi hanya perlu dapat membaca dari sumber data, gunakan peran yang hanya memiliki izin untuk membaca. Tidak pantas untuk menetapkan peran yang juga memungkinkan menulis ke layanan itu, karena ini akan menjadi izin yang berlebihan untuk operasi baca. Demikian pula, Anda ingin memastikan penetapan peran hanya mencakup sumber daya yang perlu dibaca.

Anda perlu membuat penetapan peran yang menyediakan access ke kontainer blob Anda saat runtime. Peran manajemen seperti Owner tidak cukup. Tabel berikut ini memperlihatkan peran bawaan yang direkomendasikan saat menggunakan ekstensi Blob Storage dalam operasi normal. Aplikasi Anda mungkin memerlukan izin lebih lanjut berdasarkan kode yang Anda tulis.

Jenis pengikatan Peran bawaan contoh
Pemicu Storage Pemilik Data BlobdanStorage Kontributor Data Antrean1

Izin tambahan juga harus diberikan ke koneksi AzureWebJobsStorage.2
Pengikatan masukan Storage Pembaca Data Blob
Pengikatan output Storage Pemilik Data Blob

1 Pemicu blob menangani kegagalan di beberapa percobaan ulang dengan menulis blob poison ke antrean pada akun storage yang ditentukan oleh koneksi.

2 Koneksi AzureWebJobsStorage digunakan secara internal untuk blob dan antrean yang mengaktifkan pemicu. Jika dikonfigurasi untuk menggunakan koneksi berbasis identitas, koneksi tersebut memerlukan izin tambahan di luar persyaratan default. Izin yang diperlukan dicakup oleh Storage Pemilik Data Blob, Storage Kontributor Data Antrean, dan peran Storage Kontributor Akun. Untuk mempelajari selengkapnya, lihat Hubungkan ke storage host dengan identitas.

Pola nama blob

Anda dapat menentukan pola nama blob di properti path di function.json atau di konstruktor atribut BlobTrigger. Pola nama bisa menjadi filter atau ekspresi pengikatan. Bagian berikut ini memberikan contoh.

Petunjuk / Saran

Nama kontainer tak boleh memuat pembagi kelompok dalam pola nama.

Dapatkan nama dan ekstensi file

Contoh berikut menunjukkan cara mengikat nama file dan ekstensi blob secara terpisah:

"path": "input/{blobname}.{blobextension}",

Jika blob diberi nama original-Blob1.txt, maka nilai blobname dan variabel blobextension dalam kode fungsi adalah original-Blob1 dan txt.

Filter pada nama blob

Contoh berikut hanya memicu pada blob di kontainer input yang dimulai dengan string "original-":

"path": "input/original-{name}",

Jika nama blob adalah original-Blob1.txt, nilai variabel name dalam kode fungsi adalah Blob1.txt.

Filter pada tipe file

Contoh berikut ini hanya memicu file .png:

"path": "samples/{name}.png",

Filter pada kurung kurawal dalam nama file

Untuk mencari kurung kurawal dalam nama file, keluar dari kurung dengan menggunakan dua kurung. Contoh berikut memfilter blob yang memiliki kurung kurawal dalam nama:

"path": "images/{{20140101}}-{name}",

Jika blob diberi nama {20140101}-soundfile.mp3, nilai name variabel dalam kode fungsi adalah soundfile.mp3.

Polling dan latensi

Polling berfungsi sebagai hibrid antara memeriksa log dan menjalankan pemindaian kontainer berkala. Blob dipindai dalam kelompok 10.000 sekaligus dengan token kelanjutan yang digunakan di antara interval. Jika aplikasi fungsi ada di paket Konsumsi, mungkin ada penundaan hingga 10 menit dalam memproses blob baru jika aplikasi fungsi menganggur.

Peringatan

Storage log dibuat berdasarkan "upaya terbaik". Tidak ada jaminan bahwa semua peristiwa dapat ditangkap. Dalam beberapa kondisi, log mungkin terlewatkan.

Jika Anda memerlukan pemrosesan blob yang lebih cepat atau lebih andal, Anda harus mempertimbangkan untuk mengalihkan hosting Anda untuk menggunakan paket App Service dengan Always On diaktifkan, yang dapat mengakibatkan peningkatan biaya. Anda mungkin juga mempertimbangkan untuk menggunakan pemicu selain pemicu blob polling klasik. Untuk informasi selengkapnya dan perbandingan berbagai opsi pemicu untuk kontainer blob storage, lihat Trigger pada kontainer blob.

Tanda terima blob

Runtime Azure Functions memastikan bahwa tidak ada fungsi pemicu blob yang dipanggil lebih dari sekali untuk blob baru atau yang diperbarui yang sama. Untuk menentukan apakah versi blob yang diberikan telah diproses, blob menyimpan tanda terima blob.

Azure Functions menyimpan tanda terima blob dalam kontainer bernama azure-webjobs-hosts di akun Azure storage untuk aplikasi fungsi Anda (ditentukan oleh pengaturan aplikasi AzureWebJobsStorage). Tanda terima blob memiliki informasi berikut:

  • Fungsi yang dipicu (<FUNCTION_APP_NAME>.Functions.<FUNCTION_NAME>, misalnya: MyFunctionApp.Functions.CopyBlob)
  • Nama kontainer
  • Tipe blob (BlockBlob atau PageBlob)
  • Nama blob
  • ETag (pengidentifikasi versi blob, misalnya: 0x8D1DC6E70A277EF)

Untuk memaksa pemrosesan ulang blob, hapus tanda terima blob untuk blob tersebut dari azure-webjobs-hosts kontainer secara manual. Meskipun pemrosesan ulang mungkin tidak segera terjadi, dijamin akan dilaksanakan di kemudian hari. Untuk segera diproses ulang, blob scaninfo dalam blob azure-webjobs-hosts/blobscaninfo dapat diperbarui. Setiap blob dengan cap waktu terakhir dimodifikasi setelah properti LatestScan akan dipindai lagi.

Blob racun

Ketika fungsi pemicu blob gagal untuk blob tertentu, Azure Functions mencoba kembali yang berfungsi total lima kali secara default.

Jika kelima percobaan gagal, Azure Functions menambahkan pesan ke antrean Storage bernama webjobs-blobtrigger-poison. Jumlah maksimum coba-ulang dapat diatur. Pengaturan MaxDequeueCount yang sama digunakan untuk penanganan blob racun dan penanganan pesan antrian racun. Pesan antrian untuk blob racun adalah objek JSON yang berisi properti berikut:

  • FunctionId (dalam format <FUNCTION_APP_NAME>.Functions.<FUNCTION_NAME>)
  • BlobType (BlockBlob atau PageBlob)
  • ContainerName
  • BlobName
  • ETag (pengidentifikasi versi blob, misalnya: 0x8D1DC6E70A277EF)

Penggunaan dan konkurensi memori

Ketika Anda mengikat ke jenis output yang tidak mendukung streaming, seperti string, atau Byte[], runtime harus memuat seluruh blob ke dalam memori lebih dari satu kali selama pemrosesan. Ini dapat mengakibatkan penggunaan memori yang lebih tinggi dari yang diharapkan saat memproses blob. Jika memungkinkan, gunakan jenis yang mendukung aliran. Dukungan jenis tergantung pada mode C# dan versi ekstensi. Untuk informasi selengkapnya, lihat jenis Binding.

Saat ini, runtime harus memuat seluruh blob ke dalam memori lebih dari satu kali selama pemrosesan. Ini dapat mengakibatkan penggunaan memori yang lebih tinggi dari yang diharapkan saat memproses blob.

Penggunaan memori dapat terpengaruh lebih lanjut ketika beberapa instans fungsi memproses data blob secara bersamaan. Jika Anda mengalami masalah memori menggunakan pemicu Blob, pertimbangkan untuk mengurangi jumlah eksekusi bersamaan yang diizinkan. Mengurangi konkurensi dapat memiliki efek samping meningkatkan backlog blob yang menunggu untuk diproses. Batas memori aplikasi fungsi Anda bergantung pada paket. Untuk informasi selengkapnya, lihat Batas layanan.

Cara Anda dapat mengontrol jumlah eksekusi bersamaan tergantung pada versi ekstensi Storage yang Anda gunakan.

Saat menggunakan ekstensi Storage versi 5.0.0 atau versi yang lebih baru, Anda mengontrol konkurensi pemicu dengan menggunakan pengaturan maxDegreeOfParallelism dalam konfigurasi blobs di host.json.

Batas berlaku secara terpisah untuk setiap fungsi yang menggunakan pemicu blob.

properti host.json

File host.json berisi pengaturan yang mengontrol perilaku pemicu blob. Lihat bagian pengaturan host.json untuk detail mengenai pengaturan yang tersedia.

Langkah berikutnya