Azure İşlevleri için Azure Tabloları giriş bağlamaları

Tablo veya Azure Tablo Depolama için Azure Cosmos DB'de bir tabloyu okumak için Azure Tabloları giriş bağlamasını kullanın.

Kurulum ve yapılandırma ayrıntıları hakkında bilgi için genel bakışa bakın.

Önemli

Bu makalede, Node.js programlama modelinin birden çok sürümünü desteklemek için sekmeler kullanılır. Genel kullanıma sunulan v4 modeli, JavaScript ve TypeScript geliştiricileri için daha esnek ve sezgisel bir deneyime sahip olacak şekilde tasarlanmıştır. v4 modelinin nasıl çalıştığı hakkında daha fazla bilgi için Azure İşlevleri Node.js geliştirici kılavuzuna bakın. v3 ile v4 arasındaki farklar hakkında daha fazla bilgi edinmek için geçiş kılavuzuna bakın.

Örnek

Bağlamanın kullanımı uzantı paketi sürümüne ve işlev uygulamanızda kullanılan C# modalitesine bağlıdır ve bu da aşağıdakilerden biri olabilir:

Yalıtılmış çalışan işlem sınıfı kitaplığı derlenmiş C# işlevi çalışma zamanından yalıtılmış bir işlemde çalışır.

Mod ve sürüm örneklerini görmek için bir sürüm seçin.

Aşağıdaki MyTableData sınıf, tablodaki bir veri satırını temsil eder:

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

Kuyruk Depolama tetikleyicisi tarafından başlatılan aşağıdaki işlev, giriş tablosundan satırı almak için kullanılan kuyruktan bir satır anahtarı okur. İfade {queueTrigger} , satır anahtarını ileti meta verilerine bağlar ve bu da ileti dizesidir.

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

Aşağıdaki Kuyruk ile tetiklenen işlev, ilk 5 varlığı olarak IEnumerable<T>döndürür ve bölüm anahtarı değeri kuyruk iletisi olarak ayarlanır.

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

Filter ve Take özellikleri, döndürülen varlık sayısını sınırlamak için kullanılır.

Aşağıdaki örnekte, Tablo depolama alanında belirtilen bölümde yer alan kişi nesnelerinin listesini döndüren HTTP ile tetiklenen bir işlev gösterilmektedir. Örnekte, bölüm anahtarı http yolundan ayıklanır ve tableName ve bağlantı işlev ayarlarındandır.

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

TableInput ek açıklaması, aşağıdaki örnekte gösterildiği gibi isteğin json gövdesinden bağlamaları ayıklayabilir.

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

Aşağıdaki örnek, Bir Azure Tablosunda belirli bir ada sahip kişileri sorgulamak için bir filtre kullanır ve olası eşleşme sayısını 10 sonuçla sınırlar.

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

Aşağıdaki örnekte, tek bir tablo satırını okumak için kuyruk tetikleyicisi kullanan bir tablo giriş bağlaması gösterilmektedir. Bağlama, bir partitionKey ve rowKeybelirtir. rowKey"{queueTrigger}" değeri, satır anahtarının kuyruk ileti dizesinden geldiğini gösterir.

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

Aşağıdaki işlev, bir işleve giriş olarak tek bir tablo satırını okumak için kuyruk tetikleyicisini kullanır.

Bu örnekte, bağlama yapılandırması tablonun partitionKey için açık bir değer belirtir ve öğesine geçirmek rowKeyiçin bir ifade kullanır. rowKey ifadesi, {queueTrigger}satır anahtarının kuyruk ileti dizesinden geldiğini gösterir.

function.json bağlama yapılandırması:

{
  "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
}

run.ps1'de PowerShell kodu:

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

Aşağıdaki işlev, bir işleve giriş olarak tek bir tablo satırını okumak için BIR HTTP tetikleyicisi kullanır.

Bu örnekte, bağlama yapılandırması tablonun partitionKey için açık bir değer belirtir ve öğesine geçirmek rowKeyiçin bir ifade kullanır. rowKey ifadesi, {id} satır anahtarının istekteki {id} yolun bölümünden geldiğini gösterir.

function.json dosyasında bağlama yapılandırması:

{
  "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
}

__init__.py dosyasındaki Python kodu:

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

Bu basit bağlamayla, satır anahtarı kimliğine sahip satır bulunmayan bir olayı program aracılığıyla işleyemezsiniz. Daha ayrıntılı veri seçimi için depolama SDK'sını kullanın.


Özellikler

hem işlem içi hem de yalıtılmış çalışan işlemi C# kitaplıkları işlevi tanımlamak için öznitelikleri kullanır. Bunun yerine C# betiği, C# betik kılavuzunda açıklandığı gibi bir function.json yapılandırma dosyası kullanır.

C# sınıf kitaplıklarında, TableInputAttribute aşağıdaki özellikleri destekler:

Öznitelik özelliği Açıklama
TableName Tablonun adı.
PartitionKey isteğe bağlı. Okunacak tablo varlığının bölüm anahtarı.
RowKey isteğe bağlı. Okunacak tablo varlığının satır anahtarı.
Almak isteğe bağlı. bir içine okunacak IEnumerable<T>varlık sayısı üst sınırı. ile RowKeykullanılamaz.
Filtre isteğe bağlı. Varlıkların içine IEnumerable<T>okuması için bir OData filtre ifadesi. ile RowKeykullanılamaz.
Bağlantı Tablo hizmetine nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Bkz. Bağlantılar.

Ek Açıklamalar

Java işlevleri çalışma zamanı kitaplığında, değeri Tablo depolamadan gelecek parametrelerde ek açıklamayı kullanın@TableInput. Bu ek açıklama kullanılarak yerel Java türleri, POJO'lar veya null atanabilir değerlerle Optional<T>kullanılabilir. Bu ek açıklama aşağıdaki öğeleri destekler:

Öğe Açıklama
ad İşlev kodundaki tabloyu veya varlığı temsil eden değişkenin adı.
tableName Tablonun adı.
partitionKey isteğe bağlı. Okunacak tablo varlığının bölüm anahtarı.
rowKey isteğe bağlı. Okunacak tablo varlığının satır anahtarı.
almak isteğe bağlı. Okunacak en fazla varlık sayısı.
filter isteğe bağlı. Tablo girişi için bir OData filtre ifadesi.
bağlantı Tablo hizmetine nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Bkz. Bağlantılar.

Yapılandırma

Aşağıdaki tabloda, yöntemine geçirilen input.table() nesnede options ayarlayabileceğiniz özellikler açıklanmaktadır.

Özellik Açıklama
tableName Tablonun adı.
partitionKey isteğe bağlı. Okunacak tablo varlığının bölüm anahtarı.
rowKey isteğe bağlı. Okunacak tablo varlığının satır anahtarı. veya filterile take kullanılamaz.
almak isteğe bağlı. Döndürülecek varlık sayısı üst sınırı. ile rowKeykullanılamaz.
filter isteğe bağlı. Tablodan döndürülecek varlıklar için bir OData filtre ifadesi. ile rowKeykullanılamaz.
bağlantı Tablo hizmetine nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Bkz. Bağlantılar.

Yapılandırma

Aşağıdaki tabloda, function.json dosyasında ayarladığınız bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type olarak ayarlanmalıdır table. Bağlamayı Azure portalında oluşturduğunuzda bu özellik otomatik olarak ayarlanır.
direction olarak ayarlanmalıdır in. Bağlamayı Azure portalında oluşturduğunuzda bu özellik otomatik olarak ayarlanır.
ad İşlev kodundaki tabloyu veya varlığı temsil eden değişkenin adı.
tableName Tablonun adı.
partitionKey isteğe bağlı. Okunacak tablo varlığının bölüm anahtarı.
rowKey isteğe bağlı. Okunacak tablo varlığının satır anahtarı. veya filterile take kullanılamaz.
almak isteğe bağlı. Döndürülecek varlık sayısı üst sınırı. ile rowKeykullanılamaz.
filter isteğe bağlı. Tablodan döndürülecek varlıklar için bir OData filtre ifadesi. ile rowKeykullanılamaz.
bağlantı Tablo hizmetine nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Bkz. Bağlantılar.

Yerel olarak geliştirme yaparken uygulama ayarlarınızı koleksiyondaki local.settings.json dosyasına Values ekleyin.

Bağlantılar

connection özelliği, uygulamanın tablo hizmetinize nasıl bağlanması gerektiğini belirten bir ortam yapılandırması başvurusudur. Şunları belirtebilir:

Yapılandırılan değer hem tek bir ayar için tam eşleşme hem de diğer ayarlar için bir ön ek eşleşmesiyse, tam eşleşme kullanılır.

Connection string

Azure Tablo depolamadaki tablolar için bağlantı dizesi almak için Depolama hesabı erişim anahtarlarını yönetme bölümünde gösterilen adımları izleyin. Tablo için Azure Cosmos DB'de tablolara yönelik bir bağlantı dizesi edinmek için Tablo için Azure Cosmos DB SSS bölümünde gösterilen adımları izleyin.

Bu bağlantı dizesi, bağlama yapılandırmasının özelliği tarafından connection belirtilen değerle eşleşen bir adla bir uygulama ayarında depolanmalıdır.

Uygulama ayarı adı "AzureWebJobs" ile başlıyorsa, adın yalnızca kalanını burada belirtebilirsiniz. Örneğin, "MyStorage" olarak ayarlarsanız connection , İşlevler çalışma zamanı "AzureWebJobsMyStorage" adlı bir uygulama ayarı arar. Boş bırakırsanızconnection, İşlevler çalışma zamanı adlı AzureWebJobsStorageuygulama ayarında varsayılan Depolama bağlantı dizesi kullanır.

Kimlik tabanlı bağlantılar

Tablolar API'sini kullanıyorsanız, gizli dizi içeren bir bağlantı dizesi kullanmak yerine uygulamanın bir Microsoft Entra kimliği kullanmasını sağlayabilirsiniz. Bu yalnızca Azure Depolama'daki tablolara erişirken geçerlidir. Kimlik kullanmak için, tetikleyici ve bağlama yapılandırmasındaki özelliğiyle connection eşleyen ortak bir ön ek altında ayarları tanımlarsınız.

"AzureWebJobsStorage" olarak ayarlanıyorsanız connection bkz . Kimlikle konak depolamaya bağlanma. Diğer tüm bağlantılar için uzantı aşağıdaki özellikleri gerektirir:

Özellik Ortam değişkeni şablonu Açıklama Örnek değer
Tablo Hizmeti URI'si <CONNECTION_NAME_PREFIX>__tableServiceUri1 HTTPS şemasını kullanarak bağlandığınız Azure Depolama tablo hizmetinin veri düzlemi URI'si. <https:// storage_account_name.table.core.windows.net>

1 <CONNECTION_NAME_PREFIX>__serviceUri diğer ad olarak kullanılabilir. Her iki form da sağlanırsa, tableServiceUri form kullanılır. Genel serviceUri bağlantı yapılandırması bloblar, kuyruklar ve/veya tablolar arasında kullanılacaksa form kullanılamaz.

Bağlantıyı özelleştirmek için diğer özellikler ayarlanabilir. Bkz. Kimlik tabanlı bağlantılar için ortak özellikler.

Genel serviceUri bağlantı yapılandırması Azure Depolama'daki bloblar, kuyruklar ve/veya tablolar arasında kullanılacaksa form kullanılamaz. URI yalnızca tablo hizmetini belirleyebilir. Alternatif olarak, aynı ön ek altındaki her hizmet için özel olarak bir URI sağlayabilir ve tek bir bağlantının kullanılmasına olanak sağlayabilirsiniz.

Azure İşlevleri hizmetinde barındırıldığında, kimlik tabanlı bağlantılar yönetilen kimlik kullanır. Ve özellikleriyle credential clientID kullanıcı tarafından atanan bir kimlik belirtilse de, sistem tarafından atanan kimlik varsayılan olarak kullanılır. Kullanıcı tarafından atanan kimliği kaynak kimliğiyle yapılandırmanın desteklenmediğini unutmayın. Yerel geliştirme gibi diğer bağlamlarda çalıştırıldığında, bunun yerine geliştirici kimliğiniz kullanılır, ancak bu özelleştirilebilir. Bkz. Kimlik tabanlı bağlantılarla yerel geliştirme.

Kimliğe izin verme

Hangi kimlik kullanılıyorsa, hedeflenen eylemleri gerçekleştirmek için izinlere sahip olmalıdır. Çoğu Azure hizmeti için bu, bu izinleri sağlayan yerleşik veya özel rolleri kullanarak Azure RBAC'de bir rol atamanız gerektiği anlamına gelir.

Önemli

Bazı izinler, tüm bağlamlar için gerekli olmayan hedef hizmet tarafından gösterilebilir. Mümkün olduğunda, kimliğe yalnızca gerekli ayrıcalıkları sağlayarak en az ayrıcalık ilkesine uyun. Örneğin, uygulamanın yalnızca bir veri kaynağından okuyabilmesi gerekiyorsa, yalnızca okuma izni olan bir rol kullanın. Okuma işlemi için aşırı izin olduğundan, bu hizmete yazmaya da izin veren bir rol atamak uygun olmaz. Benzer şekilde, rol atamasının kapsamının yalnızca okunması gereken kaynaklara göre ayarlandığından emin olmak istersiniz.

Çalışma zamanında Azure Depolama tablo hizmetinize erişim sağlayan bir rol ataması oluşturmanız gerekir. Sahip gibi yönetim rolleri yeterli değildir. Aşağıdaki tabloda, Normal çalışma sırasında Azure Depolama'ya karşı Azure Tabloları uzantısı kullanılırken önerilen yerleşik roller gösterilmektedir. Uygulamanız, yazdığınız koda göre ek izinler gerektirebilir.

Bağlama türü Örnek yerleşik roller (Azure Depolama1)
Giriş bağlaması Depolama Tablosu Veri Okuyucusu
Çıkış bağlaması Depolama Tablosu Veri Katkıda Bulunanı

1 Uygulamanız bunun yerine Tablo için Azure Cosmos DB'deki tablolara bağlanıyorsa, kimlik kullanımı desteklenmez ve bağlantının bir bağlantı dizesi kullanması gerekir.

Kullanım

Bağlamanın kullanımı uzantı paketi sürümüne ve işlev uygulamanızda kullanılan C# modalitesine bağlıdır ve bu da aşağıdakilerden biri olabilir:

Yalıtılmış çalışan işlem sınıfı kitaplığı derlenmiş C# işlevi çalışma zamanından yalıtılmış bir işlemde çalışır.

Modun ve sürümün kullanım ayrıntılarını görmek için bir sürüm seçin.

Tek bir tablo varlığıyla çalışırken Azure Tabloları giriş bağlaması aşağıdaki türlere bağlanabilir:

Type Açıklama
ITableEntity uygulayan bir JSON serileştirilebilir türü İşlevler, varlığı seri durumdan çıkararak düz eski bir CLR nesnesi (POCO) türüne dönüştürmeye çalışır. Türün ITableEntity uygulaması veya dize RowKey özelliği ve dize PartitionKey özelliği olmalıdır.
TableEntity1 Sözlük benzeri bir tür olarak varlık.

Bir sorgudan birden çok varlıkla çalışırken Azure Tabloları giriş bağlaması aşağıdaki türlere bağlanabilir:

Type Açıklama
IEnumerable<T>whereT, ITableEntity'i uygular Sorgu tarafından döndürülen varlıkların numaralandırması. Her girdi bir varlığı temsil eder. Türün T ITableEntity uygulaması veya dize RowKey özelliği ve dize PartitionKey özelliği olmalıdır.
TableClient1 Tabloya bağlı bir istemci. Bu, tabloyu işlemek için en fazla denetimi sunar ve bağlantı yeterli izne sahipse tabloya yazmak için kullanılabilir.

1 Bu türleri kullanmak için Microsoft.Azure.Functions.Worker.Extensions.Tables 1.2.0 veya sonraki sürümlerine ve SDK türü bağlamalarına yönelik ortak bağımlılıklara başvurmanız gerekir.

TableInput özniteliği, işlevi tetikleyen tablo satırına erişmenizi sağlar.

kullanarak context.extraInputs.get()giriş satırı verilerini alın.

Veriler, function.json dosyasındaki name anahtar tarafından belirtilen giriş parametresine geçirilir. ve partitionKey rowKey belirterek belirli kayıtlara filtre uygulamanıza olanak tanır.

Tablo verileri işleve JSON dizesi olarak geçirilir. Giriş örneğinde gösterildiği gibi çağırarak json.loads iletiyi seri durumdan kaldırın.

Belirli kullanım ayrıntıları için bkz . Örnek.

Sonraki adımlar