Vstupní vazby tabulek Azure pro Azure Functions

Vstupní vazbu tabulek Azure slouží ke čtení tabulky ve službě Azure Cosmos DB pro tabulky nebo Azure Table Storage.

Informace o nastavení a konfiguraci najdete v přehledu.

Důležité

Tento článek používá karty pro podporu více verzí programovacího modelu Node.js. Model v4 je obecně dostupný a je navržený tak, aby měl flexibilnější a intuitivnější prostředí pro vývojáře v JavaScriptu a TypeScriptu. Další podrobnosti o tom, jak model v4 funguje, najdete v příručce pro vývojáře služby Azure Functions Node.js. Další informace o rozdílech mezi v3 a v4 najdete v průvodci migrací.

Příklad

Použití vazby závisí na verzi balíčku rozšíření a režimu jazyka C# používaném ve vaší aplikaci funkcí, což může být jedna z následujících možností:

Kompilovaná funkce C# v izolované knihovně tříd pracovních procesů běží v procesu izolovaném od modulu runtime.

Zvolte verzi, abyste viděli příklady pro režim a verzi.

Následující MyTableData třída představuje řádek dat v tabulce:

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

Následující funkce, která je spuštěna triggerem Queue Storage, čte klíč řádku z fronty, která slouží k získání řádku ze vstupní tabulky. Výraz {queueTrigger} sváže klíč řádku s metadaty zprávy, což je řetězec zprávy.

[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}"
    };
}

Následující funkce aktivovaná frontou vrátí prvních 5 entit jako hodnotu IEnumerable<T>klíče oddílu nastavenou jako zprávu fronty.

[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}");
    }
}

Take Vlastnosti Filter se používají k omezení počtu vrácených entit.

Následující příklad ukazuje funkci aktivovanou protokolem HTTP, která vrátí seznam objektů osob, které jsou v zadaném oddílu v Table Storage. V příkladu se klíč oddílu extrahuje ze trasy HTTP a název tabulky a připojení jsou z nastavení funkce.

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

Poznámka TableInput může také extrahovat vazby z textu json požadavku, jak ukazuje následující příklad.

@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();
}

Následující příklad používá filtr k dotazování na osoby s konkrétním názvem v tabulce Azure a omezuje počet možných shod na 10 výsledků.

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

Následující příklad ukazuje vstupní vazbu tabulky, která používá trigger fronty ke čtení jednoho řádku tabulky. Vazba určuje a partitionKey rowKey. Hodnota rowKey {queueTrigger} označuje, že klíč řádku pochází z řetězce zprávy fronty.

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);
    },
});

Následující funkce používá trigger fronty ke čtení jednoho řádku tabulky jako vstupu do funkce.

V tomto příkladu konfigurace vazby určuje explicitní hodnotu tabulky partitionKey a používá výraz k předání do objektu rowKey. Výraz rowKey označuje, {queueTrigger}že klíč řádku pochází z řetězce zprávy fronty.

Konfigurace vazby v 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
}

Kód PowerShellu v souboru run.ps1:

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

Následující funkce používá trigger HTTP ke čtení jednoho řádku tabulky jako vstupu do funkce.

V tomto příkladu konfigurace vazby určuje explicitní hodnotu tabulky partitionKey a používá výraz k předání do objektu rowKey. Výraz rowKey označuje, {id} že klíč řádku pochází z {id} části trasy v požadavku.

Konfigurace vazby v souboru 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
}

Kód Pythonu v souboru __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}")

Pomocí této jednoduché vazby nemůžete programově zpracovat případ, ve kterém se nenajde žádný řádek s ID klíče řádku. K podrobnějšímu výběru dat použijte sadu SDK úložiště.


Atributy

Knihovny C# v procesu i izolovaného pracovního procesu používají atributy k definování funkce. Skript jazyka C# místo toho používá konfigurační soubor function.json, jak je popsáno v průvodci skriptováním jazyka C#.

V knihovnách tříd jazyka TableInputAttribute C# podporuje následující vlastnosti:

Vlastnost atributu Popis
TableName Název tabulky.
PartitionKey Nepovinné. Klíč oddílu entity tabulky, který se má přečíst.
RowKey Nepovinné. Klíč řádku entity tabulky, který se má přečíst.
Vzít Nepovinné. Maximální počet entit, které se mají načíst do objektu IEnumerable<T>. Nelze použít s RowKey.
Filtr Nepovinné. Výraz filtru OData pro entity, které se mají číst do objektu IEnumerable<T>. Nelze použít s RowKey.
Připojení Název nastavení aplikace nebo nastavení kolekce, která určuje, jak se připojit ke službě Table Service. Viz Připojení.

Poznámky

V knihovně modulu runtime funkcí Java použijte poznámku @TableInput k parametrům, jejichž hodnota pochází z table storage. Tuto poznámku lze použít s nativními typy Javy, POJOs nebo hodnotami null s použitím Optional<T>. Tato poznámka podporuje následující prvky:

Element (Prvek) Popis
Jméno Název proměnné, která představuje tabulku nebo entitu v kódu funkce.
tableName Název tabulky.
partitionKey Nepovinné. Klíč oddílu entity tabulky, který se má přečíst.
rowKey Nepovinné. Klíč řádku entity tabulky, který se má přečíst.
vzít Nepovinné. Maximální počet entit, které se mají přečíst.
filter Nepovinné. Výraz filtru OData pro vstup tabulky.
připojení Název nastavení aplikace nebo nastavení kolekce, která určuje, jak se připojit ke službě Table Service. Viz Připojení.

Konfigurace

Následující tabulka vysvětluje vlastnosti, které můžete nastavit u objektu předaného options metodě input.table() .

Vlastnost Popis
tableName Název tabulky.
partitionKey Nepovinné. Klíč oddílu entity tabulky, který se má přečíst.
rowKey Nepovinné. Klíč řádku entity tabulky, který se má přečíst. Nelze použít s take nebo filter.
vzít Nepovinné. Maximální počet entit, které se mají vrátit. Nelze použít s rowKey.
filter Nepovinné. Výraz filtru OData pro entity, které se mají vrátit z tabulky. Nelze použít s rowKey.
připojení Název nastavení aplikace nebo nastavení kolekce, která určuje, jak se připojit ke službě Table Service. Viz Připojení.

Konfigurace

Následující tabulka vysvětluje vlastnosti konfigurace vazby, které jste nastavili v souboru function.json .

vlastnost function.json Popis
type Musí být nastavena na tablehodnotu . Tato vlastnost se nastaví automaticky při vytváření vazby na webu Azure Portal.
direction Musí být nastavena na inhodnotu . Tato vlastnost se nastaví automaticky při vytváření vazby na webu Azure Portal.
Jméno Název proměnné, která představuje tabulku nebo entitu v kódu funkce.
tableName Název tabulky.
partitionKey Nepovinné. Klíč oddílu entity tabulky, který se má přečíst.
rowKey Nepovinné. Klíč řádku entity tabulky, který se má přečíst. Nelze použít s take nebo filter.
vzít Nepovinné. Maximální počet entit, které se mají vrátit. Nelze použít s rowKey.
filter Nepovinné. Výraz filtru OData pro entity, které se mají vrátit z tabulky. Nelze použít s rowKey.
připojení Název nastavení aplikace nebo nastavení kolekce, která určuje, jak se připojit ke službě Table Service. Viz Připojení.

Při místním vývoji přidejte nastavení aplikace do souboru local.settings.json v kolekci Values .

Propojení

Vlastnost connection je odkazem na konfiguraci prostředí, která určuje, jak se má aplikace připojit k tabulkové službě. Může zadat:

Pokud je nakonfigurovaná hodnota přesná shoda pro jedno nastavení i shodu předpony pro jiná nastavení, použije se přesná shoda.

Connection string

Pokud chcete získat připojovací řetězec pro tabulky ve službě Azure Table Storage, postupujte podle kroků uvedených v tématu Správa přístupových klíčů účtu úložiště. Pokud chcete získat připojovací řetězec pro tabulky ve službě Azure Cosmos DB for Table, postupujte podle kroků uvedených v nejčastějších dotazech ke službě Azure Cosmos DB for Table.

Tato připojovací řetězec by měla být uložena v nastavení aplikace s názvem, který connection odpovídá hodnotě určené vlastností konfigurace vazby.

Pokud název nastavení aplikace začíná na "AzureWebJobs", můžete zde zadat pouze zbytek názvu. Pokud například nastavíte connection "MyStorage", modul runtime Functions vyhledá nastavení aplikace s názvem AzureWebJobsMyStorage. Pokud necháte connection prázdné, modul runtime Služby Functions použije výchozí připojovací řetězec úložiště v nastavení aplikace, které je pojmenované AzureWebJobsStorage.

Připojení založená na identitách

Pokud používáte rozšíření Api pro tabulky, nemusíte používat připojovací řetězec s tajným kódem, můžete aplikaci použít identitu Microsoft Entra. To platí jenom při přístupu k tabulkám ve službě Azure Storage. Pokud chcete použít identitu, definujete nastavení pod běžnou předponou, která se mapuje na connection vlastnost v konfiguraci triggeru a vazby.

Pokud nastavujete connection azureWebJobsStorage, přečtěte si téma Připojení k hostitelskému úložišti pomocí identity. Pro všechna ostatní připojení rozšíření vyžaduje následující vlastnosti:

Vlastnost Šablona proměnné prostředí Popis Příklad hodnoty
Table Service URI <CONNECTION_NAME_PREFIX>__tableServiceUri1 Identifikátor URI roviny dat služby Azure Storage, ke které se připojujete, pomocí schématu HTTPS. <https:// storage_account_name.table.core.windows.net>

1 <CONNECTION_NAME_PREFIX>__serviceUri lze použít jako alias. Pokud jsou k dispozici oba formuláře, použije se tableServiceUri formulář. Formulář serviceUri nelze použít, pokud se má použít celková konfigurace připojení napříč objekty blob, frontami a/nebo tabulkami.

Pro přizpůsobení připojení mohou být nastaveny další vlastnosti. Viz Běžné vlastnosti pro připojení založená na identitě.

Formulář serviceUri se nedá použít, pokud se má celková konfigurace připojení použít napříč objekty blob, frontami a/nebo tabulkami ve službě Azure Storage. Identifikátor URI může určit pouze službu tabulky. Jako alternativu můžete zadat identifikátor URI speciálně pro každou službu pod stejnou předponou, což umožňuje použití jediného připojení.

Při hostovaní ve službě Azure Functions používají připojení založená na identitách spravovanou identitu. Identita přiřazená systémem se používá ve výchozím nastavení, i když je možné zadat identitu přiřazenou uživatelem s vlastnostmi a clientID vlastnostmicredential. Všimněte si, že konfigurace identity přiřazené uživatelem s ID prostředku se nepodporuje . Při spuštění v jiných kontextech, jako je místní vývoj, se místo toho použije vaše identita vývojáře, i když je možné ji přizpůsobit. Viz Místní vývoj s připojeními založenými na identitách.

Udělení oprávnění identitě

Jakákoli identita, kterou používáte, musí mít oprávnění k provedení zamýšlených akcí. U většiny služeb Azure to znamená, že potřebujete přiřadit roli v Azure RBAC pomocí předdefinovaných nebo vlastních rolí, které tato oprávnění poskytují.

Důležité

Cílová služba může zpřístupnit některá oprávnění, která nejsou nutná pro všechny kontexty. Pokud je to možné, dodržujte zásadu nejnižšího oprávnění a udělte identitě pouze požadovaná oprávnění. Pokud například aplikace potřebuje jen číst ze zdroje dat, použijte roli, která má oprávnění jen ke čtení. Přiřazení role, která také umožňuje zápis do této služby, by bylo nevhodné, protože by to bylo nadměrné oprávnění pro operaci čtení. Podobně byste chtěli zajistit, aby přiřazení role bylo vymezeno pouze nad prostředky, které je potřeba číst.

Budete muset vytvořit přiřazení role, které poskytuje přístup k tabulkové službě Azure Storage za běhu. Role správy, jako je vlastník , nestačí. Následující tabulka ukazuje předdefinované role, které se doporučují při použití rozšíření Azure Tables pro Azure Storage v normálním provozu. Vaše aplikace může vyžadovat další oprávnění na základě kódu, který napíšete.

Typ vazby Příklad předdefinovaných rolí (Azure Storage1)
Vstupní vazba Čtenář dat tabulky služby Storage
Výstupní vazba Přispěvatel dat tabulky úložiště

1 Pokud se vaše aplikace místo toho připojuje k tabulkám ve službě Azure Cosmos DB for Table, použití identity se nepodporuje a připojení musí používat připojovací řetězec.

Využití

Použití vazby závisí na verzi balíčku rozšíření a na způsobu použití jazyka C# ve vaší aplikaci funkcí, což může být jedna z následujících možností:

Kompilovaná funkce C# v izolované knihovně tříd pracovních procesů běží v procesu izolovaném od modulu runtime.

Zvolte verzi, abyste zobrazili podrobnosti o využití pro režim a verzi.

Při práci s jednou entitou tabulky může vstupní vazba Azure Tables svázat s následujícími typy:

Typ Popis
Serializovatelný typ JSON, který implementuje ITableEntity Funkce se pokusí deserializovat entitu do prostého typu objektu CLR (POCO). Typ musí implementovat ITableEntity nebo musí mít řetězcovou RowKey vlastnost a řetězcovou PartitionKey vlastnost.
TableEntity1 Entita jako typ podobný slovníku.

Při práci s více entitami z dotazu může vstupní vazba Tabulek Azure svázat s následujícími typy:

Typ Popis
IEnumerable<T> where T implements ITableEntity Výčet entit vrácených dotazem. Každá položka představuje jednu entitu. Typ musí implementovat ITableEntity nebo musí mít řetězcovou RowKey vlastnost a řetězcovou PartitionKey T vlastnost.
TableClient1 Klient připojený k tabulce. To nabízí největší kontrolu nad zpracováním tabulky a lze ji použít k zápisu, pokud má připojení dostatečná oprávnění.

1 Pokud chcete použít tyto typy, musíte odkazovat na Microsoft.Azure.Functions.Worker.Extensions.Tables 1.2.0 nebo novější a běžné závislosti pro vazby typu sady SDK.

Atribut TableInput poskytuje přístup k řádku tabulky, který funkci aktivoval.

Získání vstupních dat řádku pomocí .context.extraInputs.get()

Data se předávají vstupnímu parametru zadanému name klíčem v souboru function.json . Určení typu The partitionKey a rowKey umožňuje filtrovat podle konkrétních záznamů.

Data tabulky se funkci předávají jako řetězec JSON. De-serializace zprávy voláním json.loads , jak je znázorněno ve vstupním příkladu.

Konkrétní podrobnosti o využití najdete v příkladu.

Další kroky