Powiązania wyjściowe tabel platformy Azure dla usługi Azure Functions
Użyj powiązania wyjściowego tabel platformy Azure, aby zapisywać jednostki w tabeli w usłudze Azure Cosmos DB dla tabel lub usługi Azure Table Storage.
Aby uzyskać informacje o konfiguracji i konfiguracji, zobacz omówienie
Uwaga
To powiązanie wyjściowe obsługuje tylko tworzenie nowych jednostek w tabeli. Jeśli musisz zaktualizować istniejącą jednostkę z kodu funkcji, zamiast tego użyj bezpośrednio zestawu Azure Tables SDK.
Ważne
W tym artykule są używane karty do obsługi wielu wersji modelu programowania Node.js. Model w wersji 4 jest ogólnie dostępny i ma bardziej elastyczne i intuicyjne środowisko dla deweloperów języka JavaScript i Języka TypeScript. Aby uzyskać więcej informacji na temat sposobu działania modelu w wersji 4, zapoznaj się z przewodnikiem dewelopera dotyczącym usługi Azure Functions Node.js. Aby dowiedzieć się więcej o różnicach między wersjami 3 i v4, zapoznaj się z przewodnikiem migracji.
Przykład
Funkcję języka C# można utworzyć przy użyciu jednego z następujących trybów języka C#:
- Model izolowanego procesu roboczego: skompilowana funkcja języka C#, która jest uruchamiana w procesie roboczym izolowanym od środowiska uruchomieniowego. Proces izolowanego procesu roboczego jest wymagany do obsługi funkcji języka C# uruchomionych w wersjach LTS i innych niż LTS platformy .NET oraz programu .NET Framework. Rozszerzenia dla izolowanych funkcji procesu roboczego używają
Microsoft.Azure.Functions.Worker.Extensions.*
przestrzeni nazw. - Model przetwarzania: skompilowana funkcja języka C#, która działa w tym samym procesie co środowisko uruchomieniowe usługi Functions. W odmianie tego modelu funkcje można uruchamiać przy użyciu skryptów języka C#, które są obsługiwane głównie w przypadku edytowania portalu języka C#. Rozszerzenia dla funkcji przetwarzania używają
Microsoft.Azure.WebJobs.Extensions.*
przestrzeni nazw.
Ważne
Wsparcie zostanie zakończone dla modelu procesu 10 listopada 2026 r. Zdecydowanie zalecamy przeprowadzenie migracji aplikacji do izolowanego modelu procesu roboczego w celu uzyskania pełnej obsługi.
Poniższa MyTableData
klasa reprezentuje wiersz danych w tabeli:
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; }
}
Następująca funkcja, która jest uruchamiana przez wyzwalacz usługi Queue Storage, zapisuje nową MyDataTable
jednostkę w tabeli o nazwie 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}"
};
}
W poniższym przykładzie pokazano funkcję Języka Java, która używa wyzwalacza HTTP do zapisu pojedynczego wiersza tabeli.
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();
}
}
W poniższym przykładzie pokazano funkcję Języka Java, która używa wyzwalacza HTTP do zapisywania wielu wierszy tabeli.
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();
}
}
W poniższym przykładzie pokazano powiązanie danych wyjściowych tabeli, które zapisuje wiele jednostek tabeli.
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 };
},
});
W poniższym przykładzie pokazano, jak napisać wiele jednostek do tabeli z funkcji.
Konfiguracja powiązania w function.json:
{
"bindings": [
{
"name": "InputData",
"type": "manualTrigger",
"direction": "in"
},
{
"tableName": "Person",
"connection": "MyStorageConnectionAppSetting",
"name": "TableBinding",
"type": "table",
"direction": "out"
}
],
"disabled": false
}
Kod programu PowerShell w pliku run.ps1:
param($InputData, $TriggerMetadata)
foreach ($i in 1..10) {
Push-OutputBinding -Name TableBinding -Value @{
PartitionKey = 'Test'
RowKey = "$i"
Name = "Name $i"
}
}
W poniższym przykładzie pokazano, jak używać powiązania wyjściowego usługi Table Storage. table
Skonfiguruj powiązanie w function.json, przypisując wartości do name
, tableName
, partitionKey
i 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"
}
]
}
Poniższa funkcja generuje unikatowy interfejs użytkownika dla rowKey
wartości i utrwala komunikat w usłudze Table Storage.
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}")
Atrybuty
Biblioteki języka C# procesu roboczego zarówno w procesie przetwarzania procesów procesowych, jak i izolowanych, używają atrybutów do zdefiniowania funkcji. Zamiast tego skrypt języka C# używa pliku konfiguracji function.json zgodnie z opisem w przewodniku obsługi skryptów języka C#.
W bibliotekachTableInputAttribute
klas języka C# obsługiwane są następujące właściwości:
Właściwość atrybutu | opis |
---|---|
TableName | Nazwa tabeli, do której ma być zapisywany. |
PartitionKey | Klucz partycji jednostki tabeli do zapisu. |
RowKey | Klucz wiersza jednostki tabeli do zapisu. |
Połączenie | Nazwa ustawienia aplikacji lub kolekcji ustawień, która określa sposób nawiązywania połączenia z usługą tabel. Zobacz Połączenia. |
Adnotacje
W bibliotece środowiska uruchomieniowego funkcji Języka Java użyj adnotacji TableOutput dla parametrów, aby zapisać wartości w tabelach. Atrybut obsługuje następujące elementy:
Element | opis |
---|---|
name | Nazwa zmiennej używana w kodzie funkcji, która reprezentuje tabelę lub jednostkę. |
Datatype | Definiuje sposób, w jaki środowisko uruchomieniowe usługi Functions powinno traktować wartość parametru. Aby dowiedzieć się więcej, zobacz dataType. |
tableName | Nazwa tabeli, do której ma być zapisywany. |
partitionKey | Klucz partycji jednostki tabeli do zapisu. |
rowKey | Klucz wiersza jednostki tabeli do zapisu. |
połączenie | Nazwa ustawienia aplikacji lub kolekcji ustawień, która określa sposób nawiązywania połączenia z usługą tabel. Zobacz Połączenia. |
Konfigurowanie
W poniższej tabeli opisano właściwości, które można ustawić dla options
obiektu przekazanego output.table()
do metody .
Właściwości | opis |
---|---|
tableName | Nazwa tabeli, do której ma być zapisywany. |
partitionKey | Klucz partycji jednostki tabeli do zapisu. |
rowKey | Klucz wiersza jednostki tabeli do zapisu. |
połączenie | Nazwa ustawienia aplikacji lub kolekcji ustawień, która określa sposób nawiązywania połączenia z usługą tabel. Zobacz Połączenia. |
Konfigurowanie
W poniższej tabeli opisano właściwości konfiguracji powiązania ustawione w pliku function.json .
właściwość function.json | opis |
---|---|
type | Musi być ustawiona wartość table . Ta właściwość jest ustawiana automatycznie podczas tworzenia powiązania w witrynie Azure Portal. |
direction | Musi być ustawiona wartość out . Ta właściwość jest ustawiana automatycznie podczas tworzenia powiązania w witrynie Azure Portal. |
name | Nazwa zmiennej używana w kodzie funkcji, która reprezentuje tabelę lub jednostkę. Ustaw wartość na , aby $return odwoływać się do wartości zwracanej przez funkcję. |
tableName | Nazwa tabeli, do której ma być zapisywany. |
partitionKey | Klucz partycji jednostki tabeli do zapisu. |
rowKey | Klucz wiersza jednostki tabeli do zapisu. |
połączenie | Nazwa ustawienia aplikacji lub kolekcji ustawień, która określa sposób nawiązywania połączenia z usługą tabel. Zobacz Połączenia. |
Podczas tworzenia aplikacji lokalnie dodaj ustawienia aplikacji w pliku local.settings.json w kolekcji Values
.
Połączenia
Właściwość connection
jest odwołaniem do konfiguracji środowiska, która określa sposób łączenia aplikacji z usługą tabel. Może to określać:
- Nazwa ustawienia aplikacji zawierającego parametry połączenia
- Nazwa udostępnionego prefiksu dla wielu ustawień aplikacji ze sobą definiująca połączenie oparte na tożsamości
Jeśli skonfigurowana wartość jest dokładnie zgodna z pojedynczym ustawieniem i dopasowaniem prefiksu dla innych ustawień, zostanie użyte dokładne dopasowanie.
Connection string
Aby uzyskać parametry połączenia dla tabel w usłudze Azure Table Storage, wykonaj kroki opisane w temacie Zarządzanie kluczami dostępu do konta magazynu. Aby uzyskać parametry połączenia dla tabel w usłudze Azure Cosmos DB dla tabel, wykonaj kroki przedstawione w artykule Azure Cosmos DB for Table FAQ (Często zadawane pytania dotyczące usługi Azure Cosmos DB dla tabel).
Ta parametry połączenia powinna być przechowywana w ustawieniu aplikacji z nazwą zgodną z wartością określoną przez connection
właściwość konfiguracji powiązania.
Jeśli nazwa ustawienia aplikacji zaczyna się od "AzureWebJobs", możesz określić tylko pozostałą część nazwy w tym miejscu. Jeśli na przykład ustawiono connection
wartość "MyStorage", środowisko uruchomieniowe usługi Functions wyszukuje ustawienie aplikacji o nazwie "AzureWebJobsMyStorage". W przypadku pozostawienia connection
pustego środowisko uruchomieniowe usługi Functions używa domyślnej parametry połączenia Storage w ustawieniu aplikacji o nazwie AzureWebJobsStorage
.
Połączenia oparte na tożsamościach
Jeśli używasz rozszerzenia interfejsu API tabel, zamiast używać parametry połączenia z wpisem tajnym, możesz użyć tożsamości microsoft Entra. Ma to zastosowanie tylko w przypadku uzyskiwania dostępu do tabel w usłudze Azure Storage. Aby użyć tożsamości, należy zdefiniować ustawienia w ramach wspólnego prefiksu, który mapuje na connection
właściwość w konfiguracji wyzwalacza i powiązania.
Jeśli ustawisz wartość connection
"AzureWebJobsStorage", zobacz Nawiązywanie połączenia z magazynem hostów przy użyciu tożsamości. W przypadku wszystkich innych połączeń rozszerzenie wymaga następujących właściwości:
Właściwości | Szablon zmiennej środowiskowej | opis | Przykładowa wartość |
---|---|---|---|
Table Service URI | <CONNECTION_NAME_PREFIX>__tableServiceUri 1 |
Identyfikator URI płaszczyzny danych usługi tabel usługi Azure Storage, z którą nawiązujesz połączenie, przy użyciu schematu HTTPS. | <https:// storage_account_name.table.core.windows.net> |
1 <CONNECTION_NAME_PREFIX>__serviceUri
może służyć jako alias. Jeśli podano oba formularze, tableServiceUri
zostanie użyty formularz. Nie serviceUri
można użyć formularza, gdy ogólna konfiguracja połączenia ma być używana w obiektach blob, kolejkach i/lub tabelach.
Inne właściwości można ustawić, aby dostosować połączenie. Zobacz Typowe właściwości połączeń opartych na tożsamościach.
Nie serviceUri
można użyć formularza, gdy ogólna konfiguracja połączenia ma być używana w obiektach blob, kolejkach i/lub tabelach w usłudze Azure Storage. Identyfikator URI może wyznaczyć tylko usługę tabel. Alternatywnie możesz podać identyfikator URI przeznaczony dla każdej usługi pod tym samym prefiksem, co pozwala na użycie jednego połączenia.
W przypadku hostowania w usłudze Azure Functions połączenia oparte na tożsamościach używają tożsamości zarządzanej. Tożsamość przypisana przez system jest używana domyślnie, chociaż tożsamości przypisanej przez użytkownika można określić za credential
pomocą właściwości i clientID
. Należy pamiętać, że konfigurowanie tożsamości przypisanej przez użytkownika przy użyciu identyfikatora zasobu nie jest obsługiwane. W przypadku uruchamiania w innych kontekstach, takich jak programowanie lokalne, tożsamość dewelopera jest używana, chociaż można to dostosować. Zobacz Programowanie lokalne z połączeniami opartymi na tożsamościach.
Udzielanie uprawnień tożsamości
Niezależnie od używanej tożsamości musi mieć uprawnienia do wykonywania zamierzonych akcji. W przypadku większości usług platformy Azure oznacza to, że musisz przypisać rolę w kontroli dostępu opartej na rolach platformy Azure przy użyciu wbudowanych lub niestandardowych ról, które zapewniają te uprawnienia.
Ważne
Niektóre uprawnienia mogą być uwidocznione przez usługę docelową, które nie są niezbędne dla wszystkich kontekstów. Jeśli to możliwe, przestrzegaj zasady najniższych uprawnień, udzielając tożsamości tylko wymaganych uprawnień. Jeśli na przykład aplikacja musi mieć możliwość odczytu tylko ze źródła danych, użyj roli, która ma uprawnienia tylko do odczytu. Niewłaściwe byłoby przypisanie roli, która umożliwia również zapisywanie w tej usłudze, ponieważ byłoby to nadmierne uprawnienie do operacji odczytu. Podobnie należy upewnić się, że przypisanie roli jest ograniczone tylko do zasobów, które należy odczytać.
Musisz utworzyć przypisanie roli, które zapewnia dostęp do usługi tabel usługi Azure Storage w czasie wykonywania. Role zarządzania, takie jak Właściciel , nie są wystarczające. W poniższej tabeli przedstawiono wbudowane role, które są zalecane podczas korzystania z rozszerzenia Tabele platformy Azure w usłudze Azure Storage w normalnej operacji. Aplikacja może wymagać dodatkowych uprawnień na podstawie zapisanego kodu.
Typ powiązania | Przykładowe wbudowane role (Azure Storage1) |
---|---|
Powiązanie wejściowe | Czytnik danych tabeli usługi Storage |
Powiązanie wyjściowe | Współautor danych tabeli usługi Storage |
1 Jeśli aplikacja zamiast tego łączy się z tabelami w usłudze Azure Cosmos DB dla tabel, użycie tożsamości nie jest obsługiwane i połączenie musi używać parametry połączenia.
Użycie
Użycie powiązania zależy od wersji pakietu rozszerzenia i modalności języka C# używanej w aplikacji funkcji, co może być jednym z następujących elementów:
Izolowana biblioteka klas procesów roboczych skompilowana funkcja języka C# jest uruchamiana w procesie odizolowanym od środowiska uruchomieniowego.
Wybierz wersję, aby wyświetlić szczegóły użycia dla trybu i wersji.
Jeśli chcesz, aby funkcja zapisywała w jednej jednostce, powiązanie wyjściowe tabel platformy Azure może wiązać się z następującymi typami:
Type | Opis |
---|---|
Typ z możliwością serializacji JSON implementujący element [ITableEntity] | Funkcje próbują serializować zwykły typ obiektu CLR (POCO) jako jednostkę. Typ musi zaimplementować właściwość [ITableEntity] lub mieć właściwość string RowKey i właściwość string PartitionKey . |
Jeśli chcesz, aby funkcja zapisywała w wielu jednostkach, powiązanie wyjściowe tabel platformy Azure może wiązać się z następującymi typami:
Type | Opis |
---|---|
T[] gdzie T jest jednym z typów pojedynczej jednostki |
Tablica zawierająca wiele jednostek. Każdy wpis reprezentuje jedną jednostkę. |
W przypadku innych scenariuszy wyjściowych utwórz obiekt TableClient i użyj go bezpośrednio z innymi typami z tabeli Azure.Data.Tables. Zobacz Rejestrowanie klientów platformy Azure, aby zapoznać się z przykładem użycia wstrzykiwania zależności w celu utworzenia typu klienta z zestawu Azure SDK.
Istnieją dwie opcje wyprowadzania wiersza usługi Table Storage z funkcji przy użyciu adnotacji TableStorageOutput :
Opcje | opis |
---|---|
Wartość zwracana | Stosując adnotację do samej funkcji, zwracana wartość funkcji jest zachowywana jako wiersz usługi Table Storage. |
Imperatyw | Aby jawnie ustawić wiersz tabeli, zastosuj adnotację do określonego parametru typu OutputBinding<T> , gdzie T zawiera PartitionKey właściwości i RowKey . Te właściwości można towarzyszyć przez zaimplementowanie ITableEntity lub dziedziczenie TableEntity . |
Ustaw dane wiersza wyjściowego, zwracając wartość lub używając polecenia context.extraOutputs.set()
.
Aby zapisać dane w tabeli, użyj Push-OutputBinding
polecenia cmdlet , ustaw -Name TableBinding
parametr i -Value
parametr równy danych wierszy. Zobacz przykład programu PowerShell, aby uzyskać więcej szczegółów.
Istnieją dwie opcje wyprowadzania komunikatu wiersza usługi Table Storage z funkcji:
Opcje | opis |
---|---|
Wartość zwracana | name Ustaw właściwość w function.json na $return . W przypadku tej konfiguracji wartość zwracana funkcji jest zachowywana jako wiersz usługi Table Storage. |
Imperatyw | Przekaż wartość do metody set parametru zadeklarowanego jako typ out . Przekazana wartość jest utrwalana set jako wiersz tabeli. |
Aby uzyskać szczegółowe informacje o użyciu, zobacz Przykład.
Wyjątki i kody powrotne
Wiązanie | Odwołanie |
---|---|
Table | Kody błędów tabeli |
Obiekt blob, tabela, kolejka | Kody błędów magazynu |
Obiekt blob, tabela, kolejka | Rozwiązywanie problemów |