Azure Functions における Azure Table Storage の入力バインド

Azure Table Storage の入力バインドを使用して、Azure Storage アカウントのテーブルを読み取ります。

1 つのエンティティ

次の例は、1 つのテーブル行を読み取る C# 関数を示しています。 キューに送信されるすべてのメッセージについて、関数がトリガーされます。

行キー値 "{queueTrigger}" は、行キーがキュー メッセージ文字列から取得されることを示します。

public class TableStorage
{
    public class MyPoco
    {
        public string PartitionKey { get; set; }
        public string RowKey { get; set; }
        public string Text { get; set; }
    }

    [FunctionName("TableInput")]
    public static void TableInput(
        [QueueTrigger("table-items")] string input, 
        [Table("MyTable", "MyPartition", "{queueTrigger}")] MyPoco poco, 
        ILogger log)
    {
        log.LogInformation($"PK={poco.PartitionKey}, RK={poco.RowKey}, Text={poco.Text}");
    }
}

CloudTable

CloudTableFunctions v2 以降のランタイムでのみサポートされています。

Azure Storage SDK で CloudTable メソッド パラメーターを使用してテーブルを読み取ります。 Azure Functions ログ テーブルにクエリを実行する関数の例:

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.Cosmos.Table;
using System;
using System.Threading.Tasks;

namespace FunctionAppCloudTable2
{
    public class LogEntity : TableEntity
    {
        public string OriginalName { get; set; }
    }
    public static class CloudTableDemo
    {
        [FunctionName("CloudTableDemo")]
        public static async Task Run(
            [TimerTrigger("0 */1 * * * *")] TimerInfo myTimer, 
            [Table("AzureWebJobsHostLogscommon")] CloudTable cloudTable,
            ILogger log)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

            TableQuery<LogEntity> rangeQuery = new TableQuery<LogEntity>().Where(
                TableQuery.CombineFilters(
                    TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, 
                        "FD2"),
                    TableOperators.And,
                    TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThan, 
                        "t")));

            // Execute the query and loop through the results
            foreach (LogEntity entity in 
                await cloudTable.ExecuteQuerySegmentedAsync(rangeQuery, null))
            {
                log.LogInformation(
                    $"{entity.PartitionKey}\t{entity.RowKey}\t{entity.Timestamp}\t{entity.OriginalName}");
            }
        }
    }
}

CloudTable オブジェクトの使用方法の詳細については、Azure Table Storage の概要ページをご覧ください。

CloudTable にバインドしようとしてエラー メッセージが表示された場合は、適切な Storage SDK バージョンへの参照があることをご確認ください。

IQueryable

IQueryableFunctions v1 ランタイムでのみサポートされています。

次の例は、MyPoco クラスが TableEntity から派生した複数のテーブル行を読み取る C# 関数を示しています。

public class TableStorage
{
    public class MyPoco : TableEntity
    {
        public string Text { get; set; }
    }

    [FunctionName("TableInput")]
    public static void TableInput(
        [QueueTrigger("table-items")] string input, 
        [Table("MyTable", "MyPartition")] IQueryable<MyPoco> pocos, 
        ILogger log)
    {
        foreach (MyPoco poco in pocos)
        {
            log.LogInformation($"PK={poco.PartitionKey}, RK={poco.RowKey}, Text={poco.Text}");
        }
    }
}

属性と注釈

C# クラス ライブラリでは、以下の属性を使用してテーブル入力バインディングを構成します。

  • TableAttribute

    この属性のコンストラクターは、テーブル名、パーティション キー、および行キーを受け取ります。 属性は、次の例のように、out パラメーターまたは関数の戻り値で使用できます。

    [FunctionName("TableInput")]
    public static void Run(
        [QueueTrigger("table-items")] string input, 
        [Table("MyTable", "Http", "{queueTrigger}")] MyPoco poco, 
        ILogger log)
    {
        ...
    }
    

    次の例で示すように、Connection プロパティを設定して、使用するストレージ アカウントを指定できます。

    [FunctionName("TableInput")]
    public static void Run(
        [QueueTrigger("table-items")] string input, 
        [Table("MyTable", "Http", "{queueTrigger}", Connection = "StorageConnectionAppSetting")] MyPoco poco, 
        ILogger log)
    {
        ...
    }
    

    完全な例については、C# の例を参照してください。

  • StorageAccountAttribute

    使用するストレージ アカウントを指定する別の方法を提供します。 コンストラクターは、ストレージ接続文字列を含むアプリ設定の名前を受け取ります。 属性は、パラメーター、メソッド、またはクラス レベルで適用できます。 次の例では、クラス レベルとメソッド レベルを示します。

    [StorageAccount("ClassLevelStorageAppSetting")]
    public static class AzureFunctions
    {
        [FunctionName("TableInput")]
        [StorageAccount("FunctionLevelStorageAppSetting")]
        public static void Run( //...
    {
        ...
    }
    

使用するストレージ アカウントは、次の順序で決定されます。

  • Table 属性の Connection プロパティ。
  • Table 属性と同じパラメーターに適用された StorageAccount 属性。
  • 関数に適用される StorageAccount 属性。
  • クラスに適用される StorageAccount 属性。
  • 関数アプリの既定のストレージ アカウント ("AzureWebJobsStorage" アプリ設定)。

構成

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

function.json のプロパティ 属性のプロパティ 説明
type 該当なし table に設定する必要があります。 このプロパティは、Azure Portal でバインドを作成するときに自動で設定されます。
direction 該当なし in に設定する必要があります。 このプロパティは、Azure Portal でバインドを作成するときに自動で設定されます。
name 該当なし 関数コード内のテーブルまたはエンティティを表す変数の名前。
tableName TableName テーブルの名前。
partitionKey PartitionKey 省略可能。 読み取るテーブル エンティティのパーティション キー。 このプロパティを使用する方法のガイダンスについては、「使用方法」セクションを参照してください。
rowKey RowKey 省略可能。 読み取るテーブル エンティティの行キー。 このプロパティを使用する方法のガイダンスについては、「使用方法」セクションを参照してください。
take Take 省略可能。 JavaScript で読み取るエンティティの最大数。 このプロパティを使用する方法のガイダンスについては、「使用方法」セクションを参照してください。
filter Assert 省略可能。 JavaScript のテーブル入力の OData フィルター式。 このプロパティを使用する方法のガイダンスについては、「使用方法」セクションを参照してください。
connection 接続 このバインドに使用するストレージ接続文字列を含むアプリ設定の名前です。 この設定には、"AzureWebJobs" というプレフィックスが付加されたアプリ設定または接続文字列名を指定できます。 たとえば、設定名が "AzureWebJobsMyStorage" の場合、ここでは "MyStorage" を指定できます。 Functions ランタイムでは、"AzureWebJobsMyStorage" という名前のアプリ設定が自動的に検索されます。 connection を空のままにした場合、Functions ランタイムは、アプリ設定内の AzureWebJobsStorage という名前の既定のストレージ接続文字列を使用します。

ローカルで開発している場合、アプリ設定は local.settings.json ファイルに保存されます。

使用法

  • 1 行の読み取り

    partitionKeyrowKey を設定します。 メソッド パラメーター T <paramName> を使用して、テーブル データにアクセスします。 C# スクリプトでは、paramNamefunction.jsonname プロパティで指定された値です。 通常、T は、ITableEntity を実装する型か、TableEntity から派生する型です。 filter および take プロパティは、このシナリオでは使用しません。

  • 1 つ以上の行の読み取り

    メソッド パラメーター IQueryable<T> <paramName> を使用して、テーブル データにアクセスします。 C# スクリプトでは、paramNamefunction.jsonname プロパティで指定された値です。 T は、ITableEntity を実装する型か、TableEntity から派生する型にする必要があります。 必要なフィルター処理があれば、IQueryable メソッドを使用して実行します。 partitionKeyrowKeyfiltertake の各プロパティは、このシナリオでは使用しません。

    注意

    IQueryableFunctions v2 ランタイムではサポートされていません。 代わりに、Azure Storage SDK で CloudTable paramName メソッド パラメーターを使用して、テーブルを読み取ります。 CloudTable にバインドしようとしてエラー メッセージが表示された場合は、適切な Storage SDK バージョンへの参照があることをご確認ください。

次の手順