Azure Functions における Storage テーブルのバインド

この記事では、Azure Functions で Azure Storage のテーブル バインドを構成したりコーディングしたりする方法について説明します。 Azure Functions は、Azure Storage テーブルの入力および出力のバインドをサポートしています。

Storage テーブルのバインドは、次のシナリオをサポートしています。

  • C# または Node.js 関数での単一行の読み取り - partitionKeyrowKey を設定します。 filter および take プロパティは、このシナリオでは使用しません。
  • C# 関数での複数行の読み取り - Functions ランタイムは、テーブルにバインドされた IQueryable<T> オブジェクトを指定します。 型 TTableEntity から派生するか、ITableEntity を実装する必要があります。 partitionKeyrowKeyfilter、および take の各プロパティは、このシナリオでは使用しません。必要なフィルター処理は、IQueryable オブジェクトを使用して実行できます。
  • ノード関数での複数行の読み取り - filter プロパティと take プロパティを設定します。 partitionKeyrowKey は設定しません。
  • C# 関数での単一行または複数行の書き込み - Functions ランタイムは、テーブルにバインドされた ICollector<T> または IAsyncCollector<T> を指定します。ここで、T は追加するエンティティのスキーマを指定します。 型 TTableEntity から派生するか、ITableEntity を実装するのが一般的ですが、必須ではありません。 partitionKeyrowKeyfiltertake の各プロパティは、このシナリオでは使用しません。

これは、Azure Functions の開発者向けリファレンス情報です。 Azure Functions を初めて使用する場合は、先に次のリソースを参照してください。

Storage テーブルの入力バインド

Azure Storage テーブルの入力バインドにより、関数で Storage テーブルを使用できます。

関数への Storage テーブルの入力では、function.json の bindings 配列内にある次の JSON オブジェクトが使用されます。

{
    "name": "<Name of input parameter in function signature>",
    "type": "table",
    "direction": "in",
    "tableName": "<Name of Storage table>",
    "partitionKey": "<PartitionKey of table entity to read - see below>",
    "rowKey": "<RowKey of table entity to read - see below>",
    "take": "<Maximum number of entities to read in Node.js - optional>",
    "filter": "<OData filter expression for table input in Node.js - optional>",
    "connection": "<Name of app setting - see below>",
}

以下の点に注意してください。

  • 単一のエンティティを読み取るには、partitionKeyrowKey を一緒に使用します。 これらのプロパティは省略可能です。
  • connection にはストレージ接続文字列を含むアプリ設定の名前を含める必要があります。 Azure Portal では、ストレージ アカウントの作成や既存のストレージ アカウントの選択を行う際、[統合] タブの標準エディターによってこのアプリ設定が構成されます。 このアプリケーション設定を手動で構成することもできます。

入力の使用方法

C# 関数の場合、入力テーブルの単一のエンティティ (または複数のエンティティ) にバインドするには、関数のシグネチャで <T> <name> などの名前付きパラメーターを使用します。 T はデータの逆シリアル化先のデータ型です。paramName入力バインドで指定した名前です。 Node.js 関数の場合、context.bindings.<name> を使用して入力テーブルの単一のエンティティ (または複数のエンティティ) にアクセスします。

入力データは Node.js または C# 関数で逆シリアル化できます。 逆シリアル化されたオブジェクトには RowKey プロパティと PartitionKey プロパティがあります。

また、C# 関数では、次の型のどれにでもバインドすることができ、Functions ランタイムはその型を使用してテーブル データを逆シリアル化しようとします。

  • ITableEntity を実装するすべての型
  • IQueryable<T>

入力サンプル

キュー トリガーを使用して単一のテーブル行を読み取る、次の function.json があるとします。 この JSON は、PartitionKey RowKey を指定します。 "rowKey": "{queueTrigger}" は、行キーがキュー メッセージ文字列から取得されることを示します。

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnection",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "personEntity",
      "type": "table",
      "tableName": "Person",
      "partitionKey": "Test",
      "rowKey": "{queueTrigger}",
      "connection": "MyStorageConnection",
      "direction": "in"
    }
  ],
  "disabled": false
}

単一のテーブル エンティティを読み込む言語固有のサンプルを参照してください。

C# での入力サンプル

public static void Run(string myQueueItem, Person personEntity, TraceWriter log)
{
    log.Info($"C# Queue trigger function processed: {myQueueItem}");
    log.Info($"Name in Person entity: {personEntity.Name}");
}

public class Person
{
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public string Name { get; set; }
}

F# での入力サンプル

[<CLIMutable>]
type Person = {
  PartitionKey: string
  RowKey: string
  Name: string
}

let Run(myQueueItem: string, personEntity: Person) =
    log.Info(sprintf "F# Queue trigger function processed: %s" myQueueItem)
    log.Info(sprintf "Name in Person entity: %s" personEntity.Name)

Node.js での入力サンプル

module.exports = function (context, myQueueItem) {
    context.log('Node.js queue trigger function processed work item', myQueueItem);
    context.log('Person entity name: ' + context.bindings.personEntity.Name);
    context.done();
};

Storage テーブルの出力バインド

Azure Storage テーブルの出力バインドにより、関数で Storage テーブルにエンティティを書き込むことができます。

関数への Storage テーブルの出力では、function.json の bindings 配列内にある次の JSON オブジェクトが使用されます。

{
    "name": "<Name of input parameter in function signature>",
    "type": "table",
    "direction": "out",
    "tableName": "<Name of Storage table>",
    "partitionKey": "<PartitionKey of table entity to write - see below>",
    "rowKey": "<RowKey of table entity to write - see below>",
    "connection": "<Name of app setting - see below>",
}

以下の点に注意してください。

  • 単一のエンティティを書き込むには、partitionKeyrowKey を一緒に使用します。 これらのプロパティは省略可能です。 関数コードでエンティティ オブジェクトを作成する際に PartitionKeyRowKey を指定することもできます。
  • connection にはストレージ接続文字列を含むアプリ設定の名前を含める必要があります。 Azure Portal では、ストレージ アカウントの作成や既存のストレージ アカウントの選択を行う際、[統合] タブの標準エディターによってこのアプリ設定が構成されます。 このアプリケーション設定を手動で構成することもできます。

出力の使用方法

C# 関数の場合、テーブルの出力にバインドするには、関数のシグネチャで out <T> <name> などの名前付き out パラメーターを使用します。T はデータのシリアル化先のデータ型です。paramName出力バインドで指定した名前です。 Node.js 関数の場合、context.bindings.<name> を使用してテーブルの出力にアクセスします。

Node.js または C# 関数でオブジェクトをシリアル化できます。 C# 関数の場合は、次の型にもバインドできます。

  • ITableEntity を実装するすべての型
  • ICollector<T> (複数のエンティティを出力する場合。 サンプルを参照してください)
  • IAsyncCollector<T> (ICollector<T> の非同期バージョン)
  • CloudTable (Azure Storage SDK を使用する場合。 サンプルを参照してください)

出力サンプル

次の function.jsonrun.csx の例は、複数のテーブル エンティティを書き込む方法をしています。

{
  "bindings": [
    {
      "name": "input",
      "type": "manualTrigger",
      "direction": "in"
    },
    {
      "tableName": "Person",
      "connection": "MyStorageConnection",
      "name": "tableBinding",
      "type": "table",
      "direction": "out"
    }
  ],
  "disabled": false
}

複数のテーブル エンティティを作成する言語固有のサンプルを参照してください。

C# での出力サンプル

public static void Run(string input, ICollector<Person> tableBinding, TraceWriter log)
{
    for (int i = 1; i < 10; i++)
        {
            log.Info($"Adding Person entity {i}");
            tableBinding.Add(
                new Person() { 
                    PartitionKey = "Test", 
                    RowKey = i.ToString(), 
                    Name = "Name" + i.ToString() }
                );
        }

}

public class Person
{
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public string Name { get; set; }
}

F# での出力サンプル

[<CLIMutable>]
type Person = {
  PartitionKey: string
  RowKey: string
  Name: string
}

let Run(input: string, tableBinding: ICollector<Person>, log: TraceWriter) =
    for i = 1 to 10 do
        log.Info(sprintf "Adding Person entity %d" i)
        tableBinding.Add(
            { PartitionKey = "Test"
              RowKey = i.ToString()
              Name = "Name" + i.ToString() })

Node.js での出力サンプル

module.exports = function (context) {

    context.bindings.tableBinding = [];

    for (var i = 1; i < 10; i++) {
        context.bindings.tableBinding.push({
            PartitionKey: "Test",
            RowKey: i.toString(),
            Name: "Name " + i
        });
    }

    context.done();
};

サンプル: C# での複数のテーブル エンティティの読み取り

次の function.json および C# コード例では、キュー メッセージに指定されたパーティション キーのエンティティを読み取ります。

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnection",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "tableBinding",
      "type": "table",
      "connection": "MyStorageConnection",
      "tableName": "Person",
      "direction": "in"
    }
  ],
  "disabled": false
}

C# コードは、エンティティ型が TableEntityから派生できるように、Azure Storage SDK に参照を追加します。

#r "Microsoft.WindowsAzure.Storage"
using Microsoft.WindowsAzure.Storage.Table;

public static void Run(string myQueueItem, IQueryable<Person> tableBinding, TraceWriter log)
{
    log.Info($"C# Queue trigger function processed: {myQueueItem}");
    foreach (Person person in tableBinding.Where(p => p.PartitionKey == myQueueItem).ToList())
    {
        log.Info($"Name: {person.Name}");
    }
}

public class Person : TableEntity
{
    public string Name { get; set; }
}

次のステップ

Azure Functions のその他のバインドとトリガーについて詳しくは、「Azure Functions のトリガーとバインドの開発者用リファレンス」をご覧ください。