Pengikatan input Tabel Azure untuk Azure Functions

Gunakan pengikatan input Tabel Azure untuk membaca tabel di Azure Cosmos DB untuk Tabel atau Azure Table Storage.

Untuk informasi tentang pengaturan dan detail konfigurasi, lihat gambaran umum.

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 Node.js Azure Functions. Untuk mempelajari selengkapnya tentang perbedaan antara v3 dan v4, lihat panduan migrasi.

Contoh

Penggunaan pengikatan bergantung pada versi paket ekstensi, dan modalitas C# yang digunakan dalam aplikasi fungsi Anda, yang dapat berupa salah satu hal berikut:

Pustaka kelas proses pekerja terisolasi yang dikompilasi fungsi C# berjalan dalam proses yang diisolasi dari runtime.

Pilih versi untuk melihat contoh mode dan versinya.

Kelas MyTableData berikut mewakili baris data dalam tabel:

public class MyTableData : Azure.Data.Tables.ITableEntity
{
    public string Text { get; set; }

    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public DateTimeOffset? Timestamp { get; set; }
    public ETag ETag { get; set; }
}

Fungsi berikut, yang dimulai oleh pemicu Queue Storage, membaca kunci baris dari antrean dan mendapatkan baris dari tabel input. Ekspresi {queueTrigger} mengikat kunci baris ke metadata pesan yang merupakan string pesan.

[Function("TableFunction")]
[TableOutput("OutputTable", Connection = "AzureWebJobsStorage")]
public static MyTableData Run(
    [QueueTrigger("table-items")] string input,
    [TableInput("MyTable", "<PartitionKey>", "{queueTrigger}")] MyTableData tableInput,
    FunctionContext context)
{
    var logger = context.GetLogger("TableFunction");

    logger.LogInformation($"PK={tableInput.PartitionKey}, RK={tableInput.RowKey}, Text={tableInput.Text}");

    return new MyTableData()
    {
        PartitionKey = "queue",
        RowKey = Guid.NewGuid().ToString(),
        Text = $"Output record with rowkey {input} created at {DateTime.Now}"
    };
}

Fungsi yang dipicu Antrean berikut memunculkan 5 entitas pertama sebagai IEnumerable<T>, dengan nilai kunci partisi yang ditetapkan sebagai pesan antrean.

[Function("TestFunction")]
public static void Run([QueueTrigger("myqueue", Connection = "AzureWebJobsStorage")] string partition,
    [TableInput("inTable", "{queueTrigger}", Take = 5, Filter = "Text eq 'test'", 
    Connection = "AzureWebJobsStorage")] IEnumerable<MyTableData> tableInputs,
    FunctionContext context)
{
    var logger = context.GetLogger("TestFunction");
    logger.LogInformation(partition);
    foreach (MyTableData tableInput in tableInputs)
    {
        logger.LogInformation($"PK={tableInput.PartitionKey}, RK={tableInput.RowKey}, Text={tableInput.Text}");
    }
}

Properti Filter dan Take digunakan untuk membatasi jumlah entitas yang dimunculkan.

Contoh berikut menunjukkan fungsi yang dipicu HTTP yang mengembalikan daftar objek orang yang berada dalam partisi tertentu dalam penyimpanan Table. Dalam contoh tersebut, kunci partisi diekstrak dari rute http, sementara tableName serta koneksi berasal dari pengaturan fungsi.

public class Person {
    private String PartitionKey;
    private String RowKey;
    private String Name;

    public String getPartitionKey() { return this.PartitionKey; }
    public void setPartitionKey(String key) { this.PartitionKey = key; }
    public String getRowKey() { return this.RowKey; }
    public void setRowKey(String key) { this.RowKey = key; }
    public String getName() { return this.Name; }
    public void setName(String name) { this.Name = name; }
}

@FunctionName("getPersonsByPartitionKey")
public Person[] get(
        @HttpTrigger(name = "getPersons", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.FUNCTION, route="persons/{partitionKey}") HttpRequestMessage<Optional<String>> request,
        @BindingName("partitionKey") String partitionKey,
        @TableInput(name="persons", partitionKey="{partitionKey}", tableName="%MyTableName%", connection="MyConnectionString") Person[] persons,
        final ExecutionContext context) {

    context.getLogger().info("Got query for person related to persons with partition key: " + partitionKey);

    return persons;
}

Anotasi TableInput juga dapat mengekstrak pengikatan dari isi json permintaan, seperti yang ditunjukkan pada contoh berikut.

@FunctionName("GetPersonsByKeysFromRequest")
public HttpResponseMessage get(
        @HttpTrigger(name = "getPerson", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.FUNCTION, route="query") HttpRequestMessage<Optional<String>> request,
        @TableInput(name="persons", partitionKey="{partitionKey}", rowKey = "{rowKey}", tableName="%MyTableName%", connection="MyConnectionString") Person person,
        final ExecutionContext context) {

    if (person == null) {
        return request.createResponseBuilder(HttpStatus.NOT_FOUND)
                    .body("Person not found.")
                    .build();
    }

    return request.createResponseBuilder(HttpStatus.OK)
                    .header("Content-Type", "application/json")
                    .body(person)
                    .build();
}

Contoh berikut menggunakan filter untuk mengkueri orang dengan nama tertentu dalam Azure Table, dan membatasi jumlah kemungkinan kecocokan hingga 10 hasil.

@FunctionName("getPersonsByName")
public Person[] get(
        @HttpTrigger(name = "getPersons", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.FUNCTION, route="filter/{name}") HttpRequestMessage<Optional<String>> request,
        @BindingName("name") String name,
        @TableInput(name="persons", filter="Name eq '{name}'", take = "10", tableName="%MyTableName%", connection="MyConnectionString") Person[] persons,
        final ExecutionContext context) {

    context.getLogger().info("Got query for person related to persons with name: " + name);

    return persons;
}

Contoh berikut menunjukkan pengikatan input tabel yang menggunakan pemicu antrean untuk membaca satu baris tabel. Pengikatan menentukan partitionKey dan rowKey. Nilai rowKey "{queueTrigger}" menunjukkan bahwa tombol baris berasal dari string pesan antrean.

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

const tableInput = input.table({
    tableName: 'Person',
    partitionKey: 'Test',
    rowKey: '{queueTrigger}',
    connection: 'MyStorageConnectionAppSetting',
});

interface PersonEntity {
    PartitionKey: string;
    RowKey: string;
    Name: string;
}

export async function storageQueueTrigger1(queueItem: unknown, context: InvocationContext): Promise<void> {
    context.log('Node.js queue trigger function processed work item', queueItem);
    const person = <PersonEntity>context.extraInputs.get(tableInput);
    context.log('Person entity name: ' + person.Name);
}

app.storageQueue('storageQueueTrigger1', {
    queueName: 'myqueue-items',
    connection: 'MyStorageConnectionAppSetting',
    extraInputs: [tableInput],
    handler: storageQueueTrigger1,
});
const { app, input } = require('@azure/functions');

const tableInput = input.table({
    tableName: 'Person',
    partitionKey: 'Test',
    rowKey: '{queueTrigger}',
    connection: 'MyStorageConnectionAppSetting',
});

app.storageQueue('storageQueueTrigger1', {
    queueName: 'myqueue-items',
    connection: 'MyStorageConnectionAppSetting',
    extraInputs: [tableInput],
    handler: (queueItem, context) => {
        context.log('Node.js queue trigger function processed work item', queueItem);
        const person = context.extraInputs.get(tableInput);
        context.log('Person entity name: ' + person.Name);
    },
});

Fungsi berikut menggunakan pemicu antrean untuk membaca satu baris tabel sebagai input ke fungsi.

Dalam contoh ini, konfigurasi pengikatan menentukan nilai eksplisit untuk partitionKey tabel dan menggunakan ekspresi untuk meneruskan ke rowKey. Ekspresi rowKey, yaitu {queueTrigger}, menunjukkan bahwa tombol baris berasal dari string pesan antrean.

Konfigurasi pengikatan di function.json:

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "MyQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "PersonEntity",
      "type": "table",
      "tableName": "Person",
      "partitionKey": "Test",
      "rowKey": "{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    }
  ],
  "disabled": false
}

Kode PowerShell di run.ps1:

param($MyQueueItem, $PersonEntity, $TriggerMetadata)
Write-Host "PowerShell queue trigger function processed work item: $MyQueueItem"
Write-Host "Person entity name: $($PersonEntity.Name)"

Fungsi berikut menggunakan pemicu HTTP untuk membaca satu baris tabel sebagai input ke fungsi.

Dalam contoh ini, konfigurasi pengikatan menentukan nilai eksplisit untuk partitionKey tabel dan menggunakan ekspresi untuk diteruskan ke rowKey. Ekspresi rowKey, {id} menunjukkan bahwa kunci baris berasal dari bagian {id} pada rute dalam permintaan.

Konfigurasi pengikatan dalam file function.json:

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "messageJSON",
      "type": "table",
      "tableName": "messages",
      "partitionKey": "message",
      "rowKey": "{id}",
      "connection": "AzureWebJobsStorage",
      "direction": "in"
    },
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ],
      "route": "messages/{id}"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ],
  "disabled": false
}

Kode Python dalam file __init__.py:

import json

import azure.functions as func

def main(req: func.HttpRequest, messageJSON) -> func.HttpResponse:

    message = json.loads(messageJSON)
    return func.HttpResponse(f"Table row: {messageJSON}")

Dengan pengikatan sederhana ini, Anda tidak dapat menangani kasus secara terprogram ketika tidak ditemukan baris yang memiliki ID kunci baris. Untuk pemilihan data yang lebih halus, gunakan SDK penyimpanan.


Atribut

Pustaka C# proses dalam proses dan terisolasi menggunakan atribut untuk menentukan fungsi. Skrip C# sebagai gantinya menggunakan file konfigurasi function.json seperti yang dijelaskan dalam panduan pembuatan skrip C#.

Pada pustaka kelas C#, TableInputAttribute mendukung properti berikut:

Properti atribut Deskripsi
TableName Nama tabel.
PartitionKey Opsional. Kunci partisi entitas tabel untuk dibaca.
RowKey Opsional. Tombol baris entitas tabel untuk dibaca.
Ambil Opsional. Jumlah maksimum entitas yang akan dibaca ke dalam IEnumerable<T>. Tidak dapat digunakan dengan RowKey.
Filter Opsional. Ekspresi filter OData untuk entitas yang akan dibaca ke dalam IEnumerable<T>. Tidak dapat digunakan dengan RowKey.
Koneksi Nama pengaturan aplikasi atau koleksi pengaturan yang menentukan cara tersambung ke layanan tabel. Lihat Koneksi.

Anotasi

Dalam pustaka runtime fungsi Java, gunakan anotasi @TableInput pada parameter yang nilainya berasal dari penyimpanan Table. Anotasi ini dapat digunakan dengan jenis Java asli, POJO, atau nilai yang dapat diubah ke null menggunakan Optional<T>. Anotasi ini mendukung elemen berikut:

Elemen Deskripsi
nama Nama variabel yang mewakili tabel atau entitas dalam kode fungsi.
tableName Nama tabel.
partitionKey Opsional. Kunci partisi entitas tabel untuk dibaca.
rowKey Opsional. Tombol baris entitas tabel untuk dibaca.
take Opsional. Jumlah maksimum entitas yang akan dibaca.
filter Opsional. Ekspresi filter OData untuk input tabel.
koneksi Nama pengaturan aplikasi atau koleksi pengaturan yang menentukan cara tersambung ke layanan tabel. Lihat Koneksi.

Konfigurasi

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

Properti Deskripsi
tableName Nama tabel.
partitionKey Opsional. Kunci partisi entitas tabel untuk dibaca.
rowKey Opsional. Tombol baris entitas tabel untuk dibaca. Tidak dapat digunakan dengan take atau filter.
take Opsional. Jumlah maksimum entitas yang akan dimunculkan. Tidak dapat digunakan dengan rowKey.
filter Opsional. Ekspresi filter OData agar entitas muncul dari tabel. Tidak dapat digunakan dengan rowKey.
koneksi Nama pengaturan aplikasi atau koleksi pengaturan yang menentukan cara tersambung ke layanan tabel. Lihat Koneksi.

Konfigurasi

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

Properti function.json Deskripsi
jenis Harus diatur ke table. Properti ini diatur secara otomatis saat Anda membuat pengikatan di portal Microsoft Azure.
arah Harus diatur ke in. Properti ini diatur secara otomatis saat Anda membuat pengikatan di portal Microsoft Azure.
nama Nama variabel yang mewakili tabel atau entitas dalam kode fungsi.
tableName Nama tabel.
partitionKey Opsional. Kunci partisi entitas tabel untuk dibaca.
rowKey Opsional. Tombol baris entitas tabel untuk dibaca. Tidak dapat digunakan dengan take atau filter.
take Opsional. Jumlah maksimum entitas yang akan dimunculkan. Tidak dapat digunakan dengan rowKey.
filter Opsional. Ekspresi filter OData agar entitas muncul dari tabel. Tidak dapat digunakan dengan rowKey.
koneksi Nama pengaturan aplikasi atau koleksi pengaturan yang menentukan cara tersambung ke layanan tabel. Lihat Koneksi.

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

Koneksi

Properti connection adalah referensi ke konfigurasi lingkungan yang menentukan cara aplikasi seharusnya tersambung ke layanan tabel Anda. Ini mungkin menentukan:

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

String koneksi

Untuk mendapatkan string koneksi untuk tabel di penyimpanan Azure Table, ikuti langkah-langkah yang ditampilkan di Mengelola kunci akses akun penyimpanan. Untuk mendapatkan string koneksi untuk tabel di Azure Cosmos DB for Table, ikuti langkah-langkah yang ditunjukkan di Tanya Jawab Umum Azure Cosmos DB for Table.

String koneksi ini harus disimpan dalam pengaturan aplikasi dengan nama yang cocok dengan nilai yang ditentukan oleh properti connection 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 bahasa umum Functions menggunakan string koneksi Storage default di pengaturan aplikasi yang bernama AzureWebJobsStorage.

Koneksi berbasis identitas

Jika Anda menggunakan ekstensi Tables API, alih-alih menggunakan string koneksi dengan rahasia, Anda dapat meminta aplikasi menggunakan identitas Microsoft Entra. Hal ini hanya berlaku saat mengakses tabel di Azure Storage. 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 Koneksi untuk menghosting penyimpanan dengan identitas. Untuk semua koneksi lainnya, ekstensi tersebut memerlukan properti berikut:

Properti Templat variabel lingkungan Deskripsi Contoh nilai
URI Layanan Tabel <CONNECTION_NAME_PREFIX>__tableServiceUri1 URI sarana data layanan tabel Azure Storage yang Anda sambungkan, menggunakan skema HTTPS. https://<storage_account_name>.table.core.windows.net

1<CONNECTION_NAME_PREFIX>__serviceUri dapat digunakan sebagai alias. Jika kedua formulir disediakan, tableServiceUri formulir akan digunakan. Formulir serviceUri tidak dapat digunakan saat konfigurasi koneksi keseluruhan akan digunakan di seluruh blob, antrean, dan/atau tabel.

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

Formulir serviceUri tidak dapat digunakan saat konfigurasi koneksi keseluruhan akan digunakan di seluruh blob, antrean, dan/atau tabel di Azure Storage. URI hanya dapat menunjuk layanan tabel. Sebagai alternatif, Anda dapat menyediakan URI khusus untuk setiap layanan dengan awalan yang sama, memungkinkan satu koneksi untuk digunakan.

Saat dihosting di layanan Azure Functions, koneksi berbasis identitas menggunakan identitas terkelola. 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 di 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 harus membuat penetapan peran yang menyediakan akses ke layanan tabel Azure Storage Anda saat runtime. Peran manajemen seperti Pemilik tidak cukup. Tabel berikut ini memperlihatkan peran bawaan yang direkomendasikan saat menggunakan ekstensi Azure Tables terhadap Azure Storage dalam operasi normal. Aplikasi Anda mungkin memerlukan izin tambahan berdasarkan kode yang Anda tulis.

Jenis pengikatan Contoh peran bawaan (Azure Storage1)
Pengikatan masukan Pembaca Data Tabel Penyimpanan
Pengikatan output Kontributor Data Tabel Penyimpanan

1 Jika aplikasi Anda tersambung ke tabel di Azure Cosmos DB for Table, menggunakan identitas tidak didukung dan koneksi harus menggunakan string koneksi.

Penggunaan

Penggunaan pengikatan tergantung pada versi paket ekstensi, dan modalitas C# yang digunakan dalam aplikasi fungsi Anda, yang dapat berupa salah satu hal berikut:

Pustaka kelas proses pekerja terisolasi yang dikompilasi fungsi C# berjalan dalam proses yang diisolasi dari runtime.

Pilih versi guna melihat detail penggunaan untuk mode dan versi.

Saat bekerja dengan entitas tabel tunggal, pengikatan input Tabel Azure dapat mengikat ke jenis berikut:

Tipe Deskripsi
Jenis JSON yang dapat diserialisasi yang mengimplementasikan ITableEntity Fungsi mencoba untuk mendeserialisasi entitas ke dalam jenis objek CLR (POCO) biasa-lama. Jenis harus mengimplementasikan ITableEntity atau memiliki properti string RowKey dan properti string PartitionKey .
TableEntity1 Entitas sebagai jenis seperti kamus.

Saat bekerja dengan beberapa entitas dari kueri, pengikatan input Tabel Azure dapat mengikat ke jenis berikut:

Tipe Deskripsi
IEnumerable<T> di mana T mengimplementasikan ITableEntity Enumerasi entitas yang dikembalikan oleh kueri. Setiap entri mewakili satu entitas. Jenis harus mengimplementasikan ITableEntity atau memiliki properti string RowKey dan properti stringPartitionKey.T
TableClient1 Klien yang tersambung ke tabel. Ini menawarkan kontrol terbanyak untuk memproses tabel dan dapat digunakan untuk menulis ke tabel jika koneksi memiliki izin yang memadai.

1 Untuk menggunakan jenis ini, Anda perlu mereferensikan Microsoft.Azure.Functions.Worker.Extensions.Tables 1.2.0 atau yang lebih baru dan dependensi umum untuk pengikatan jenis SDK.

Atribut TableInput memberi Anda akses ke baris tabel yang memicu fungsi.

Dapatkan data baris input dengan menggunakan context.extraInputs.get().

Data diteruskan ke parameter input seperti yang ditentukan oleh kunci name dalam file function.json. Menentukan partitionKey dan rowKey memungkinkan Anda memfilter ke baris tertentu.

Data tabel diteruskan ke fungsi sebagai string JSON. Batalkan serialisasi pesan dengan memanggil json.loads seperti yang ditunjukkan dalam contoh input.

Untuk detail penggunaan tertentu, lihat Contoh.

Langkah berikutnya