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.
Belangrijk
De ondersteuning wordt beëindigd voor het in-process model op 10 november 2026. We raden u ten zeerste aan uw apps te migreren naar het geïsoleerde werkrolmodel voor volledige ondersteuning.
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
, tableName
en partitionKey
connection
:
{
"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:
- De naam van een toepassingsinstelling met een verbindingsreeks
- De naam van een gedeeld voorvoegsel voor meerdere toepassingsinstellingen, samen het definiëren van een op identiteit gebaseerde verbinding
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>__tableServiceUri 1 |
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 TableEntity nemen. |
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 |