次の方法で共有


Azure Functions における Azure Functions の出力バインド

Azure Table の出力バインドを使用して、Azure Cosmos DB for Table または Azure Table Storage のテーブルにエンティティを書き込みます。

セットアップと構成の詳細については、概要をご覧ください

Note

この出力バインドでは、テーブル内での新しいエンティティの作成のみがサポートされます。 関数コードから既存のエンティティを更新する必要がある場合、代わりに Azure Tables SDK を直接使用します。

重要

この記事では、タブを使用して、Node.js プログラミング モデルの複数のバージョンに対応しています。 v4 モデルは一般提供されており、JavaScript と TypeScript の開発者にとって、より柔軟で直感的なエクスペリエンスが得られるように設計されています。 v4 モデルの動作の詳細については、Azure Functions Node.js 開発者ガイドを参照してください。 v3 と v4 の違いの詳細については、移行ガイドを参照してください。

A C# 関数は、次の C# モードのいずれかを使用して作成できます。

  • 分離されたワーカー モデル: ランタイムから分離されたワーカー プロセスで実行されるコンパイル済みの C# 関数。 分離ワーカー プロセスは、LTS および 非 LTS バージョンの .NET および .NET Framework で実行されている C# 関数をサポートするために必要です。 分離ワーカー プロセス関数の拡張機能では、Microsoft.Azure.Functions.Worker.Extensions.* 名前空間が使用されます。
  • インプロセス モデル: Functions ランタイムと同じプロセスで実行されるコンパイル済みの C# 関数。 このモデルの一部では、主に C# ポータルの編集のためにサポートされている C# スクリプトを使用して Functions を実行できます。 インプロセス関数の拡張機能では、Microsoft.Azure.WebJobs.Extensions.* 名前空間が使用されます。

次の MyTableData のクラスは、テーブル内のデータの行を表します。

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

Queue Storage トリガーによって開始される次の関数は、 MyDataTableという名前の 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}"
    };
}

次の例は、HTTP トリガーを使用して 1 つのテーブル行を書き込む Java 関数を示しています。

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

次の例は、HTTP トリガーを使用して複数のテーブル行を書き込む Java 関数を示しています。

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

次の例は、複数のテーブル エンティティを書き込むテーブル出力バインドを示しています。

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

次の例は、関数からテーブルに複数のエンティティを書き込む方法を示しています。

function.json のバインド構成:

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

run.ps1 の PowerShell コード:

param($InputData, $TriggerMetadata)

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

次の例では、Table Storage の出力バインドを使用する方法を示します。 table バインドは、値を nametableNamepartitionKeyconnection に割り当てることで function.json で次のように構成されます。

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

次の関数は、rowKey 値に対して一意の UUI を生成し、メッセージを 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}")

属性

インプロセス分離ワーカー プロセスの C# ライブラリの両方で、属性を使って関数を定義します。 C# スクリプトでは、C# スクリプト ガイドで説明されているように、代わりに function.json 構成ファイルを使用します。

C# クラス ライブラリでは、TableInputAttribute は次のプロパティをサポートしています。

属性のプロパティ 説明
TableName 書き込むテーブルの名前。
PartitionKey 書き込むテーブル エンティティのパーティション キー。
RowKey 書き込むテーブル エンティティの行キー。
接続 テーブル サービスへの接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。

注釈

Java 関数ランタイム ライブラリで、パラメーターで TableOutput 注釈を使用し、ご使用のテーブルに値を書き込みます。 属性では、次の要素がサポートされています。

要素 説明
name テーブルまたはエンティティを表す関数コードに使用される変数の名前。
dataType Functions ランタイムがパラメーター値をどのように扱うかを定義します。 詳細については、 「データ型」に関するページを参照してください。
tableName 書き込むテーブルの名前。
partitionKey 書き込むテーブル エンティティのパーティション キー。
rowKey 書き込むテーブル エンティティの行キー。
connection テーブル サービスへの接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。

構成

次の表では、output.table() メソッドに渡される options オブジェクトに対して設定できるプロパティについて説明します。

プロパティ 説明
tableName 書き込むテーブルの名前。
partitionKey 書き込むテーブル エンティティのパーティション キー。
rowKey 書き込むテーブル エンティティの行キー。
connection テーブル サービスへの接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。

構成

次の表は、function.json ファイルで設定したバインド構成のプロパティを説明しています。

function.json のプロパティ 説明
type table に設定する必要があります。 このプロパティは、Azure Portal でバインドを作成するときに自動で設定されます。
direction out に設定する必要があります。 このプロパティは、Azure Portal でバインドを作成するときに自動で設定されます。
name テーブルまたはエンティティを表す関数コードに使用される変数の名前。 $return に設定して、関数の戻り値を参照します。
tableName 書き込むテーブルの名前。
partitionKey 書き込むテーブル エンティティのパーティション キー。
rowKey 書き込むテーブル エンティティの行キー。
connection テーブル サービスへの接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。

ローカルで開発する場合は、Values コレクション内の local.settings.json ファイルにアプリケーション設定を追加します。

つながり

connection プロパティは、アプリをテーブル サービスに接続する方法を指定する環境構成への参照です。 次が指定されている場合があります。

  • 接続文字列を含むアプリケーション設定の名前
  • 合わせて ID ベースの接続を定義する、複数のアプリケーション設定の共有のプレフィックスの名前

構成された値が、1 つの設定に完全一致し、プレフィックスがその他の設定とも一致する場合は、完全一致が使用されます。

接続文字列

Azure Table ストレージでテーブルの接続文字列を取得するには、「ストレージ アカウント アクセス キーを管理する」の手順に従います。 Azure Cosmos DB for Table のテーブルの接続文字列を取得するには、「Azure Cosmos DB for Table の FAQ」に記載されている手順に従います。

この接続文字列は、バインディング構成の connection プロパティで指定した値と同じ名前のアプリケーション設定に格納する必要があります。

アプリ設定の名前が "AzureWebJobs" で始まる場合は、ここで名前の残りの部分のみを指定できます。 たとえば、connection を "MyStorage" に設定した場合、Functions ランタイムは "AzureWebJobsMyStorage" という名前のアプリ設定を探します。 connection を空のままにした場合、Functions ランタイムは、アプリ設定内の AzureWebJobsStorage という名前の既定のストレージ接続文字列を使用します。

ID ベースの接続

Tables API 拡張機能を使っている場合は、シークレットを含む接続文字列を使う代わりに、アプリで Microsoft Entra ID を使用できます。 これは Azure Storage のテーブルにアクセスする場合にのみ適用されます。 ID を使用するには、トリガーとバインドの構成の connection プロパティにマップされる共通のプレフィックスに設定を定義します。

connection を "AzureWebJobsStorage" に設定する場合は、「ID を使用してホスト ストレージに接続する」を参照してください。 その他のすべての接続では、拡張機能に次のプロパティが必要です。

プロパティ 環境変数テンプレート 説明 値の例
テーブル サービス URI <CONNECTION_NAME_PREFIX>__tableServiceUri1 HTTPS スキームを使用して接続している Azure Storage テーブル サービスのデータ プレーン URI。 https://<storage_account_name>.table.core.windows.net

1 <CONNECTION_NAME_PREFIX>__serviceUri はエイリアスとして使用できます。 両方の形式が指定された場合、tableServiceUri の形式が使用されます。 全体の接続構成が BLOB、キュー、テーブル間で使用される場合、serviceUri 形式は指定できません。

接続をカスタマイズするには、他のプロパティを設定します。 「ID ベース接続に共通のプロパティ」を参照してください。

全体の接続構成が Azure Storage 内の BLOB、キュー、テーブル間で使用される場合、serviceUri 形式は指定できません。 URI ではテーブル サービスのみを指定できます。 別の方法として、同じプレフィックスでのサービスごとに専用の URI を指定して、1 つの接続を使用できるようにすることができます。

Azure Functions サービスでホストされている場合、ID ベースの接続では、マネージド ID が使用されます。 ユーザー割り当て ID を credential および clientID プロパティで指定できますが、システム割り当て ID が既定で使用されます。 リソース ID を使用したユーザー割り当て ID の構成はサポートされていないことに注意してください。 ローカル開発などの他のコンテキストで実行する場合は、代わりに開発者 ID が使用されますが、カスタマイズすることもできます。 ID ベースの接続によるローカル開発に関するページをご覧ください。

ID にアクセス許可を付与する

使用されている ID が何であれ、目的のアクションを実行するためのアクセス許可が必要です。 ほとんどの Azure では、これはそれらのアクセス許可を提供する組み込みロールまたはカスタム ロールを使って、Azure RBAC でロールを割り当てる必要があることを意味します。

重要

すべてのコンテキストに必要ではない一部のアクセス許可がターゲット サービスによって公開される場合があります。 可能であれば、最小限の特権の原則に従い、必要な特権だけを ID に付与します。 たとえば、アプリがデータ ソースからの読み取りのみを行う必要がある場合は、読み取りアクセス許可のみを持つロールを使用します。 サービスへの書き込みも可能なロールを割り当てることは、読み取り操作に対するアクセス許可が過剰になるため、不適切です。 同様に、ロールの割り当てが、読み取る必要のあるリソースだけに限定されていることを確認する必要があります。

実行時に Azure Storage テーブル サービスへのアクセスを提供するロール割り当てを作成する必要があります。 所有者のような管理ロールでは十分ではありません。 次の表は、通常の操作で Azure Storage に対して Azure テーブルの拡張機能を使用するときに推奨される組み込みロールを示しています。 アプリケーションでは、記述したコードに基づいて追加のアクセス許可が必要になる場合があります。

[バインドの種類] 組み込みロールの例 (Azure Storage 1)
入力バインド ストレージ テーブル データ閲覧者
出力バインド ストレージ テーブル データ共同作成者

1 代わりに、アプリが Azure Cosmos DB for Table のテーブルに接続している場合、ID の使用はサポートされておらず、接続は接続文字列を使用する必要があります。

使用法

バインディングの使用方法は、拡張機能パッケージのバージョンと、関数アプリで使用される C# のモダリティによって異なり、次のいずれかになります。

分離ワーカー プロセス クラス ライブラリでコンパイルされた C# 関数は、ランタイムから分離されたプロセスで実行されます。

バージョンを選択すると、モードとバージョンの使用状況の詳細が表示されます。

関数を 1 つのエンティティに書き込む場合、Azure Tables 出力バインドは次の型にバインドできます。

Type 説明
[ITableEntity] を実装する、JSON シリアル化可能な型 Functions は、Plain Old CLR Object (POCO) 型をエンティティとしてシリアル化しようとします。 この型は、[ITableEntity] を実装するものか、RowKey 文字列プロパティと PartitionKey 文字列プロパティを持つものにする必要があります。

関数で複数のエンティティに書き込む場合、Azure テーブルの出力バインドは次の型にバインドできます。

Type 説明
T[] (T は単一のエンティティ型の 1 つ) 複数のエンティティを含む配列。 各エントリは 1 つのエンティティを表します。

その他の出力シナリオでは、Azure.Data.Tables から型を直接作成して使用します。

TableStorageOutput 注釈を使用して関数から Table Storage 行を出力するには、次の 2 つのオプションがあります。

オプション 説明
戻り値 関数自体に注釈を適用すると、関数の戻り値が Table Storage 行として永続化されます。
命令型 テーブル行を明示的に設定するには、OutputBinding<T> 型の特定のパラメーターに注釈を適用します。この場合、T には PartitionKeyRowKey のプロパティが含まれます。 これらのプロパティは、ITableEntity を実装、または TableEntity を継承することで、付随させることができます。

値を返すか、context.extraOutputs.set() を使って出力行データを設定します。

テーブル データに書き込むには、Push-OutputBinding コマンドレットを使用して、-Name TableBinding パラメーターと、行データに等しい -Value パラメーターを設定します。 詳細については、PowerShell の例を参照してください。

関数から Table Storage 行メッセージを出力するには、次の 2 つのオプションがあります。

オプション 説明
戻り値 function.json 内の name プロパティを $return に設定します。 この構成では、関数の戻り値は Table Storage 行として永続化されます。
命令型 Out 型として宣言されたパラメーターの set メソッドに値を渡します。 set に渡された値は、テーブル行として保持されます。

具体的な使用方法の詳細については、「例」を参照してください。

例外とリターン コード

バインド リファレンス
テーブル テーブル エラー コード
BLOB、テーブル、キュー ストレージ エラー コード
BLOB、テーブル、キュー トラブルシューティング

次のステップ