Delen via


Uitvoerbindingen voor Azure Tables voor Azure Functions

Gebruik een Azure Tables-uitvoerbinding om entiteiten te schrijven naar een tabel in Azure Cosmos DB voor Table of Azure Table Storage.

Zie het overzicht voor meer informatie over het instellen en configureren van details

Notitie

Deze uitvoerbinding biedt alleen ondersteuning voor het maken van nieuwe entiteiten in een tabel. Als u een bestaande entiteit wilt bijwerken vanuit uw functiecode, gebruikt u in plaats daarvan rechtstreeks een Azure Tables SDK.

Belangrijk

In dit artikel worden tabbladen gebruikt ter ondersteuning van meerdere versies van het Node.js programmeermodel. Het v4-model is algemeen beschikbaar en is ontworpen voor een flexibelere en intuïtievere ervaring voor JavaScript- en TypeScript-ontwikkelaars. Raadpleeg de ontwikkelaarshandleiding voor Azure Functions Node.js voor meer informatie over hoe het v4-model werkt. Raadpleeg de migratiehandleiding voor meer informatie over de verschillen tussen v3 en v4.

Opmerking

U kunt een C#-functie maken met behulp van een van de volgende C#-modi:

  • Geïsoleerd werkrolmodel: gecompileerde C#-functie die wordt uitgevoerd in een werkproces dat is geïsoleerd van de runtime. Geïsoleerd werkproces is vereist voor de ondersteuning van C#-functies die worden uitgevoerd op LTS- en niet-LTS-versies .NET en .NET Framework. Extensies voor geïsoleerde werkprocesfuncties maken gebruik van Microsoft.Azure.Functions.Worker.Extensions.* naamruimten.
  • In-process model: gecompileerde C#-functie die wordt uitgevoerd in hetzelfde proces als de Functions-runtime. In een variatie van dit model kunnen functies worden uitgevoerd met behulp van C#-scripting. Dit wordt voornamelijk ondersteund voor het bewerken van de C#-portal. Extensies voor in-process-functies maken gebruik van Microsoft.Azure.WebJobs.Extensions.* naamruimten.

De volgende MyTableData klasse vertegenwoordigt een rij met gegevens in de 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; }
}

De volgende functie, die wordt gestart door een Queue Storage-trigger, schrijft een nieuwe MyDataTable entiteit naar een tabel met de naam OutputTable.

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

In het volgende voorbeeld ziet u een Java-functie die gebruikmaakt van een HTTP-trigger om één tabelrij te schrijven.

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

public class AddPerson {

    @FunctionName("addPerson")
    public HttpResponseMessage get(
            @HttpTrigger(name = "postPerson", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION, route="persons/{partitionKey}/{rowKey}") HttpRequestMessage<Optional<Person>> request,
            @BindingName("partitionKey") String partitionKey,
            @BindingName("rowKey") String rowKey,
            @TableOutput(name="person", partitionKey="{partitionKey}", rowKey = "{rowKey}", tableName="%MyTableName%", connection="MyConnectionString") OutputBinding<Person> person,
            final ExecutionContext context) {

        Person outPerson = new Person();
        outPerson.setPartitionKey(partitionKey);
        outPerson.setRowKey(rowKey);
        outPerson.setName(request.getBody().get().getName());

        person.setValue(outPerson);

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

In het volgende voorbeeld ziet u een Java-functie die gebruikmaakt van een HTTP-trigger om meerdere tabelrijen te schrijven.

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

public class AddPersons {

    @FunctionName("addPersons")
    public HttpResponseMessage get(
            @HttpTrigger(name = "postPersons", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION, route="persons/") HttpRequestMessage<Optional<Person[]>> request,
            @TableOutput(name="person", tableName="%MyTableName%", connection="MyConnectionString") OutputBinding<Person[]> persons,
            final ExecutionContext context) {

        persons.setValue(request.getBody().get());

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

In het volgende voorbeeld ziet u een tabeluitvoerbinding waarmee meerdere tabelentiteiten worden geschreven.

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

const tableOutput = output.table({
    tableName: 'Person',
    connection: 'MyStorageConnectionAppSetting',
});

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

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    const rows: PersonEntity[] = [];
    for (let i = 1; i < 10; i++) {
        rows.push({
            PartitionKey: 'Test',
            RowKey: i.toString(),
            Name: `Name ${i}`,
        });
    }
    context.extraOutputs.set(tableOutput, rows);
    return { status: 201 };
}

app.http('httpTrigger1', {
    methods: ['POST'],
    authLevel: 'anonymous',
    extraOutputs: [tableOutput],
    handler: httpTrigger1,
});
const { app, output } = require('@azure/functions');

const tableOutput = output.table({
    tableName: 'Person',
    connection: 'MyStorageConnectionAppSetting',
});

app.http('httpTrigger1', {
    methods: ['POST'],
    authLevel: 'anonymous',
    extraOutputs: [tableOutput],
    handler: async (request, context) => {
        const rows = [];
        for (let i = 1; i < 10; i++) {
            rows.push({
                PartitionKey: 'Test',
                RowKey: i.toString(),
                Name: `Name ${i}`,
            });
        }
        context.extraOutputs.set(tableOutput, rows);
        return { status: 201 };
    },
});

In het volgende voorbeeld ziet u hoe u vanuit een functie meerdere entiteiten naar een tabel schrijft.

Bindingsconfiguratie in function.json:

{
  "bindings": [
    {
      "name": "InputData",
      "type": "manualTrigger",
      "direction": "in"
    },
    {
      "tableName": "Person",
      "connection": "MyStorageConnectionAppSetting",
      "name": "TableBinding",
      "type": "table",
      "direction": "out"
    }
  ],
  "disabled": false
}

PowerShell-code in run.ps1:

param($InputData, $TriggerMetadata)

foreach ($i in 1..10) {
    Push-OutputBinding -Name TableBinding -Value @{
        PartitionKey = 'Test'
        RowKey = "$i"
        Name = "Name $i"
    }
}

In het volgende voorbeeld ziet u hoe u de tabelopslaguitvoerbinding gebruikt. Configureer de table binding in de function.json door waarden toe te wijzen aan name, tableNameen partitionKeyconnection:

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

Met de volgende functie wordt een unieke UUI gegenereerd voor de rowKey waarde en wordt het bericht in Table Storage bewaard.

import logging
import uuid
import json

import azure.functions as func

def main(req: func.HttpRequest, message: func.Out[str]) -> func.HttpResponse:

    rowKey = str(uuid.uuid4())

    data = {
        "Name": "Output binding message",
        "PartitionKey": "message",
        "RowKey": rowKey
    }

    message.set(json.dumps(data))

    return func.HttpResponse(f"Message created with the rowKey: {rowKey}")

Kenmerken

Zowel in-process als geïsoleerde werkproces C#-bibliotheken gebruiken kenmerken om de functie te definiëren. C#-script maakt in plaats daarvan gebruik van een function.json configuratiebestand, zoals beschreven in de handleiding voor C#-scripts.

In C#-klassebibliotheken ondersteunt de TableInputAttribute volgende eigenschappen:

Kenmerkeigenschap Beschrijving
TableName De naam van de tabel waarnaar moet worden geschreven.
PartitionKey De partitiesleutel van de tabelentiteit die moet worden geschreven.
RowKey De rijsleutel van de tabelentiteit die moet worden geschreven.
Verbinding De naam van een app-instelling of instellingsverzameling die aangeeft hoe verbinding moet worden gemaakt met de tabelservice. Zie verbindingen.

Aantekeningen

Gebruik in de Runtime-bibliotheek van Java-functies de aantekening TableOutput voor parameters om waarden naar uw tabellen te schrijven. Het kenmerk ondersteunt de volgende elementen:

Element Description
name De naam van de variabele die wordt gebruikt in functiecode die de tabel of entiteit vertegenwoordigt.
Datatype Hiermee definieert u hoe functions-runtime de parameterwaarde moet behandelen. Zie dataType voor meer informatie.
tableName De naam van de tabel waarnaar moet worden geschreven.
partitionKey De partitiesleutel van de tabelentiteit die moet worden geschreven.
rowKey De rijsleutel van de tabelentiteit die moet worden geschreven.
verbinding De naam van een app-instelling of instellingsverzameling die aangeeft hoe verbinding moet worden gemaakt met de tabelservice. Zie verbindingen.

Configuratie

In de volgende tabel worden de eigenschappen uitgelegd die u kunt instellen voor het options object dat aan de output.table() methode is doorgegeven.

Eigenschappen Beschrijving
tableName De naam van de tabel waarnaar moet worden geschreven.
partitionKey De partitiesleutel van de tabelentiteit die moet worden geschreven.
rowKey De rijsleutel van de tabelentiteit die moet worden geschreven.
verbinding De naam van een app-instelling of instellingsverzameling die aangeeft hoe verbinding moet worden gemaakt met de tabelservice. Zie verbindingen.

Configuratie

In de volgende tabel worden de bindingsconfiguratie-eigenschappen uitgelegd die u in het function.json-bestand hebt ingesteld.

function.json-eigenschap Beschrijving
type Moet worden ingesteld op table. Deze eigenschap wordt automatisch ingesteld wanneer u de binding maakt in Azure Portal.
direction Moet worden ingesteld op out. Deze eigenschap wordt automatisch ingesteld wanneer u de binding maakt in Azure Portal.
name De naam van de variabele die wordt gebruikt in functiecode die de tabel of entiteit vertegenwoordigt. Ingesteld om $return te verwijzen naar de retourwaarde van de functie.
tableName De naam van de tabel waarnaar moet worden geschreven.
partitionKey De partitiesleutel van de tabelentiteit die moet worden geschreven.
rowKey De rijsleutel van de tabelentiteit die moet worden geschreven.
verbinding De naam van een app-instelling of instellingsverzameling die aangeeft hoe verbinding moet worden gemaakt met de tabelservice. Zie verbindingen.

Wanneer u lokaal ontwikkelt, voegt u uw toepassingsinstellingen toe aan het local.settings.json-bestand in de Values verzameling.

Connecties

De connection eigenschap is een verwijzing naar de omgevingsconfiguratie die aangeeft hoe de app verbinding moet maken met uw tabelservice. Het kan het volgende opgeven:

Als de geconfigureerde waarde zowel een exacte overeenkomst is voor één instelling als een voorvoegselovereenkomst voor andere instellingen, wordt de exacte overeenkomst gebruikt.

Connection string

Als u een verbindingsreeks voor tabellen in Azure Table Storage wilt verkrijgen, volgt u de stappen in Toegangssleutels voor opslagaccounts beheren. Als u een verbindingsreeks voor tabellen in Azure Cosmos DB for Table wilt verkrijgen, volgt u de stappen die worden weergegeven in de veelgestelde vragen over Azure Cosmos DB for Table.

Deze verbindingsreeks moet worden opgeslagen in een toepassingsinstelling met een naam die overeenkomt met de waarde die is opgegeven door de connection eigenschap van de bindingsconfiguratie.

Als de naam van de app-instelling begint met 'AzureWebJobs', kunt u hier alleen de rest van de naam opgeven. Als u bijvoorbeeld instelt connection op 'MyStorage', zoekt de Functions-runtime naar een app-instelling met de naam 'AzureWebJobsMyStorage'. Als u leeg laatconnection, gebruikt de Functions-runtime de standaardopslag-verbindingsreeks in de app-instelling met de naamAzureWebJobsStorage.

Op identiteit gebaseerde verbindingen

Als u de table-API-extensie gebruikt, in plaats van een verbindingsreeks met een geheim te gebruiken, kunt u de app een Microsoft Entra-identiteit laten gebruiken. Dit geldt alleen voor toegang tot tabellen in Azure Storage. Als u een identiteit wilt gebruiken, definieert u instellingen onder een gemeenschappelijk voorvoegsel dat wordt toegewezen aan de connection eigenschap in de trigger- en bindingsconfiguratie.

Als u 'AzureWebJobsStorage' instelt connection , raadpleegt u Verbinding maken met hostopslag met een identiteit. Voor alle andere verbindingen vereist de extensie de volgende eigenschappen:

Eigenschappen Sjabloon voor omgevingsvariabele Beschrijving Voorbeeldwaarde
Tabelservice-URI <CONNECTION_NAME_PREFIX>__tableServiceUri1 De gegevensvlak-URI van de Azure Storage-tabelservice waarmee u verbinding maakt, met behulp van het HTTPS-schema. <https:// storage_account_name.table.core.windows.net>

1 <CONNECTION_NAME_PREFIX>__serviceUri kan als alias worden gebruikt. Als beide formulieren worden opgegeven, wordt het tableServiceUri formulier gebruikt. Het serviceUri formulier kan niet worden gebruikt wanneer de algemene verbindingsconfiguratie moet worden gebruikt in blobs, wachtrijen en/of tabellen.

Andere eigenschappen kunnen worden ingesteld om de verbinding aan te passen. Zie Algemene eigenschappen voor op identiteit gebaseerde verbindingen.

Het serviceUri formulier kan niet worden gebruikt wanneer de algehele verbindingsconfiguratie moet worden gebruikt in blobs, wachtrijen en/of tabellen in Azure Storage. De URI kan alleen de tabelservice aanwijzen. Als alternatief kunt u een URI specifiek opgeven voor elke service onder hetzelfde voorvoegsel, zodat één verbinding kan worden gebruikt.

Wanneer deze worden gehost in de Azure Functions-service, maken identiteitsverbindingen gebruik van een beheerde identiteit. De door het systeem toegewezen identiteit wordt standaard gebruikt, hoewel een door de gebruiker toegewezen identiteit kan worden opgegeven met de credential en clientID eigenschappen. Houd er rekening mee dat het configureren van een door de gebruiker toegewezen identiteit met een resource-id niet wordt ondersteund. Wanneer uw ontwikkelaarsidentiteit wordt uitgevoerd in andere contexten, zoals lokale ontwikkeling, wordt in plaats daarvan uw ontwikkelaarsidentiteit gebruikt, hoewel dit kan worden aangepast. Zie Lokale ontwikkeling met op identiteit gebaseerde verbindingen.

Toestemming verlenen aan de identiteit

Elke identiteit die wordt gebruikt, moet machtigingen hebben om de beoogde acties uit te voeren. Voor de meeste Azure-services betekent dit dat u een rol in Azure RBAC moet toewijzen met behulp van ingebouwde of aangepaste rollen die deze machtigingen bieden.

Belangrijk

Sommige machtigingen worden mogelijk weergegeven door de doelservice die niet nodig is voor alle contexten. Waar mogelijk moet u zich houden aan het principe van minimale bevoegdheid, waarbij de identiteit alleen vereiste bevoegdheden verleent. Als de app bijvoorbeeld alleen uit een gegevensbron moet kunnen lezen, gebruikt u een rol die alleen gemachtigd is om te lezen. Het zou ongepast zijn om een rol toe te wijzen die ook schrijfbewerkingen naar die service toestaat, omdat dit overmatige machtigingen zou zijn voor een leesbewerking. Op dezelfde manier wilt u ervoor zorgen dat de roltoewijzing alleen is afgestemd op de resources die moeten worden gelezen.

U moet een roltoewijzing maken die tijdens runtime toegang biedt tot uw Azure Storage-tabelservice. Beheerrollen zoals Eigenaar zijn niet voldoende. In de volgende tabel ziet u ingebouwde rollen die worden aanbevolen bij het gebruik van de Azure Tables-extensie voor Azure Storage in normale werking. Uw toepassing vereist mogelijk extra machtigingen op basis van de code die u schrijft.

Bindingstype Voorbeeld van ingebouwde rollen (Azure Storage1)
Invoerbinding Opslagtabelgegevenslezer
Uitvoerbinding Inzender voor opslagtabelgegevens

1 Als uw app in plaats daarvan verbinding maakt met tabellen in Azure Cosmos DB for Table, wordt het gebruik van een identiteit niet ondersteund en moet de verbinding een verbindingsreeks gebruiken.

Gebruik

Het gebruik van de binding is afhankelijk van de versie van het extensiepakket en de C#-modaliteit die wordt gebruikt in uw functie-app. Dit kan een van de volgende zijn:

Een geïsoleerde werkprocesklassebibliotheek gecompileerde C#-functie wordt uitgevoerd in een proces dat is geïsoleerd van de runtime.

Kies een versie om gebruiksgegevens voor de modus en versie te bekijken.

Wanneer u wilt dat de functie naar één entiteit schrijft, kan de Azure Tables-uitvoerbinding worden gekoppeld aan de volgende typen:

Type Description
Een type JSON serializeerbaar dat [ITableEntity] implementeert Functions probeert een normaal oud CLR-objecttype (POCO) als entiteit te serialiseren. Het type moet [ITableEntity] implementeren of een tekenreekseigenschap RowKey en een tekenreekseigenschap PartitionKey hebben.

Wanneer u wilt dat de functie naar meerdere entiteiten schrijft, kan de Azure Tables-uitvoerbinding worden gekoppeld aan de volgende typen:

Type Description
T[] waarbij T een van de entiteitstypen is Een matrix met meerdere entiteiten. Elke vermelding vertegenwoordigt één entiteit.

Voor andere uitvoerscenario's maakt en gebruikt u rechtstreeks typen van Azure.Data.Tables .

Er zijn twee opties voor het uitvoeren van een tabelopslagrij van een functie met behulp van de aantekening TableStorageOutput :

Opties Beschrijving
Retourwaarde Door de aantekening toe te passen op de functie zelf, blijft de retourwaarde van de functie behouden als een tabelopslagrij.
Imperatief Als u de tabelrij expliciet wilt instellen, past u de aantekening toe op een specifieke parameter van het type OutputBinding<T>, waarbij T de PartitionKey en RowKey eigenschappen zijn opgenomen. U kunt deze eigenschappen bijbehoren door deze te implementeren ITableEntity of over te TableEntitynemen.

Stel de uitvoerrijgegevens in door de waarde te retourneren of door deze te gebruiken context.extraOutputs.set().

Als u naar tabelgegevens wilt schrijven, gebruikt u de Push-OutputBinding cmdlet, stelt u de -Name TableBinding parameter en -Value parameter in die gelijk zijn aan de rijgegevens. Zie het PowerShell-voorbeeld voor meer informatie.

Er zijn twee opties voor het uitvoeren van een tabelopslagrijbericht van een functie:

Opties Beschrijving
Retourwaarde stel de eigenschap name in function. json in op $return. Met deze configuratie blijft de retourwaarde van de functie behouden als een tabelopslagrij.
Imperatief geef een waarde door aan de methode set voor de parameter die is gedeclareerd als een type Out. De waarde waarnaar wordt doorgegeven set , wordt behouden als tabelrij.

Zie Voorbeeld voor specifieke gebruiksgegevens.

Uitzonderingen en retourcodes

Binding Verwijzing
Tabel Tabelfoutcodes
Blob, Tabel, Wachtrij Foutcodes voor opslag
Blob, Tabel, Wachtrij Problemen oplossen

Volgende stappen