Azure Functions C# スクリプト (.csx) 開発者向けリファレンス

この記事では、C# スクリプト ( .csx) を使用した Azure Functions 開発の概要を示します。

重要

C# スクリプトは主に、C# 関数の作成と実行をすばやく開始するのに役立つ便利なポータル内エクスペリエンスを提供するためにサポートされています。 運用品質のアプリの場合は、代わりにコンパイル済みの C# クラス ライブラリ プロジェクトとして C# 関数をローカルで開発する必要があります。 C# スクリプト プロジェクトを C# クラス ライブラリ (分離ワーカー) プロジェクトに移行する方法については、「C# スクリプト アプリを C# プロジェクトに変換する」を参照してください。

Azure Functions では、次のいずれかの方法で C# を使用して関数を開発できます。

実行プロセス Code 拡張機能 開発環境 リファレンス
C# スクリプト インプロセス .csx ポータル
Core Tools
この記事の内容は次のとおりです。
C# クラス ライブラリ (分離ワーカー) 分離ワーカー プロセス .cs Visual Studio
Visual Studio Code
Core Tools
.NET 分離ワーカー プロセス関数
C# クラス ライブラリ (インプロセス) インプロセス .cs Visual Studio
Visual Studio Code
Core Tools
インプロセス C# クラス ライブラリ関数

.csx のしくみ

データは、メソッドの引数を使用して C# 関数に渡されます。 引数名は function.json ファイルで指定され、関数のロガーやキャンセル トークンなどにアクセスするための定義済みの名前があります。

.csx の形式では、"定型" の記述が少なく、C# 関数のみの記述に重点が置かれています。 名前空間およびクラスにすべてをラップするのではなく、Run メソッドを定義するだけです。 通常どおり、すべてのアセンブリ参照と名前空間をファイルの先頭に含めます。

関数アプリの .csx ファイルは、インスタンスの初期化時にコンパイルされます。 このコンパイル手順は、C# クラス ライブラリと比較して C# スクリプト関数のコールド スタートに長い時間がかかることなどを意味します。 このコンパイル手順は、C# クラス ライブラリが編集可能でないのに対し、C# スクリプト関数が Azure portal 上で編集可能である理由でもあります。

フォルダー構造

C# スクリプト プロジェクトのフォルダー構造は、次の例のようになります。

FunctionsProject
 | - MyFirstFunction
 | | - run.csx
 | | - function.json
 | | - function.proj
 | - MySecondFunction
 | | - run.csx
 | | - function.json
 | | - function.proj
 | - host.json
 | - extensions.csproj
 | - bin

関数アプリの構成に使用できる共有 host.json ファイルがあります。 各関数には、独自のコード ファイル (.csx) とバインディング構成ファイル (function.json) があります。

Functions ランタイムのバージョン 2.x およびそれ以降 で必要なバインディング拡張機能は、bin フォルダー内の実際のライブラリファイルと共に、extensions.csprojファイルで定義されます。 ローカルで開発する場合は、バインド拡張機能を登録する必要があります。 Azure portal 上で関数を開発するときに、この登録が実行されます。

引数へのバインド

入力または出力データは、function.json 構成ファイルの name プロパティを介して C# スクリプト関数パラメーターにバインドされます。 次の例は、キューによってトリガーされる関数の function.json ファイルと run.csx ファイルを示しています。 キュー メッセージからデータを受信するパラメーターの名前は myQueueItem です。これは name プロパティの値であるためです。

{
    "disabled": false,
    "bindings": [
        {
            "type": "queueTrigger",
            "direction": "in",
            "name": "myQueueItem",
            "queueName": "myqueue-items",
            "connection":"MyStorageConnectionAppSetting"
        }
    ]
}
#r "Microsoft.WindowsAzure.Storage"

using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Queue;
using System;

public static void Run(CloudQueueMessage myQueueItem, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem.AsString}");
}

#r ステートメントについては、この記事の後半で説明します。

バインドでサポートされる型

各バインドには独自にサポートされている型があります。たとえば、BLOB トリガーは文字列パラメーター、POCO パラメーター、CloudBlockBlob パラメーター、またはサポートされるその他の複数の型のいずれかで使用できます。 BLOB バインディングのバインド リファレンスに関する記事では、BLOB トリガーでサポートされているすべてのパラメーター型の一覧を示しています。 詳細については、トリガーとバインドに関する記事と、各バインドの種類に対応するバインド リファレンス ドキュメントをご覧ください。

ヒント

HTTP または Webhook のバインディングを使用する予定がある場合は、不適切な HttpClient のインスタンス化によって生じるおそれのあるポートの枯渇を防止してください。 詳細については、「How to manage connections in Azure Functions」(Azure Functions で接続を管理する方法) を参照してください。

カスタム クラスの参照

カスタムの単純な従来の CLR オブジェクト (POCO) クラスを使用する必要がある場合は、クラス定義を同じファイルに含めることも、別のファイルに格納することもできます。

次の例は、POCO クラス定義を含む run.csx の例を示しています。

public static void Run(string myBlob, out MyClass myQueueItem)
{
    log.Verbose($"C# Blob trigger function processed: {myBlob}");
    myQueueItem = new MyClass() { Id = "myid" };
}

public class MyClass
{
    public string Id { get; set; }
}

POCO クラスでは、各プロパティにゲッターとセッターが定義されている必要があります。

.csx コードの再利用

他の .csx ファイルで定義されたクラスとメソッドを、run.csx ファイルで使用できます。 そのためには、run.csx ファイル内で #load ディレクティブを使用します。 次の例では、MyLogger という名前のログ記録ルーチンが myLogger.csx 内で共有され、#load ディレクティブを使用して run.csx に読み込まれます。

run.csxの例:

#load "mylogger.csx"

using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, ILogger log)
{
    log.LogInformation($"Log by run.csx: {DateTime.Now}");
    MyLogger(log, $"Log by MyLogger: {DateTime.Now}");
}

mylogger.csxの例:

public static void MyLogger(ILogger log, string logtext)
{
    log.LogInformation(logtext);
}

共有された .csx ファイルの使用は、POCO オブジェクトを使用して関数間で渡されるデータを厳密に型宣言する場合の一般的なパターンです。 次の簡略化された例では、HTTP トリガーとキュー トリガーが Order という名前の POCO オブジェクトを共有して、注文データを厳密に型宣言しています。

例: HTTP トリガーの run.csx

#load "..\shared\order.csx"

using System.Net;
using Microsoft.Extensions.Logging;

public static async Task<HttpResponseMessage> Run(Order req, IAsyncCollector<Order> outputQueueItem, ILogger log)
{
    log.LogInformation("C# HTTP trigger function received an order.");
    log.LogInformation(req.ToString());
    log.LogInformation("Submitting to processing queue.");

    if (req.orderId == null)
    {
        return new HttpResponseMessage(HttpStatusCode.BadRequest);
    }
    else
    {
        await outputQueueItem.AddAsync(req);
        return new HttpResponseMessage(HttpStatusCode.OK);
    }
}

例: キュー トリガーの run.csx

#load "..\shared\order.csx"

using System;
using Microsoft.Extensions.Logging;

public static void Run(Order myQueueItem, out Order outputQueueItem, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed order...");
    log.LogInformation(myQueueItem.ToString());

    outputQueueItem = myQueueItem;
}

例: order.csx

public class Order
{
    public string orderId {get; set; }
    public string custName {get; set;}
    public string custAddress {get; set;}
    public string custEmail {get; set;}
    public string cartId {get; set; }

    public override String ToString()
    {
        return "\n{\n\torderId : " + orderId +
                  "\n\tcustName : " + custName +
                  "\n\tcustAddress : " + custAddress +
                  "\n\tcustEmail : " + custEmail +
                  "\n\tcartId : " + cartId + "\n}";
    }
}

#load ディレクティブで相対パスを使用できます。

  • #load "mylogger.csx" によって、関数フォルダーにあるファイルが読み込まれます。
  • #load "loadedfiles\mylogger.csx" によって、関数フォルダー内のフォルダーにあるファイルが読み込まれます。
  • #load "..\shared\mylogger.csx" によって、関数フォルダーと同じレベル ( wwwrootの直下) にあるフォルダーのファイルが読み込まれます。

#load ディレクティブは、 .csx ファイルでのみ機能し、 .cs ファイルでは機能しません。

メソッドの戻り値へのバインド

function.json 内の名前 $return を使用して、出力バインディングにメソッド戻り値を使用できます。

{
    "name": "$return",
    "type": "blob",
    "direction": "out",
    "path": "output-container/{id}"
}

戻り値を使用した C# スクリプト コードと非同期の例を次に示します:

public static string Run(WorkItem input, ILogger log)
{
    string json = string.Format("{{ \"id\": \"{0}\" }}", input.Id);
    log.LogInformation($"C# script processed queue message. Item={json}");
    return json;
}
public static Task<string> Run(WorkItem input, ILogger log)
{
    string json = string.Format("{{ \"id\": \"{0}\" }}", input.Id);
    log.LogInformation($"C# script processed queue message. Item={json}");
    return Task.FromResult(json);
}

正常な関数の実行によって、常に戻り値が出力バインドに渡される場合のみ、戻り値を使用してください。 それ以外の場合は、次のセクションに示すように ICollector または IAsyncCollector を使用してください。

複数の出力値の書き込み

1 つの出力バインドに複数の値を書き込むため、または正常な関数の呼び出しによって出力バインドに渡される値がない場合、ICollector または IAsyncCollector 型を使用してください。 これらの型は、メソッド完了時に出力バインドに書き込まれる、書き込み専用接続です。

この例では、ICollector を使用して複数のキュー メッセージを同じキューに書き込みます。

public static void Run(ICollector<string> myQueue, ILogger log)
{
    myQueue.Add("Hello");
    myQueue.Add("World!");
}

ログ記録

出力を C# のストリーミング ログにログ記録するために、ILogger 型の引数を含めます。 これの名前を logにすることをお勧めします。 Azure Functions では Console.Write を使用しないでください。

public static void Run(string myBlob, ILogger log)
{
    log.LogInformation($"C# Blob trigger function processed: {myBlob}");
}

Note

TraceWriter の代わりに使用できる新しいログ記録フレームワークについては、.NET クラス ライブラリ開発者ガイドのドキュメント「ILogger」を参照してください。

カスタム メトリックのログ記録

ILoggerLogMetric 拡張メソッドを使用して、Application Insights でカスタム メトリックを作成できます。 メソッド呼び出しの例を次に示します。

logger.LogMetric("TestMetric", 1234);

.NET 用 Application Insights API を使用して TrackMetric を呼び出す代わりに、このコードを使用できます。

非同期

関数を非同期にするには、async キーワードを使用して Task オブジェクトを返します。

public async static Task ProcessQueueMessageAsync(
        string blobName,
        Stream blobInput,
        Stream blobOutput)
{
    await blobInput.CopyToAsync(blobOutput, 4096);
}

非同期関数では out パラメーターを使用できません。 出力バインドには、代わりに関数の戻り値またはコレクター オブジェクトを使用します。

キャンセル トークン

関数は CancellationToken パラメーターを受け付けることができます。これにより、オペレーティング システムは、その関数をいつ終了しようとしているかをコードに通知できます。 この通知を使用すれば、関数が予期せず終了してデータが不整合な状態になることを防止できます。

次の例は、関数の終了が迫っているかどうかを確認する方法を示しています。

using System;
using System.IO;
using System.Threading;

public static void Run(
    string inputText,
    TextWriter logger,
    CancellationToken token)
{
    for (int i = 0; i < 100; i++)
    {
        if (token.IsCancellationRequested)
        {
            logger.WriteLine("Function was cancelled at iteration {0}", i);
            break;
        }
        Thread.Sleep(5000);
        logger.WriteLine("Normal processing for queue message={0}", inputText);
    }
}

名前空間のインポート

名前空間をインポートする必要がある場合は、 using 句を使用して、通常どおりにインポートできます。

using System.Net;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

public static Task<HttpResponseMessage> Run(HttpRequestMessage req, ILogger log)

次の名前空間は自動的にインポートされるため、オプションとなります。

  • System
  • System.Collections.Generic
  • System.IO
  • System.Linq
  • System.Net.Http
  • System.Threading.Tasks
  • Microsoft.Azure.WebJobs
  • Microsoft.Azure.WebJobs.Host

外部アセンブリの参照

フレームワークのアセンブリには、 #r "AssemblyName" ディレクティブを使用して参照を追加します。

#r "System.Web.Http"

using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

public static Task<HttpResponseMessage> Run(HttpRequestMessage req, ILogger log)

次のアセンブリは、Azure Functions をホストしている環境によって自動的に追加されます。

  • mscorlib
  • System
  • System.Core
  • System.Xml
  • System.Net.Http
  • Microsoft.Azure.WebJobs
  • Microsoft.Azure.WebJobs.Host
  • Microsoft.Azure.WebJobs.Extensions
  • System.Web.Http
  • System.Net.Http.Formatting

次のアセンブリは、ランタイム バージョンによって単純な名前で参照できます。

  • Newtonsoft.Json
  • Microsoft.WindowsAzure.Storage*

*ランタイムのバージョン 4.x で削除されました。

コードでは、アセンブリは次の例のように参照されます。

#r "AssemblyName"

カスタム アセンブリの参照

カスタム アセンブリを参照するために、共有アセンブリまたはプライベート アセンブリのいずれかを使用できます。

  • 共有アセンブリは、関数アプリ内のすべての関数にわたって共有されます。 カスタム アセンブリを参照するには、そのアセンブリを関数アプリのルート フォルダー (wwwroot) 内の bin という名前のフォルダーにアップロードします。

  • プライベート アセンブリは、特定の関数のコンテキストの一部であり、異なるバージョンのサイドローディングをサポートします。 プライベート アセンブリを関数ディレクトリ の bin フォルダーにアップロードする必要があります。 #r "MyAssembly.dll" などのファイル名を使用してアセンブリを参照します。

関数フォルダーにファイルをアップロードする方法については、パッケージ管理に関するセクションをご覧ください。

監視対象のディレクトリ

関数のスクリプト ファイルを含むディレクトリは、アセンブリの変更を自動的に監視されています。 その他のディレクトリでアセンブリの変更を監視するには、host.jsonwatchDirectories の一覧にそのディレクトリを追加します。

NuGet パッケージを使用する

バインド拡張機能パッケージと他の NuGet パッケージの両方を関数アプリに追加する方法は、Functions ランタイムの対象バージョンによって異なります。

既定では、サポートされている一連の Functions 拡張機能NuGet パッケージは、拡張機能バンドルを使用して C# スクリプト関数アプリで使用できるようになります。 詳細については、「拡張機能バンドル」を参照してください。

何らかの理由でプロジェクトの拡張機能バンドルを使用できない場合は、Azure Functions Core Tools を使用して、アプリの function.json ファイルで定義されているバインドに基づいて拡張機能をインストールすることもできます。 コアツールを使用して拡張機能を登録する場合は、必ず [--csx] オプションを使用してください。 詳細については、「func extensions install」を参照してください。

既定では、Core Tools は function.json ファイルを読み取り、関数アプリのファイル システム (wwwroot) のルートにある extensions.csproj C# クラス ライブラリ プロジェクト ファイルに必要なパッケージを追加します。 Core Tools は dotnet.exe を使用するため、これを使用して、この拡張ファイルに任意の NuGet パッケージ参照を追加できます。 インストール時に、Core Tools は extensions.csproj をビルドして、必要なライブラリをインストールします。 Microsoft.ProjectOxford.Face バージョン 1.1.0 への参照を追加する extensions.csproj ファイルの例を次に示します。

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.ProjectOxford.Face" Version="1.1.0" />
    </ItemGroup>
</Project>

Note

C# スクリプト (.csx) の場合は、TargetFrameworknetstandard2.0 の値に設定する必要があります。 net6.0 などの他のターゲット フレームワークはサポートされていません。

カスタム NuGet フィードを使用するには、関数アプリのルート フォルダー内の Nuget.Config ファイルでフィードを指定します。 詳しくは、「NuGet の動作の構成」をご覧ください。

ポータルでのみプロジェクトで作業している場合は、サイト内で直接、extensions.csproj ファイルまたは Nuget.Config ファイルを手動で作成する必要があります。 詳細については、「拡張機能を手動でインストールする」を参照してください。

環境変数

環境変数またはアプリ設定値を取得するには、次のコード例のように、 System.Environment.GetEnvironmentVariableを使用します。

public static void Run(TimerInfo myTimer, ILogger log)
{
    log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
    log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage"));
    log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
}

public static string GetEnvironmentVariable(string name)
{
    return name + ": " +
        System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
}

再試行ポリシー

Functions では、2 つの組み込みの再試行ポリシーがサポートされています。 詳細については、「Retry policies (再試行ポリシー)」をご覧ください。

function.json ファイルの再試行ポリシーを次に示します。

{
    "disabled": false,
    "bindings": [
        {
            ....
        }
    ],
    "retry": {
        "strategy": "fixedDelay",
        "maxRetryCount": 4,
        "delayInterval": "00:00:10"
    }
}
function.json のプロパティ 説明
strategy fixedDelay を使用してください。
maxRetryCount 必須。 関数の実行ごとに許可される再試行の最大回数。 -1 は、無制限に再試行することを意味します。
delayInterval 再試行と再試行の間に使用される遅延。 HH:mm:ss という形式の文字列として指定します。

実行時のバインド

C# および他の .NET 言語では、function.json宣言型のバインドではなく命令型のバインド パターンを使用できます。 命令型のバインドは、設計時ではなくランタイム時にバインド パラメーターを計算する必要がある場合に便利です。 このパターンを使用すると、サポートされている入力バインドと出力バインドに関数コード内でバインドできます。

次のように命令型のバインドを定義します。

  • 必要な命令型のバインドの function.json にエントリを含めないでください。
  • 入力パラメーター Binder binder または IBinder binder を渡します。
  • 次の C# パターンを使用してデータ バインドを実行します。
using (var output = await binder.BindAsync<T>(new BindingTypeAttribute(...)))
{
    ...
}

BindingTypeAttribute はバインドを定義する .NET 属性、T はそのバインドの種類でサポートされている入力または出力の型です。 Tout パラメーター型 (out JObject など) にすることはできません。 たとえば、Mobile Apps テーブルの出力バインドは 6 種類の出力をサポートしますが、T に使用できるのは ICollector<T> または IAsyncCollector<T> のみです。

単一属性の例

次のコード例は、実行時に BLOB パスが定義された Storage Blob の出力バインドを作成し、この BLOB に文字列を書き込みます。

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host.Bindings.Runtime;

public static async Task Run(string input, Binder binder)
{
    using (var writer = await binder.BindAsync<TextWriter>(new BlobAttribute("samples-output/path")))
    {
        writer.Write("Hello World!!");
    }
}

BlobAttributeStorage Blob の入力バインドまたは出力バインドを定義します。TextWriter はサポートされている出力バインドの種類です。

複数属性の例

前の例では、関数アプリのメイン ストレージ アカウント接続文字列 (AzureWebJobsStorage) のアプリ設定を取得します。 ストレージ アカウントに使用するカスタム アプリ設定を指定するには、StorageAccountAttribute を追加し、属性の配列を BindAsync<T>() に渡します。 IBinderではなく、Binder パラメーターを使用します。 次に例を示します。

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host.Bindings.Runtime;

public static async Task Run(string input, Binder binder)
{
    var attributes = new Attribute[]
    {
        new BlobAttribute("samples-output/path"),
        new StorageAccountAttribute("MyStorageAccount")
    };

    using (var writer = await binder.BindAsync<TextWriter>(attributes))
    {
        writer.Write("Hello World!");
    }
}

次の表に、各バインドの種類の .NET 属性と、それらが定義されているパッケージを示します。

バインド 属性 参照の追加
Azure Cosmos DB Microsoft.Azure.WebJobs.DocumentDBAttribute #r "Microsoft.Azure.WebJobs.Extensions.CosmosDB"
Event Hubs Microsoft.Azure.WebJobs.ServiceBus.EventHubAttributeMicrosoft.Azure.WebJobs.ServiceBusAccountAttribute #r "Microsoft.Azure.Jobs.ServiceBus"
Mobile Apps Microsoft.Azure.WebJobs.MobileTableAttribute #r "Microsoft.Azure.WebJobs.Extensions.MobileApps"
Notification Hubs Microsoft.Azure.WebJobs.NotificationHubAttribute #r "Microsoft.Azure.WebJobs.Extensions.NotificationHubs"
Service Bus Microsoft.Azure.WebJobs.ServiceBusAttributeMicrosoft.Azure.WebJobs.ServiceBusAccountAttribute #r "Microsoft.Azure.WebJobs.ServiceBus"
ストレージ キュー Microsoft.Azure.WebJobs.QueueAttributeMicrosoft.Azure.WebJobs.StorageAccountAttribute
Storage Blob Microsoft.Azure.WebJobs.BlobAttributeMicrosoft.Azure.WebJobs.StorageAccountAttribute
ストレージ テーブル Microsoft.Azure.WebJobs.TableAttributeMicrosoft.Azure.WebJobs.StorageAccountAttribute
Twilio Microsoft.Azure.WebJobs.TwilioSmsAttribute #r "Microsoft.Azure.WebJobs.Extensions.Twilio"

C# スクリプト アプリを C# プロジェクトに変換する

C# スクリプト関数アプリをコンパイルされた C# クラス ライブラリ プロジェクトに変換する最も簡単な方法は、新しいプロジェクトを開始することです。 その後、各関数について、関数フォルダー内の各 run.csx ファイルと function.json ファイルから、1 つの新しい .cs クラス ライブラリ コード ファイルにコードと構成を移行できます。 たとえば、HelloWorld という名前の C# スクリプト関数がある場合は、HelloWorld/run.csxHelloWorld/function.json の 2 つのファイルがあります。 この関数では、新しいクラス ライブラリ プロジェクトで HelloWorld.cs という名前のコード ファイルを作成します。

ポータルの編集に C# スクリプトを使用している場合は、アプリのコンテンツをローカル コンピューターにダウンロードできます。 [コンテンツと Visual Studio プロジェクト] の代わりに [サイト コンテンツ] オプションを選択します。 プロジェクトを生成する必要はなく、ダウンロードにアプリケーション設定を含める必要もありません。 新しい開発環境を定義しています。この環境には、ホストされているアプリ環境と同じアクセス許可を付与しないでください。

これらの手順では、C# スクリプト関数 (Functions ホストを使用してインプロセスで実行) を、分離ワーカー プロセスで実行される C# クラス ライブラリ関数に変換する方法について説明します。

  1. お好みのクイックスタートで、「関数アプリ プロジェクトの作成」セクションを完了します。


  1. 元の C# スクリプト コードに extensions.csproj ファイルまたは function.proj ファイルが含まれている場合は、これらのファイルからパッケージ参照をコピーし、関数コア依存関係と同じ ItemGroup にある新しいプロジェクトの .csproj ファイルに追加します。

    ヒント

    変換は、依存関係を最新バージョンに更新する良い機会です。 これを行うには、後の手順で追加のコード変更が必要になる場合があります。

  2. extensionBundles セクションを除き、元の host.json ファイルの内容を新しいプロジェクトの host.json ファイルにコピーします (コンパイルされた C# プロジェクトでは拡張バンドルは使用されず、関数で使用されるすべての拡張機能への参照を明示的に追加する必要があります)。 host.json ファイルをマージする場合は、host.json スキーマがバージョン 2.0 を使用するほとんどのアプリでバージョン管理されていることに注意してください。 extensions セクションの内容は、関数で使用されるバインディング拡張機能の特定のバージョンによって異なる場合があります。 特定のバージョンの host.json を正しく構成する方法については、個別の拡張機能のリファレンス記事を参照してください。

  3. #load ディレクティブによって参照されるすべての共有ファイルについて、これらの共有リファレンスごとに新しい .cs ファイルを作成します。 共有クラス定義ごとに新しい .cs ファイルを作成するのが最も簡単です。 クラスのない静的メソッドがある場合は、これらのメソッドの新しいクラスを定義する必要があります。

  4. 元のプロジェクトの <FUNCTION_NAME> フォルダーごとに次のタスクを実行します。

    1. <FUNCTION_NAME>.cs という名前の新しいファイルを作成し、<FUNCTION_NAME> を C# スクリプト関数を定義したフォルダーの名前に置き換えます。 次の方法により、トリガー固有のいずれかのテンプレートから、新しい関数コード ファイルを作成できます。

      func new --name <FUNCTION_NAME> コマンドを使用し、プロンプトで正しいトリガー テンプレートを選択します。

    2. run.csx ファイルから using ステートメントをコピーし、新しいファイルに追加します。 #r ディレクティブは必要ありません。

    3. run.csx ファイル内の任意の #load ステートメントに対して、共有コードに使用した名前空間の新しい using ステートメントを追加します。

    4. 新しいファイルで、プロジェクトに使用している名前空間の下に関数のクラスを定義します。

    5. RunHandler またはそれに類似した名前の新しいメソッドを作成します。 この新しいメソッドは、関数の新しいエントリ ポイントとして機能します。

    6. run.csx から、関数を表す静的メソッドを、それが呼び出す関数とともに、 2 つ目のメソッドとして新しいクラスにコピーします。 前の手順で作成した新しいメソッドから、この静的メソッドを呼び出します。 この間接的な手順は、アップグレードを続行する際に相違点を見つけるのに役立ちます。 元のメソッドをまったく同じにして、新しいコンテキストからの入力を単純に制御できます。 新しいメソッドでパラメーターを作成し、静的メソッド呼び出しに渡す必要がある場合があります。 移行が意図したとおりに機能したことを確認したら、この余分な間接的な手順は削除できます。

    7. function.json ファイル内のバインドごとに、新しいメソッドに対応する属性を追加します。 バインドの例をすばやく見つけるには、「例に基づいてバインドを手動で追加する」を参照してください。

    8. まだ行っていない場合は、バインドに必要な拡張機能パッケージをプロジェクトに追加してください。

  5. アプリで必要なすべてのアプリケーション設定を local.settings.json ファイルValues コレクションに再作成します。

  6. プロジェクトがローカルで実行されていることを確認します。

    func start を使用して、コマンド ラインからアプリを実行します。 詳細については、「関数のローカル実行」を参照してください。

  7. Azure の以下の新しい関数アプリにプロジェクトを発行します。

    func azure functionapp publish <APP_NAME> コマンドを使用して、Azure リソースを作成し、コード プロジェクトを Azure にデプロイします。 詳細については、「プロジェクト ファイルのデプロイ」を参照してください。

関数変換の例

このセクションでは、1 つの関数の移行の例を示します。

C# スクリプトの元の関数には、次の 2 つのファイルがあります。

  • HelloWorld/function.json
  • HelloWorld/run.csx

HelloWorld/function.json の内容は次のとおりです。

{
  "bindings": [
    {
      "authLevel": "FUNCTION",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    }
  ]
}

HelloWorld/run.csx の内容は次のとおりです。

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string name = req.Query["name"];

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;

    string responseMessage = string.IsNullOrEmpty(name)
        ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
                : $"Hello, {name}. This HTTP triggered function executed successfully.";

            return new OkObjectResult(responseMessage);
}

ASP.NET Core 統合を使用して分離ワーカー モデルに移行すると、これらは 1 つの HelloWorld.cs に置き換えられます。

using System.Net;
using Microsoft.Azure.Functions.Worker;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

namespace MyFunctionApp
{
    public class HelloWorld
    {
        private readonly ILogger _logger;

        public HelloWorld(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger<HelloWorld>();
        }

        [Function("HelloWorld")]
        public async Task<IActionResult> RunHandler([HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequest req)
        {
            return await Run(req, _logger);
        }

        // From run.csx
        public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            string responseMessage = string.IsNullOrEmpty(name)
                ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
                        : $"Hello, {name}. This HTTP triggered function executed successfully.";

            return new OkObjectResult(responseMessage);
        }
    }
}

バインド構成と例

このセクションには、C# スクリプトでトリガーとバインドを定義するためのリファレンスと例が含まれています。

BLOB トリガー

次の表は、function.json ファイルで設定した、 C# スクリプトに対するバインド構成のプロパティを説明しています。

function.json のプロパティ 説明
type blobTrigger に設定する必要があります。 このプロパティは、Azure Portal でトリガーを作成するときに自動で設定されます。
direction in に設定する必要があります。 このプロパティは、Azure Portal でトリガーを作成するときに自動で設定されます。
name 関数コード内の BLOB を表す変数の名前。
path 監視するコンテナーBLOB 名パターンの場合があります。
connection Azure Blob への接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。

次の例は、function.json ファイルの BLOB トリガー定義と、バインドを使用するコードを示しています。 関数は、samples-workitems コンテナーで BLOB が追加または更新されたときにログを書き込みます。

function.json ファイルのバインディング データを次に示します。

{
    "disabled": false,
    "bindings": [
        {
            "name": "myBlob",
            "type": "blobTrigger",
            "direction": "in",
            "path": "samples-workitems/{name}",
            "connection":"MyStorageAccountAppSetting"
        }
    ]
}

BLOB トリガー パス samples-workitems/{name} の文字列 {name} は、トリガーする BLOB のファイル名にアクセスするために関数コードで使用できる、{name}を作成します。 詳細については、「BLOB 名のパターン」を参照してください。

Stream にバインドする C# スクリプト コードを次に示します。

public static void Run(Stream myBlob, string name, ILogger log)
{
   log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
}

CloudBlockBlob にバインドする C# スクリプト コードを次に示します。

#r "Microsoft.WindowsAzure.Storage"

using Microsoft.WindowsAzure.Storage.Blob;

public static void Run(CloudBlockBlob myBlob, string name, ILogger log)
{
    log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name}\nURI:{myBlob.StorageUri}");
}

BLOB 入力

次の表は、function.json ファイルで設定した、 C# スクリプトに対するバインド構成のプロパティを説明しています。

function.json のプロパティ 説明
type blob に設定する必要があります。
direction in に設定する必要があります。
name 関数コード内の BLOB を表す変数の名前。
path BLOB へのパス。
connection Azure Blob への接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。

次の例は、function.json ファイルの BLOB 入出力バインドと、バインドを使用する C# スクリプト コードを示しています。 関数は、テキスト BLOB のコピーを作成します。 関数は、コピーする BLOB の名前を含むキュー メッセージによってトリガーされます。 新しい BLOB の名前は {originalblobname}-Copy です。

function.json ファイルでは、queueTrigger メタデータ プロパティは path プロパティ内の BLOB 名の指定に使用されます。

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "myInputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    },
    {
      "name": "myOutputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}-Copy",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    }
  ],
  "disabled": false
}

C# スクリプト コードを次に示します。

public static void Run(string myQueueItem, string myInputBlob, out string myOutputBlob, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    myOutputBlob = myInputBlob;
}

BLOB 出力

次の表は、function.json ファイルで設定した、 C# スクリプトに対するバインド構成のプロパティを説明しています。

function.json のプロパティ 説明
type blob に設定する必要があります。
direction out に設定する必要があります。
name 関数コード内の BLOB を表す変数の名前。
path BLOB へのパス。
connection Azure Blob への接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。

次の例は、function.json ファイルの BLOB 入出力バインドと、バインドを使用する C# スクリプト コードを示しています。 関数は、テキスト BLOB のコピーを作成します。 関数は、コピーする BLOB の名前を含むキュー メッセージによってトリガーされます。 新しい BLOB の名前は {originalblobname}-Copy です。

function.json ファイルでは、queueTrigger メタデータ プロパティは path プロパティ内の BLOB 名の指定に使用されます。

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "myInputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    },
    {
      "name": "myOutputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}-Copy",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    }
  ],
  "disabled": false
}

C# スクリプト コードを次に示します。

public static void Run(string myQueueItem, string myInputBlob, out string myOutputBlob, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    myOutputBlob = myInputBlob;
}

RabbitMQ トリガー

次の例は、function.json ファイルの RabbitMQ トリガー バインドと、そのバインドが使用される C# スクリプト関数を示しています。 この関数は、RabbitMQ メッセージを読み取り、ログに記録します。

function.json ファイルのバインディング データを次に示します。

{​​
    "bindings": [
        {​​
            "name": "myQueueItem",
            "type": "rabbitMQTrigger",
            "direction": "in",
            "queueName": "queue",
            "connectionStringSetting": "rabbitMQConnectionAppSetting"
        }​​
    ]
}​​

C# スクリプト コードを次に示します。

using System;

public static void Run(string myQueueItem, ILogger log)
{​​
    log.LogInformation($"C# Script RabbitMQ trigger function processed: {​​myQueueItem}​​");
}​​

キュー トリガー

次の表は、function.json ファイルで設定した、 C# スクリプトに対するバインド構成のプロパティを説明しています。

function.json のプロパティ 説明
type queueTrigger に設定する必要があります。 このプロパティは、Azure Portal でトリガーを作成するときに自動で設定されます。
direction function.json ファイルの場合のみ。 in に設定する必要があります。 このプロパティは、Azure Portal でトリガーを作成するときに自動で設定されます。
name 関数コードでキュー項目ペイロードを含む変数の名前。
queueName ポーリングするキューの名前。
connection Azure キューへの接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。

次の例は、function.json ファイルのキュー トリガー バインディングと、バインディングを使用する C# スクリプト コードを示しています。 この関数は、キュー項目が処理されるたびに myqueue-items キューをポーリングし、ログを書き込みます。

function.json ファイルを次に示します。

{
    "disabled": false,
    "bindings": [
        {
            "type": "queueTrigger",
            "direction": "in",
            "name": "myQueueItem",
            "queueName": "myqueue-items",
            "connection":"MyStorageConnectionAppSetting"
        }
    ]
}

C# スクリプト コードを次に示します。

#r "Microsoft.WindowsAzure.Storage"

using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Queue;
using System;

public static void Run(CloudQueueMessage myQueueItem, 
    DateTimeOffset expirationTime, 
    DateTimeOffset insertionTime, 
    DateTimeOffset nextVisibleTime,
    string queueTrigger,
    string id,
    string popReceipt,
    int dequeueCount,
    ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem.AsString}\n" +
        $"queueTrigger={queueTrigger}\n" +
        $"expirationTime={expirationTime}\n" +
        $"insertionTime={insertionTime}\n" +
        $"nextVisibleTime={nextVisibleTime}\n" +
        $"id={id}\n" +
        $"popReceipt={popReceipt}\n" + 
        $"dequeueCount={dequeueCount}");
}

キューの出力

次の表は、function.json ファイルで設定した、 C# スクリプトに対するバインド構成のプロパティを説明しています。

function.json のプロパティ 説明
type queue に設定する必要があります。 このプロパティは、Azure Portal でトリガーを作成するときに自動で設定されます。
direction out に設定する必要があります。 このプロパティは、Azure Portal でトリガーを作成するときに自動で設定されます。
name 関数コード内のキューを表す変数の名前。 $return に設定して、関数の戻り値を参照します。
queueName キューの名前。
connection Azure キューへの接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。

次の例は、function.json ファイルの HTTP トリガー バインディングと、バインディングを使用する C# スクリプト コードを示しています。 この関数では、受け取った HTTP 要求ごとに CustomQueueMessage ペイロードを使用してキュー項目を作成します。

function.json ファイルを次に示します。

{
  "bindings": [
    {
      "type": "httpTrigger",
      "direction": "in",
      "authLevel": "function",
      "name": "input"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "type": "queue",
      "direction": "out",
      "name": "$return",
      "queueName": "outqueue",
      "connection": "MyStorageConnectionAppSetting"
    }
  ]
}

単一のキュー メッセージを作成する C# スクリプト コードを次に示します。

public class CustomQueueMessage
{
    public string PersonName { get; set; }
    public string Title { get; set; }
}

public static CustomQueueMessage Run(CustomQueueMessage input, ILogger log)
{
    return input;
}

一度で複数のメッセージを送信するには、ICollector または IAsyncCollector パラメーターを使用します。 HTTP 要求データを含む 1 つのメッセージと、ハードコーディングされた値を含む 1 つのメッセージという、複数のメッセージを送信する C# スクリプト コードを次に示します。

public static void Run(
    CustomQueueMessage input, 
    ICollector<CustomQueueMessage> myQueueItems, 
    ILogger log)
{
    myQueueItems.Add(input);
    myQueueItems.Add(new CustomQueueMessage { PersonName = "You", Title = "None" });
}

テーブル入力

このセクションでは、拡張機能の Tables API バージョンのサポートのみについて説明します。

次の表は、function.json ファイルで設定した、 C# スクリプトに対するバインド構成のプロパティを説明しています。

function.json のプロパティ 説明
type table に設定する必要があります。 このプロパティは、Azure Portal でバインドを作成するときに自動で設定されます。
direction in に設定する必要があります。 このプロパティは、Azure Portal でバインドを作成するときに自動で設定されます。
name 関数コード内のテーブルまたはエンティティを表す変数の名前。
tableName テーブルの名前。
partitionKey 省略可能。 読み取るテーブル エンティティのパーティション キー。
rowKey 省略可能。 読み取るテーブル エンティティの行キー。 take または filter と同時に使用できません。
take 任意。 返すエンティティの最大数。 rowKey とは使用できません。
filter 任意。 テーブルから返されるエンティティの OData フィルター式。 rowKey とは使用できません。
connection テーブル サービスへの接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。

次の例は、function.json ファイルのテーブル入力バインドと、そのバインドを使用する C# スクリプト コードを示しています。 この関数は、キュー トリガーを使用して単一のテーブル行を読み取ります。

function.json ファイルには partitionKeyrowKey が指定されています。 rowKey{queueTrigger}は、行キーがキュー メッセージ文字列から取得されることを示します。

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

C# スクリプト コードを次に示します。

#r "Azure.Data.Tables"
using Microsoft.Extensions.Logging;
using Azure.Data.Tables;

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

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

    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public DateTimeOffset? Timestamp { get; set; }
    public ETag ETag { get; set; }
}

テーブル出力

このセクションでは、拡張機能の Tables API バージョンのサポートのみについて説明します。

次の表は、function.json ファイルで設定した、 C# スクリプトに対するバインド構成のプロパティを説明しています。

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

次の例は、function.json ファイルのテーブル出力バインドと、バインドを使用する C# スクリプト コードを示しています。 この関数は複数のテーブル エンティティを書き込みます。

function.json ファイルを次に示します。

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

C# スクリプト コードを次に示します。

public static void Run(string input, ICollector<Person> tableBinding, ILogger log)
{
    for (int i = 1; i < 10; i++)
        {
            log.LogInformation($"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; }
}

タイマー トリガー

次の表は、function.json ファイルで設定した、 C# スクリプトに対するバインド構成のプロパティを説明しています。

function.json のプロパティ 説明
type timerTrigger に設定する必要があります。 このプロパティは、Azure Portal でトリガーを作成するときに自動で設定されます。
direction in に設定する必要があります。 このプロパティは、Azure Portal でトリガーを作成するときに自動で設定されます。
name 関数コード内のタイマー オブジェクトを表す変数の名前。
schedule CRON 式または TimeSpan 値。 TimeSpan は、App Service プランで実行している関数アプリに対してのみ使うことができます。 スケジュール式をアプリ設定に含めて、たとえば "%ScheduleAppSetting%" のように、 % 記号で囲まれたアプリ設定名にこのプロパティを設定できます。
runOnStartup true の場合、関数はランタイムの開始時に呼び出されます。 たとえば、ランタイムが開始するのは、関数アプリが非アクティブになってアイドル状態に移行した後で起動したとき、 関数が変化したために関数アプリが再起動するとき、関数アプリがスケールアウトするときなどです。"慎重に使用してください"。runOnStartuptrue に設定するべきケースはあるとしてもまれです (特に運用環境では)。
useMonitor true または false に設定し、スケジュールを監視する必要があるかどうかを示します。 スケジュールの監視はスケジュールの発生を維持し、関数アプリのインスタンスが再起動するときでもスケジュールが正しく維持されることを保証するのに役立ちます。 このプロパティを明示的に設定しない場合、繰り返し間隔が 1 分以上のスケジュールの既定値は true です。 1 分間に 2 回以上トリガーするスケジュールの既定値は false です。

次の例は、function.json ファイルのタイマー トリガー バインドと、そのバインドが使用される C# スクリプト関数を示しています。 この関数では、この関数呼び出しがスケジュールのミスの発生によるものかどうかを示すログが書き込まれます。 TimerInfo オブジェクトが関数に渡されます。

function.json ファイルのバインディング データを次に示します。

{
    "schedule": "0 */5 * * * *",
    "name": "myTimer",
    "type": "timerTrigger",
    "direction": "in"
}

C# スクリプト コードを次に示します。

public static void Run(TimerInfo myTimer, ILogger log)
{
    if (myTimer.IsPastDue)
    {
        log.LogInformation("Timer is running late!");
    }
    log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}" );  
}

HTTP トリガー

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

function.json のプロパティ 説明
type 必須 - httpTrigger に設定する必要があります。
direction 必須 - in に設定する必要があります。
name 必須 - 要求または要求本文の関数コードで使用される変数名。
authLevel 関数を呼び出すために、要求にどのキーが存在する必要があるかを決定します。 サポートされる値については、「認可レベル」を参照してください。
methods 関数が応答する HTTP メソッドの配列。 指定しない場合、関数はすべての HTTP メソッドに応答します。 「HTTP エンドポイントのカスタマイズ」をご覧ください。
route 関数がどの要求 URL に応答するかを制御するルート テンプレートを定義します。 何も指定しなかった場合の既定値は <functionname> です。 詳しくは、「HTTP エンドポイントのカスタマイズ」をご覧ください。
webHookType バージョン 1.x ランタイムでのみサポートされます。

指定したプロバイダーの Webhook レシーバーとして機能する HTTP トリガーを構成します。 サポートされている値については、 WebHook の種類に関するページを参照してください。

次の例は、function.json ファイルのトリガー バインドと、そのバインドが使用される C# スクリプト関数を示しています。 この関数は、クエリ文字列または HTTP 要求の本文で name パラメーターを探します。

function.json ファイルを次に示します。

{
    "disabled": false,
    "bindings": [
        {
            "authLevel": "function",
            "name": "req",
            "type": "httpTrigger",
            "direction": "in",
            "methods": [
                "get",
                "post"
            ]
        },
        {
            "name": "$return",
            "type": "http",
            "direction": "out"
        }
    ]
}

HttpRequest にバインドする C# スクリプト コードを次に示します。

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string name = req.Query["name"];
    
    string requestBody = String.Empty;
    using (StreamReader streamReader =  new  StreamReader(req.Body))
    {
        requestBody = await streamReader.ReadToEndAsync();
    }
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;
    
    return name != null
        ? (ActionResult)new OkObjectResult($"Hello, {name}")
        : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}

HttpRequest の代わりにカスタム オブジェクトにバインドできます。 このオブジェクトは要求の本文から作成され、JSON として解析されます。 同様に、型は HTTP 応答出力バインドに渡すことができ、200 のステータス コードと共に、応答本文として返されます。

using System.Net;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

public static string Run(Person person, ILogger log)
{   
    return person.Name != null
        ? (ActionResult)new OkObjectResult($"Hello, {person.Name}")
        : new BadRequestObjectResult("Please pass an instance of Person.");
}

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

HTTP 出力

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

プロパティ 説明
type http に設定する必要があります。
direction out に設定する必要があります。
name 応答の関数コードで使用される変数名、または戻り値を使うことを示す $return

Event Hubs トリガー

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

function.json のプロパティ 説明
type eventHubTrigger に設定する必要があります。 このプロパティは、Azure Portal でトリガーを作成するときに自動で設定されます。
direction in に設定する必要があります。 このプロパティは、Azure Portal でトリガーを作成するときに自動で設定されます。
name 関数コード内のイベント項目を表す変数の名前。
eventHubName Functions 2.x 以降。 イベント ハブの名前。 イベント ハブの名前は接続文字列にも存在し、その値が実行時にこのプロパティをオーバーライドします。 アプリ設定 %eventHubName% を介して参照できます。 バージョン 1.x では、このプロパティの名前は path です。
consumerGroup ハブのイベントのサブスクライブに使用されるコンシューマー グループを設定する、省略可能なプロパティ。 省略した場合は、$Default コンシューマー グループが使用されます。
connection Event Hubs への接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。

次の例は、function.json ファイルの Event Hubs トリガー バインドと、そのバインドが使用される C# スクリプト関数を示しています。 この関数では、Event Hubs トリガーのメッセージ本文を記録します。

Functions ランタイム バージョン 2.x 以降のバージョンについて、function.json ファイルの Event Hubs バインディング データの例を次に示します。

{
  "type": "eventHubTrigger",
  "name": "myEventHubMessage",
  "direction": "in",
  "eventHubName": "MyEventHub",
  "connection": "myEventHubReadConnectionAppSetting"
}

C# スクリプト コードを次に示します。

using System;

public static void Run(string myEventHubMessage, TraceWriter log)
{
    log.Info($"C# function triggered to process a message: {myEventHubMessage}");
}

関数コードのイベント メタデータにアクセスするには、EventData オブジェクトにバインドします。 また、メソッド シグネチャ内のバインディング式を使用して、同じプロパティにアクセスすることもできます。 次の例は、同じデータを取得する 2 つの方法を示しています。

#r "Microsoft.Azure.EventHubs"

using System.Text;
using System;
using Microsoft.ServiceBus.Messaging;
using Microsoft.Azure.EventHubs;

public void Run(EventData myEventHubMessage,
    DateTime enqueuedTimeUtc,
    Int64 sequenceNumber,
    string offset,
    TraceWriter log)
{
    log.Info($"Event: {Encoding.UTF8.GetString(myEventHubMessage.Body)}");
    log.Info($"EnqueuedTimeUtc={myEventHubMessage.SystemProperties.EnqueuedTimeUtc}");
    log.Info($"SequenceNumber={myEventHubMessage.SystemProperties.SequenceNumber}");
    log.Info($"Offset={myEventHubMessage.SystemProperties.Offset}");

    // Metadata accessed by using binding expressions
    log.Info($"EnqueuedTimeUtc={enqueuedTimeUtc}");
    log.Info($"SequenceNumber={sequenceNumber}");
    log.Info($"Offset={offset}");
}

イベントを一括で受け取るには、string または EventData を配列にします。

public static void Run(string[] eventHubMessages, TraceWriter log)
{
    foreach (var message in eventHubMessages)
    {
        log.Info($"C# function triggered to process a message: {message}");
    }
}

Event Hubs の出力

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

function.json のプロパティ 説明
type eventHub に設定する必要があります。
direction out に設定する必要があります。 このパラメーターは、Azure Portal でバインドを作成するときに自動で設定されます。
name イベントを表す関数コードに使用される変数の名前。
eventHubName Functions 2.x 以降。 イベント ハブの名前。 イベント ハブの名前は接続文字列にも存在し、その値が実行時にこのプロパティをオーバーライドします。 Functions 1.x では、このプロパティの名前は path です。
connection Event Hubs への接続方法を指定するアプリ設定または設定コレクションの名前。 詳細については、「接続」を参照してください

次の例は、function.json ファイルのイベント ハブ トリガー バインドと、そのバインドが使用される C# スクリプト関数を示しています。 この関数では、メッセージをイベント ハブに書き込みます。

Functions ランタイム バージョン 2.x 以降のバージョンについて、function.json ファイルの Event Hubs バインディング データの例を次に示します。

{
    "type": "eventHub",
    "name": "outputEventHubMessage",
    "eventHubName": "myeventhub",
    "connection": "MyEventHubSendAppSetting",
    "direction": "out"
}

1 つのメッセージを作成する C# スクリプト コードを次に示します。

using System;
using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, out string outputEventHubMessage, ILogger log)
{
    String msg = $"TimerTriggerCSharp1 executed at: {DateTime.Now}";
    log.LogInformation(msg);   
    outputEventHubMessage = msg;
}

複数のメッセージを作成する C# スクリプト コードを次に示します。

public static void Run(TimerInfo myTimer, ICollector<string> outputEventHubMessage, ILogger log)
{
    string message = $"Message created at: {DateTime.Now}";
    log.LogInformation(message);
    outputEventHubMessage.Add("1 " + message);
    outputEventHubMessage.Add("2 " + message);
}

Event Grid トリガー

次の表は、function.json ファイルで設定した、 C# スクリプトに対するバインド構成のプロパティを説明しています。 EventGridTrigger 属性で設定するコンストラクター パラメーターまたはプロパティはありません。

function.json のプロパティ 説明
type 必須 - eventGridTrigger に設定する必要があります。
direction 必須 - in に設定する必要があります。
name 必須 - イベント データを受信するパラメーターの、関数コードで使われている変数名。

次の例は、function.json ファイルで定義された Event Grid トリガーを示しています。

function.json ファイルのバインディング データを次に示します。

{
  "bindings": [
    {
      "type": "eventGridTrigger",
      "name": "eventGridEvent",
      "direction": "in"
    }
  ],
  "disabled": false
}

EventGridEvent バインド パラメーターを使う C# スクリプト関数の例を次に示します。

#r "Azure.Messaging.EventGrid"
using Azure.Messaging.EventGrid;
using Microsoft.Extensions.Logging;

public static void Run(EventGridEvent eventGridEvent, ILogger log)
{
    log.LogInformation(eventGridEvent.Data.ToString());
}

JObject バインド パラメーターを使う C# スクリプト関数の例を次に示します。

#r "Newtonsoft.Json"

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public static void Run(JObject eventGridEvent, TraceWriter log)
{
    log.Info(eventGridEvent.ToString(Formatting.Indented));
}

Event Grid の出力

次の表は、function.json ファイルで設定した、 C# スクリプトに対するバインド構成のプロパティを説明しています。

function.json のプロパティ 説明
type eventGrid に設定する必要があります。
direction out に設定する必要があります。 このパラメーターは、Azure Portal でバインドを作成するときに自動で設定されます。
name イベントを表す関数コードに使用される変数の名前。
topicEndpointUri カスタム トピックの URI を含むアプリ設定の名前 (例: MyTopicEndpointUri)。
topicKeySetting カスタム トピックのアクセス キーを含むアプリ設定の名前。

次の例は、function.json ファイル内の Event Grid 出力バインディング データを示しています。

{
    "type": "eventGrid",
    "name": "outputEvent",
    "topicEndpointUri": "MyEventGridTopicUriSetting",
    "topicKeySetting": "MyEventGridTopicKeySetting",
    "direction": "out"
}

1 つのイベントを作成する C# スクリプト コードを次に示します。

#r "Microsoft.Azure.EventGrid"
using System;
using Microsoft.Azure.EventGrid.Models;
using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, out EventGridEvent outputEvent, ILogger log)
{
    outputEvent = new EventGridEvent("message-id", "subject-name", "event-data", "event-type", DateTime.UtcNow, "1.0");
}

複数のイベントを作成する C# スクリプト コードを次に示します。

#r "Microsoft.Azure.EventGrid"
using System;
using Microsoft.Azure.EventGrid.Models;
using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, ICollector<EventGridEvent> outputEvent, ILogger log)
{
    outputEvent.Add(new EventGridEvent("message-id-1", "subject-name", "event-data", "event-type", DateTime.UtcNow, "1.0"));
    outputEvent.Add(new EventGridEvent("message-id-2", "subject-name", "event-data", "event-type", DateTime.UtcNow, "1.0"));
}

Service Bus トリガー

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

function.json のプロパティ 説明
type serviceBusTrigger に設定する必要があります。 このプロパティは、Azure Portal でトリガーを作成するときに自動で設定されます。
direction in に設定する必要があります。 このプロパティは、Azure Portal でトリガーを作成するときに自動で設定されます。
name 関数コード内のキューまたはトピック メッセージを表す変数の名前。
queueName 監視するキューの名前。 トピックではなくキューを監視する場合にのみ設定します。
topicName 監視するトピックの名前。 キューではなくトピックを監視する場合にのみ設定します。
subscriptionName 監視するサブスクリプションの名前。 キューではなくトピックを監視する場合にのみ設定します。
connection Service Bus への接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。
accessRights 接続文字列のアクセス権。 使用できる値は managelisten です。 既定値は manage で、connectionmanageアクセス許可を持つことを示します。 管理アクセス許可を持たない接続文字列を使用する場合は、accessRights を "listen" に設定します。 設定しないと、Functions ランタイムが管理権限を必要とする操作の試行に失敗する可能性があります。 最新バージョンの Service Bus SDK が管理の操作をサポートしていないため、Azure Functions バージョン 2.x 以降ではこのプロパティを利用できません。
isSessionsEnabled trueキューまたはサブスクリプションに接続する場合は true。 それ以外の場合は false (既定値)。
autoComplete trueトリガーが処理後に自動的に complete を呼び出す必要があるか、または関数コードで complete を手動で呼び出すかどうか。

false に設定することは、C# でのみサポートされています。

true に設定した場合、関数の実行が正常に完了するとトリガーによって自動的にメッセージが完了され、それ以外の場合はメッセージが破棄されます。
<br/false に設定した場合、ServiceBusReceiver メソッドを呼び出して、メッセージ、セッション、またはバッチを完了、破棄、または配信不能にする必要があります。 例外がスローされた場合 (かつ ServiceBusReceiver メソッドが呼び出されなかった場合)、ロックは維持されます。 ロックが期限切れになると、メッセージはキューに再登録されて DeliveryCount はインクリメントされ、ロックは自動的に更新されます。

このプロパティは Azure Functions 2.x 以降でのみ利用できます。

次の例は、function.json ファイルの Service Bus トリガー バインドと、そのバインドが使用される C# スクリプト関数を示しています。 この機能はメッセージ メタデータを読み取り、Service Bus のキュー メッセージをログに記録します。

function.json ファイルのバインディング データを次に示します。

{
"bindings": [
    {
    "queueName": "testqueue",
    "connection": "MyServiceBusConnection",
    "name": "myQueueItem",
    "type": "serviceBusTrigger",
    "direction": "in"
    }
],
"disabled": false
}

C# スクリプト コードを次に示します。

using System;

public static void Run(string myQueueItem,
    Int32 deliveryCount,
    DateTime enqueuedTimeUtc,
    string messageId,
    TraceWriter log)
{
    log.Info($"C# ServiceBus queue trigger function processed message: {myQueueItem}");

    log.Info($"EnqueuedTimeUtc={enqueuedTimeUtc}");
    log.Info($"DeliveryCount={deliveryCount}");
    log.Info($"MessageId={messageId}");
}

Service Bus 出力

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

function.json のプロパティ 説明
type serviceBus に設定する必要があります。 このプロパティは、Azure Portal でトリガーを作成するときに自動で設定されます。
direction out に設定する必要があります。 このプロパティは、Azure Portal でトリガーを作成するときに自動で設定されます。
name 関数コード内のキューまたはトピック メッセージを表す変数の名前。 "$return" に設定して、関数の戻り値を参照します。
queueName キューの名前。 トピックではなくキューのメッセージを送信する場合にのみ設定します。
topicName トピックの名前。 キューではなくトピックのメッセージを送信する場合にのみ設定します。
connection Service Bus への接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。
accessRights (v1 のみ) 接続文字列のアクセス権。 使用できる値は managelisten です。 既定値は manage で、connectionmanageアクセス許可を持つことを示します。 管理アクセス許可を持たない接続文字列を使用する場合は、accessRights を "listen" に設定します。 設定しないと、Functions ランタイムが管理権限を必要とする操作の試行に失敗する可能性があります。 最新バージョンの Service Bus SDK が管理の操作をサポートしていないため、Azure Functions バージョン 2.x 以降ではこのプロパティを利用できません。

次の例は、function.json ファイルの Service Bus 出力バインドと、そのバインドを使用する C# スクリプト関数を示しています。 この関数は、タイマー トリガーを使用して、15 秒ごとにキュー メッセージを送信します。

function.json ファイルのバインディング データを次に示します。

{
    "bindings": [
        {
            "schedule": "0/15 * * * * *",
            "name": "myTimer",
            "runsOnStartup": true,
            "type": "timerTrigger",
            "direction": "in"
        },
        {
            "name": "outputSbQueue",
            "type": "serviceBus",
            "queueName": "testqueue",
            "connection": "MyServiceBusConnection",
            "direction": "out"
        }
    ],
    "disabled": false
}

単一のメッセージを作成する C# スクリプト コードを次に示します。

public static void Run(TimerInfo myTimer, ILogger log, out string outputSbQueue)
{
    string message = $"Service Bus queue message created at: {DateTime.Now}";
    log.LogInformation(message); 
    outputSbQueue = message;
}

複数のメッセージを作成する C# スクリプト コードを次に示します。

public static async Task Run(TimerInfo myTimer, ILogger log, IAsyncCollector<string> outputSbQueue)
{
    string message = $"Service Bus queue messages created at: {DateTime.Now}";
    log.LogInformation(message); 
    await outputSbQueue.AddAsync("1 " + message);
    await outputSbQueue.AddAsync("2 " + message);
}

Azure Cosmos DB v2 トリガー

このセクションでは、拡張機能のバージョン 4.x 以降のサポートのみについて説明します。

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

function.json のプロパティ 説明
type cosmosDBTrigger に設定する必要があります。
direction in に設定する必要があります。 このパラメーターは、Azure Portal でトリガーを作成するときに自動で設定されます。
name 変更されるドキュメントの一覧を表す、関数コードで使用する変数の名前。
connection 監視対象の Azure Cosmos DB アカウントへの接続方法を指定するアプリの設定または設定のコレクションの名前。 詳細については、「接続」を参照してください。
databaseName 監視対象のコンテナーを含む Azure Cosmos DB データベースの名前。
containerName 監視対象のコンテナーの名前。
leaseConnection (省略可能) リース コンテナーを保持する Azure Cosmos DB アカウントへの接続方法を指定するアプリの設定または設定コンテナーの名前。

この値を設定しない場合、connection という値が使用されます。 このパラメーターは、ポータルでバインドが作成されるときに自動で設定されます。 リース コンテナーの接続文字列には書き込みアクセス許可が必要です。
leaseDatabaseName (省略可能) リースの格納に使用するコンテナーを保持するデータベースの名前。 この値を設定しない場合、databaseName の設定の値が使用されます。
leaseContainerName (省略可能) リースの格納に使用するコンテナーの名前。 この値を設定しない場合、leases という値が使用されます。
createLeaseContainerIfNotExists (省略可能) true に設定すると、リース コンテナーが存在していない場合に自動的に作成します。 既定値は false です。 Microsoft Entra ID を使用する場合に値を true に設定すると、コンテナーの作成は許可されている操作ではなく、関数を起動できません。
leasesContainerThroughput (省略可能) リース コンテナーの作成時に割り当てる要求ユニットの数を定義します。 この設定は、createLeaseContainerIfNotExiststrue に設定されている場合のみ使用できます。 このパラメーターは、ポータルを使用してバインドを作成するときに自動的に設定されます。
leaseContainerPrefix (省略可能) 設定すると、この関数のリース コンテナーで作成されたリースへのプレフィックスとして値が追加されます。 プレフィックスを使用すると、異なるプレフィックスを使用して、2 つの別の Azure 関数が同じリース コンテナーを共有できるようになります。
feedPollDelay (省略可能) 現在のすべての変更がドレインされた後、フィードの新しい変更についてパーティションをポーリングする間の遅延時間 (ミリ秒)。 既定値は 5,000 ミリ秒 (5 秒) です。
leaseAcquireInterval (省略可能) 設定すると、パーティションが既知のホスト インスタンス間で均等に分散されているかどうかを計算するタスクを開始する間隔がミリ秒単位で定義されます。 既定値は 13,000 (13 秒) です。
leaseExpirationInterval (省略可能) 設定すると、パーティションを表すリースでリースを取得する間隔がミリ秒単位で定義されます。 この間隔内にリースが更新されない場合、リースは期限切れとなり、パーティションの所有権は別のインスタンスに移動します。 既定値は 60,000 (60 秒) です。
leaseRenewInterval (省略可能) 設定すると、インスタンスが現在保持しているパーティションのすべてのリースの更新間隔がミリ秒単位で定義されます。 既定値は 17,000 (17 秒) です。
maxItemsPerInvocation (省略可能) 設定すると、関数呼び出しごとに、受信するアイテムの最大数がこのプロパティによって設定されます。 ストアド プロシージャを使って監視対象コンテナーの操作を実行した場合、変更フィードから項目を読み取るときにトランザクション スコープは保持されます。 その結果、受信した項目数が指定した値よりも多くなり、同じトランザクションで変更された項目が 1 つのアトミック バッチの一部として返される可能性があります。
startFromBeginning (省略可能) このオプションを指定すると、現在の時刻から開始するのではなく、コンテナーの変更履歴の先頭から変更を読み取るようにトリガーに指示できます。 以降の実行ではチェックポイントが既に保存されているため、先頭からの読み取りが機能するのは、トリガーが初めて開始されたときのみです。 既にリースが作成されているときにこのオプションを true に設定しても効果はありません。
startFromTime (省略可能) 変更フィードの読み取り操作を初期化する日時を取得または設定します。 推奨される形式は、2021-02-16T14:19:29Z のように、UTC 指定子を使った ISO 8601 です。 これは、最初のトリガー状態を設定するためにのみ使われます。 トリガーがリース状態になった後にこの値を変更しても効果はありません。
preferredLocations (省略可能) Azure Cosmos DB サービスの geo レプリケートされたデータベース アカウントの優先される場所 (リージョン) を定義します。 複数の値はコンマで区切る必要があります。 たとえば、"East US,South Central US,North Europe" などです。

次の例は、function.json ファイルの Azure Cosmos DB トリガー バインドと、そのバインドが使用される C# スクリプト関数を示しています。 Azure Cosmos DB レコードが追加または変更されると、この関数によってログ メッセージが書き込まれます。

function.json ファイルのバインディング データを次に示します。

{
    "type": "cosmosDBTrigger",
    "name": "documents",
    "direction": "in",
    "leaseContainerName": "leases",
    "connection": "<connection-app-setting>",
    "databaseName": "Tasks",
    "containerName": "Items",
    "createLeaseContainerIfNotExists": true
}

C# スクリプト コードを次に示します。

    using System;
    using System.Collections.Generic;
    using Microsoft.Extensions.Logging;

    // Customize the model with your own desired properties
    public class ToDoItem
    {
        public string id { get; set; }
        public string Description { get; set; }
    }

    public static void Run(IReadOnlyList<ToDoItem> documents, ILogger log)
    {
      log.LogInformation("Documents modified " + documents.Count);
      log.LogInformation("First document Id " + documents[0].id);
    }

Azure Cosmos DB v2 入力

このセクションでは、拡張機能のバージョン 4.x 以降のサポートのみについて説明します。

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

function.json のプロパティ 説明
type cosmosDB に設定する必要があります。
direction in に設定する必要があります。
name 変更されるドキュメントの一覧を表す、関数コードで使用する変数の名前。
connection 監視対象の Azure Cosmos DB アカウントへの接続方法を指定するアプリの設定または設定コンテナーの名前。 詳細については、「接続」を参照してください。
databaseName 監視対象のコンテナーを含む Azure Cosmos DB データベースの名前。
containerName 監視対象のコンテナーの名前。
partitionKey 参照用のパーティション キー値を指定します。 バインディング パラメーターを含めることもできます。 パーティション分割されたコンテナーの検索に必要です。
id 取得するドキュメントの ID。 このプロパティは、バインド式をサポートしています。 idsqlQuery プロパティの両方は設定しないでください。 いずれも設定しなかった場合は、コンテナー全体が取得されます。
sqlQuery 複数のドキュメントを取得するときに使用する Azure Cosmos DB SQL クエリ。 このプロパティは、次の例のように実行時のバインドをサポートします。SELECT * FROM c where c.departmentId = {departmentId} idsqlQuery プロパティの両方は設定しないでください。 いずれも設定しなかった場合は、コンテナー全体が取得されます。
preferredLocations (省略可能) Azure Cosmos DB サービスの geo レプリケートされたデータベース アカウントの優先される場所 (リージョン) を定義します。 複数の値はコンマで区切る必要があります。 たとえば、East US,South Central US,North Europe のようにします。

このセクションには、次の例が含まれています。

HTTP トリガーの例では、次のようなシンプルな ToDoItem タイプを参照します。

namespace CosmosDBSamplesV2
{
    public class ToDoItem
    {
        public string Id { get; set; }
        public string Description { get; set; }
    }
}

キュー トリガー、文字列からの ID の検索

次の例は、function.json ファイルの Azure Cosmos DB 入力バインドと、そのバインドが使用される C# スクリプト関数を示しています。 この関数は、1 つのドキュメントを読み取って、そのドキュメントのテキスト値を更新します。

function.json ファイルのバインディング データを次に示します。

{
    "name": "inputDocument",
    "type": "cosmosDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "id" : "{queueTrigger}",
    "partitionKey": "{partition key value}",
    "connectionStringSetting": "MyAccount_COSMOSDB",
    "direction": "in"
}

C# スクリプト コードを次に示します。

    using System;

    // Change input document contents using Azure Cosmos DB input binding
    public static void Run(string myQueueItem, dynamic inputDocument)
    {
      inputDocument.text = "This has changed.";
    }

キュー トリガー、SqlQuery を使用した複数のドキュメントの取得

次の例は、function.json ファイルの Azure Cosmos DB 入力バインドと、そのバインドが使用される C# スクリプト関数を示しています。 この関数は、SQL クエリで指定されている複数のドキュメントを、キュー トリガーを使用してクエリ パラメーターをカスタマイズすることで取得します。

キュー トリガーがパラメーター departmentId を提供します。 { "departmentId" : "Finance" } のキュー メッセージは、金融部門のすべてのレコードを返します。

function.json ファイルのバインディング データを次に示します。

{
    "name": "documents",
    "type": "cosmosDB",
    "direction": "in",
    "databaseName": "MyDb",
    "collectionName": "MyCollection",
    "sqlQuery": "SELECT * from c where c.departmentId = {departmentId}",
    "connectionStringSetting": "CosmosDBConnection"
}

C# スクリプト コードを次に示します。

    public static void Run(QueuePayload myQueueItem, IEnumerable<dynamic> documents)
    {
        foreach (var doc in documents)
        {
            // operate on each document
        }
    }

    public class QueuePayload
    {
        public string departmentId { get; set; }
    }

HTTP トリガー、クエリ文字列からの ID の検索

次の例は、単一のドキュメントを取得する C# スクリプト関数を示しています。 関数は、クエリ文字列を使用して検索のための ID とパーティション キー値を指定する HTTP 要求によってトリガーされます。 その ID とパーティション キー値は、指定されたデータベースとコレクションから ToDoItem ドキュメントを取得するために使用されます。

function.json ファイルを次に示します。

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "cosmosDB",
      "name": "toDoItem",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "in",
      "Id": "{Query.id}",
      "PartitionKey" : "{Query.partitionKeyValue}"
    }
  ],
  "disabled": false
}

C# スクリプト コードを次に示します。

using System.Net;
using Microsoft.Extensions.Logging;

public static HttpResponseMessage Run(HttpRequestMessage req, ToDoItem toDoItem, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    if (toDoItem == null)
    {
         log.LogInformation($"ToDo item not found");
    }
    else
    {
        log.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

HTTP トリガー、ルート データからの ID の検索

次の例は、単一のドキュメントを取得する C# スクリプト関数を示しています。 関数は、ルート データを使用して検索のための ID とパーティション キー値を指定する HTTP 要求によってトリガーされます。 その ID とパーティション キー値は、指定されたデータベースとコレクションから ToDoItem ドキュメントを取得するために使用されます。

function.json ファイルを次に示します。

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ],
      "route":"todoitems/{partitionKeyValue}/{id}"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "cosmosDB",
      "name": "toDoItem",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "in",
      "id": "{id}",
      "partitionKey": "{partitionKeyValue}"
    }
  ],
  "disabled": false
}

C# スクリプト コードを次に示します。

using System.Net;
using Microsoft.Extensions.Logging;

public static HttpResponseMessage Run(HttpRequestMessage req, ToDoItem toDoItem, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    if (toDoItem == null)
    {
         log.LogInformation($"ToDo item not found");
    }
    else
    {
        log.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

HTTP トリガー、SqlQuery を使用した複数のドキュメントの取得

次の例は、ドキュメントの一覧を取得する C# スクリプト関数を示しています。 関数は、HTTP 要求によってトリガーされます。 クエリは、SqlQuery 属性プロパティで指定されます。

function.json ファイルを次に示します。

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "cosmosDB",
      "name": "toDoItems",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "in",
      "sqlQuery": "SELECT top 2 * FROM c order by c._ts desc"
    }
  ],
  "disabled": false
}

C# スクリプト コードを次に示します。

using System.Net;
using Microsoft.Extensions.Logging;

public static HttpResponseMessage Run(HttpRequestMessage req, IEnumerable<ToDoItem> toDoItems, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    foreach (ToDoItem toDoItem in toDoItems)
    {
        log.LogInformation(toDoItem.Description);
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

HTTP トリガー、DocumentClient を使用した複数のドキュメントの取得

次の例は、ドキュメントの一覧を取得する C# スクリプト関数を示しています。 関数は、HTTP 要求によってトリガーされます。 コードでは、Azure Cosmos DB バインドによって提供される DocumentClient インスタンスを使用して、ドキュメントの一覧を読み取ります。 また、DocumentClient インスタンスは、書き込み操作に使用できます。

function.json ファイルを次に示します。

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "cosmosDB",
      "name": "client",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "inout"
    }
  ],
  "disabled": false
}

C# スクリプト コードを次に示します。

#r "Microsoft.Azure.Documents.Client"

using System.Net;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using Microsoft.Extensions.Logging;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, DocumentClient client, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    Uri collectionUri = UriFactory.CreateDocumentCollectionUri("ToDoItems", "Items");
    string searchterm = req.GetQueryNameValuePairs()
        .FirstOrDefault(q => string.Compare(q.Key, "searchterm", true) == 0)
        .Value;

    if (searchterm == null)
    {
        return req.CreateResponse(HttpStatusCode.NotFound);
    }

    log.LogInformation($"Searching for word: {searchterm} using Uri: {collectionUri.ToString()}");
    IDocumentQuery<ToDoItem> query = client.CreateDocumentQuery<ToDoItem>(collectionUri)
        .Where(p => p.Description.Contains(searchterm))
        .AsDocumentQuery();

    while (query.HasMoreResults)
    {
        foreach (ToDoItem result in await query.ExecuteNextAsync())
        {
            log.LogInformation(result.Description);
        }
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

Azure Cosmos DB v2 出力

このセクションでは、拡張機能のバージョン 4.x 以降のサポートのみについて説明します。

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

function.json のプロパティ 説明
connection 監視対象の Azure Cosmos DB アカウントへの接続方法を指定するアプリの設定または設定のコレクションの名前。 詳細については、「接続」を参照してください。
databaseName 監視対象のコンテナーを含む Azure Cosmos DB データベースの名前。
containerName 監視対象のコンテナーの名前。
createIfNotExists コンテナーが存在しない場合に作成するかどうかを示すブール値。 新しいコンテナーは予約されたスループットで作成され、それがコストに影響を与えるため、既定値は false です。 詳細については、 価格に関するページを参照してください。
partitionKey createIfNotExists が true の場合は、作成されるコンテナーのパーティション キーのパスを定義します。 バインディング パラメーターを含めることもできます。
containerThroughput createIfNotExists が true の場合は、作成されるコンテナーのスループットを定義します。
preferredLocations (省略可能) Azure Cosmos DB サービスの geo レプリケートされたデータベース アカウントの優先される場所 (リージョン) を定義します。 複数の値はコンマで区切る必要があります。 たとえば、East US,South Central US,North Europe のようにします。

このセクションには、次の例が含まれています。

キュー トリガー、1 つのドキュメントの書き込み

次の例は、function.json ファイルの Azure Cosmos DB 出力バインドと、そのバインドが使用される C# スクリプト関数を示しています。 この関数は、次の形式で JSON を受信するキューのキュー入力バインドを使用します。

{
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

この関数は、各レコードに対して次の形式の Azure Cosmos DB ドキュメントを作成します。

{
    "id": "John Henry-123456",
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

function.json ファイルのバインディング データを次に示します。

{
    "name": "employeeDocument",
    "type": "cosmosDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "createIfNotExists": true,
    "connectionStringSetting": "MyAccount_COSMOSDB",
    "direction": "out"
}

C# スクリプト コードを次に示します。

    #r "Newtonsoft.Json"

    using Microsoft.Azure.WebJobs.Host;
    using Newtonsoft.Json.Linq;
    using Microsoft.Extensions.Logging;

    public static void Run(string myQueueItem, out object employeeDocument, ILogger log)
    {
      log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");

      dynamic employee = JObject.Parse(myQueueItem);

      employeeDocument = new {
        id = employee.name + "-" + employee.employeeId,
        name = employee.name,
        employeeId = employee.employeeId,
        address = employee.address
      };
    }

キュー トリガー、IAsyncCollector を使用したドキュメントの書き込み

複数のドキュメントを作成するために ICollector<T> または IAsyncCollector<T> にバインドできます。T は、サポートされている型のいずれかです。

この例では、次のようなシンプルな ToDoItem タイプを参照します。

namespace CosmosDBSamplesV2
{
    public class ToDoItem
    {
        public string id { get; set; }
        public string Description { get; set; }
    }
}

function.json ファイルを次に示します。

{
  "bindings": [
    {
      "name": "toDoItemsIn",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "todoqueueforwritemulti",
      "connectionStringSetting": "AzureWebJobsStorage"
    },
    {
      "type": "cosmosDB",
      "name": "toDoItemsOut",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "out"
    }
  ],
  "disabled": false
}

C# スクリプト コードを次に示します。

using System;
using Microsoft.Extensions.Logging;

public static async Task Run(ToDoItem[] toDoItemsIn, IAsyncCollector<ToDoItem> toDoItemsOut, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed {toDoItemsIn?.Length} items");

    foreach (ToDoItem toDoItem in toDoItemsIn)
    {
        log.LogInformation($"Description={toDoItem.Description}");
        await toDoItemsOut.AddAsync(toDoItem);
    }
}

Azure Cosmos DB v1 トリガー

次の例は、function.json ファイルの Azure Cosmos DB トリガー バインドと、そのバインドが使用される C# スクリプト関数を示しています。 Azure Cosmos DB レコードが変更されると、この関数によってログ メッセージが書き込まれます。

function.json ファイルのバインディング データを次に示します。

{
    "type": "cosmosDBTrigger",
    "name": "documents",
    "direction": "in",
    "leaseCollectionName": "leases",
    "connectionStringSetting": "<connection-app-setting>",
    "databaseName": "Tasks",
    "collectionName": "Items",
    "createLeaseCollectionIfNotExists": true
}

C# スクリプト コードを次に示します。

    #r "Microsoft.Azure.Documents.Client"
    
    using System;
    using Microsoft.Azure.Documents;
    using System.Collections.Generic;
    

    public static void Run(IReadOnlyList<Document> documents, TraceWriter log)
    {
        log.Info("Documents modified " + documents.Count);
        log.Info("First document Id " + documents[0].Id);
    }

Azure Cosmos DB v1 入力

このセクションには、次の例が含まれています。

HTTP トリガーの例では、次のようなシンプルな ToDoItem タイプを参照します。

namespace CosmosDBSamplesV1
{
    public class ToDoItem
    {
        public string Id { get; set; }
        public string Description { get; set; }
    }
}

キュー トリガー、文字列からの ID の検索

次の例は、function.json ファイルの Azure Cosmos DB 入力バインドと、そのバインドが使用される C# スクリプト関数を示しています。 この関数は、1 つのドキュメントを読み取って、そのドキュメントのテキスト値を更新します。

function.json ファイルのバインディング データを次に示します。

{
    "name": "inputDocument",
    "type": "documentDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "id" : "{queueTrigger}",
    "partitionKey": "{partition key value}",
    "connection": "MyAccount_COSMOSDB",
    "direction": "in"
}

C# スクリプト コードを次に示します。

    using System;

    // Change input document contents using Azure Cosmos DB input binding
    public static void Run(string myQueueItem, dynamic inputDocument)
    {
        inputDocument.text = "This has changed.";
    }

キュー トリガー、SqlQuery を使用した複数のドキュメントの取得

次の例は、function.json ファイルの Azure Cosmos DB 入力バインドと、そのバインドが使用される C# スクリプト関数を示しています。 この関数は、SQL クエリで指定されている複数のドキュメントを、キュー トリガーを使用してクエリ パラメーターをカスタマイズすることで取得します。

キュー トリガーがパラメーター departmentId を提供します。 { "departmentId" : "Finance" } のキュー メッセージは、金融部門のすべてのレコードを返します。

function.json ファイルのバインディング データを次に示します。

{
    "name": "documents",
    "type": "documentdb",
    "direction": "in",
    "databaseName": "MyDb",
    "collectionName": "MyCollection",
    "sqlQuery": "SELECT * from c where c.departmentId = {departmentId}",
    "connection": "CosmosDBConnection"
}

C# スクリプト コードを次に示します。

    public static void Run(QueuePayload myQueueItem, IEnumerable<dynamic> documents)
    {
        foreach (var doc in documents)
        {
            // operate on each document
        }
    }

    public class QueuePayload
    {
        public string departmentId { get; set; }
    }

HTTP トリガー、クエリ文字列からの ID の検索

次の例は、単一のドキュメントを取得する C# スクリプト関数を示しています。 関数は、クエリ文字列を使用して検索のための ID を指定する HTTP 要求によってトリガーされます。 該当の ID は、指定されたデータベースとコレクションからの ToDoItem ドキュメントの取得に使用されます。

function.json ファイルを次に示します。

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "toDoItem",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "in",
      "Id": "{Query.id}"
    }
  ],
  "disabled": true
}

C# スクリプト コードを次に示します。

using System.Net;

public static HttpResponseMessage Run(HttpRequestMessage req, ToDoItem toDoItem, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    if (toDoItem == null)
    {
        log.Info($"ToDo item not found");
    }
    else
    {
        log.Info($"Found ToDo item, Description={toDoItem.Description}");
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

HTTP トリガー、ルート データからの ID の検索

次の例は、単一のドキュメントを取得する C# スクリプト関数を示しています。 関数は、ルート データを使用して検索のための ID を指定する HTTP 要求によってトリガーされます。 該当の ID は、指定されたデータベースとコレクションからの ToDoItem ドキュメントの取得に使用されます。

function.json ファイルを次に示します。

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ],
      "route":"todoitems/{id}"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "toDoItem",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "in",
      "Id": "{id}"
    }
  ],
  "disabled": false
}

C# スクリプト コードを次に示します。

using System.Net;

public static HttpResponseMessage Run(HttpRequestMessage req, ToDoItem toDoItem, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    if (toDoItem == null)
    {
        log.Info($"ToDo item not found");
    }
    else
    {
        log.Info($"Found ToDo item, Description={toDoItem.Description}");
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

HTTP トリガー、SqlQuery を使用した複数のドキュメントの取得

次の例は、ドキュメントの一覧を取得する C# スクリプト関数を示しています。 関数は、HTTP 要求によってトリガーされます。 クエリは、SqlQuery 属性プロパティで指定されます。

function.json ファイルを次に示します。

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "toDoItems",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "in",
      "sqlQuery": "SELECT top 2 * FROM c order by c._ts desc"
    }
  ],
  "disabled": false
}

C# スクリプト コードを次に示します。

using System.Net;

public static HttpResponseMessage Run(HttpRequestMessage req, IEnumerable<ToDoItem> toDoItems, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    foreach (ToDoItem toDoItem in toDoItems)
    {
        log.Info(toDoItem.Description);
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

HTTP トリガー、DocumentClient を使用した複数のドキュメントの取得

次の例は、ドキュメントの一覧を取得する C# スクリプト関数を示しています。 関数は、HTTP 要求によってトリガーされます。 コードでは、Azure Cosmos DB バインドによって提供される DocumentClient インスタンスを使用して、ドキュメントの一覧を読み取ります。 また、DocumentClient インスタンスは、書き込み操作に使用できます。

function.json ファイルを次に示します。

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "client",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "inout"
    }
  ],
  "disabled": false
}

C# スクリプト コードを次に示します。

#r "Microsoft.Azure.Documents.Client"

using System.Net;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, DocumentClient client, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    Uri collectionUri = UriFactory.CreateDocumentCollectionUri("ToDoItems", "Items");
    string searchterm = req.GetQueryNameValuePairs()
        .FirstOrDefault(q => string.Compare(q.Key, "searchterm", true) == 0)
        .Value;

    if (searchterm == null)
    {
        return req.CreateResponse(HttpStatusCode.NotFound);
    }

    log.Info($"Searching for word: {searchterm} using Uri: {collectionUri.ToString()}");
    IDocumentQuery<ToDoItem> query = client.CreateDocumentQuery<ToDoItem>(collectionUri)
        .Where(p => p.Description.Contains(searchterm))
        .AsDocumentQuery();

    while (query.HasMoreResults)
    {
        foreach (ToDoItem result in await query.ExecuteNextAsync())
        {
            log.Info(result.Description);
        }
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

Azure Cosmos DB v1 出力

このセクションには、次の例が含まれています。

  • キュー トリガー、1 つのドキュメントの書き込み
  • キュー トリガー、IAsyncCollector を使用したドキュメントの書き込み

キュー トリガー、1 つのドキュメントの書き込み

次の例は、function.json ファイルの Azure Cosmos DB 出力バインドと、そのバインドが使用される C# スクリプト関数を示しています。 この関数は、次の形式で JSON を受信するキューのキュー入力バインドを使用します。

{
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

この関数は、各レコードに対して次の形式の Azure Cosmos DB ドキュメントを作成します。

{
    "id": "John Henry-123456",
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

function.json ファイルのバインディング データを次に示します。

{
    "name": "employeeDocument",
    "type": "documentDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "createIfNotExists": true,
    "connection": "MyAccount_COSMOSDB",
    "direction": "out"
}

C# スクリプト コードを次に示します。

    #r "Newtonsoft.Json"

    using Microsoft.Azure.WebJobs.Host;
    using Newtonsoft.Json.Linq;

    public static void Run(string myQueueItem, out object employeeDocument, TraceWriter log)
    {
        log.Info($"C# Queue trigger function processed: {myQueueItem}");

        dynamic employee = JObject.Parse(myQueueItem);

        employeeDocument = new {
            id = employee.name + "-" + employee.employeeId,
            name = employee.name,
            employeeId = employee.employeeId,
            address = employee.address
        };
    }

キュー トリガー、IAsyncCollector を使用したドキュメントの書き込み

複数のドキュメントを作成するために ICollector<T> または IAsyncCollector<T> にバインドできます。T は、サポートされている型のいずれかです。

この例では、次のようなシンプルな ToDoItem タイプを参照します。

namespace CosmosDBSamplesV1
{
    public class ToDoItem
    {
        public string Id { get; set; }
        public string Description { get; set; }
    }
}

function.json ファイルを次に示します。

{
  "bindings": [
    {
      "name": "toDoItemsIn",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "todoqueueforwritemulti",
      "connection": "AzureWebJobsStorage"
    },
    {
      "type": "documentDB",
      "name": "toDoItemsOut",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "out"
    }
  ],
  "disabled": false
}

C# スクリプト コードを次に示します。

using System;

public static async Task Run(ToDoItem[] toDoItemsIn, IAsyncCollector<ToDoItem> toDoItemsOut, TraceWriter log)
{
    log.Info($"C# Queue trigger function processed {toDoItemsIn?.Length} items");

    foreach (ToDoItem toDoItem in toDoItemsIn)
    {
        log.Info($"Description={toDoItem.Description}");
        await toDoItemsOut.AddAsync(toDoItem);
    }
}

Azure SQL トリガー

Azure SQL トリガーのその他のサンプルは、GitHub リポジトリで入手できます。

次の例は、ToDoItem クラスとそれに対応するデータベース テーブルを示しています。

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

変更の追跡は、データベースとテーブルで有効になります。

ALTER DATABASE [SampleDatabase]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);

ALTER TABLE [dbo].[ToDo]
ENABLE CHANGE_TRACKING;

SQL トリガーは、それぞれ 2 つのプロパティを持つ SqlChange オブジェクトの一覧である IReadOnlyList<SqlChange<T>> にバインドされます。

  • 項目: 変更された項目。 項目の型は、ToDoItem クラスに示されているようにテーブル スキーマに従う必要があります。
  • 操作:SqlChangeOperation 列挙型からの値。 設定可能な値は InsertUpdateDelete です。

次の例は、function.json ファイル内の SQL トリガーと、ToDo テーブルに変更がある場合に呼び出される C# スクリプト関数を示しています。

function.json ファイルのバインド データを次に示します。

{
    "name": "todoChanges",
    "type": "sqlTrigger",
    "direction": "in",
    "tableName": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
}

C# スクリプト関数を次に示します。

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static void Run(IReadOnlyList<SqlChange<ToDoItem>> todoChanges, ILogger log)
{
    log.LogInformation($"C# SQL trigger function processed a request.");

    foreach (SqlChange<ToDoItem> change in todoChanges)
    {
        ToDoItem toDoItem = change.Item;
        log.LogInformation($"Change operation: {change.Operation}");
        log.LogInformation($"Id: {toDoItem.Id}, Title: {toDoItem.title}, Url: {toDoItem.url}, Completed: {toDoItem.completed}");
    }
}

Azure SQL 入力

Azure SQL 入力バインドのその他のサンプルは、GitHub リポジトリで入手できます。

このセクションには、次の例が含まれています。

次の例では ToDoItem クラスとそれに対応するデータベース テーブルを参照します。

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

HTTP トリガー、クエリ文字列からの ID による行の取得

次の例は、function.json ファイルの Azure SQL 入力バインドと、そのバインドが使用される C# スクリプト関数を示しています。 この関数は、クエリ文字列を使用して ID を指定する HTTP 要求によってトリガーされます。 その ID は、指定されたクエリを使用して ToDoItem レコードを取得するために使用されます。

Note

HTTP クエリ文字列パラメーターは大文字と小文字が区別されます。

function.json ファイルのバインディング データを次に示します。

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "get"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItem",
    "type": "sql",
    "direction": "in",
    "commandText": "select [Id], [order], [title], [url], [completed] from dbo.ToDo where Id = @Id",
    "commandType": "Text",
    "parameters": "@Id = {Query.id}",
    "connectionStringSetting": "SqlConnectionString"
}

C# スクリプト コードを次に示します。

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Collections.Generic;

public static IActionResult Run(HttpRequest req, ILogger log, IEnumerable<ToDoItem> todoItem)
{
    return new OkObjectResult(todoItem);
}

HTTP トリガー、行の削除

次の例は、function.json ファイルの Azure SQL 入力バインドと、そのバインドで HTTP 要求クエリ パラメーターの入力を使用してストアド プロシージャを実行する C# スクリプト関数を示しています。 この例では、ストアド プロシージャは、パラメーターの値に応じて 1 つのレコードまたはすべてのレコードを削除します。

ストアド プロシージャ dbo.DeleteToDo は、SQL データベースに作成する必要があります。

CREATE PROCEDURE [dbo].[DeleteToDo]
    @Id NVARCHAR(100)
AS
    DECLARE @UID UNIQUEIDENTIFIER = TRY_CAST(@ID AS UNIQUEIDENTIFIER)
    IF @UId IS NOT NULL AND @Id != ''
    BEGIN
        DELETE FROM dbo.ToDo WHERE Id = @UID
    END
    ELSE
    BEGIN
        DELETE FROM dbo.ToDo WHERE @ID = ''
    END

    SELECT [Id], [order], [title], [url], [completed] FROM dbo.ToDo
GO

function.json ファイルのバインディング データを次に示します。

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "get"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItems",
    "type": "sql",
    "direction": "in",
    "commandText": "DeleteToDo",
    "commandType": "StoredProcedure",
    "parameters": "@Id = {Query.id}",
    "connectionStringSetting": "SqlConnectionString"
}
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

namespace AzureSQL.ToDo
{
    public static class DeleteToDo
    {
        // delete all items or a specific item from querystring
        // returns remaining items
        // uses input binding with a stored procedure DeleteToDo to delete items and return remaining items
        [FunctionName("DeleteToDo")]
        public static IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "delete", Route = "DeleteFunction")] HttpRequest req,
            ILogger log,
            [Sql(commandText: "DeleteToDo", commandType: System.Data.CommandType.StoredProcedure, 
                parameters: "@Id={Query.id}", connectionStringSetting: "SqlConnectionString")] 
                IEnumerable<ToDoItem> toDoItems)
        {
            return new OkObjectResult(toDoItems);
        }
    }
}

C# スクリプト コードを次に示します。

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Collections.Generic;

public static IActionResult Run(HttpRequest req, ILogger log, IEnumerable<ToDoItem> todoItems)
{
    return new OkObjectResult(todoItems);
}

Azure SQL 出力

Azure SQL 出力バインドのその他のサンプルは、GitHub リポジトリで入手できます。

このセクションには、次の例が含まれています。

次の例では ToDoItem クラスとそれに対応するデータベース テーブルを参照します。

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

HTTP トリガー、レコードをテーブルに書き込む

次の例は、function.json ファイル内の SQL 出力バインドと C# スクリプト関数を示しています。この関数は、HTTP POST 要求で JSON 本文として提供されるデータを使ってテーブルにレコードを追加します。

function.json ファイルのバインド データを次に示します。

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "post"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItem",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
}

C# スクリプト コードの例を次に示します。

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static IActionResult Run(HttpRequest req, ILogger log, out ToDoItem todoItem)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = new StreamReader(req.Body).ReadToEnd();
    todoItem = JsonConvert.DeserializeObject<ToDoItem>(requestBody);

    return new OkObjectResult(todoItem);
}

HTTP トリガー、2 つのテーブルに書き込む

次の例は、function.json ファイル内の SQL 出力バインドと C# スクリプト関数を示しています。この関数は、HTTP POST 要求で JSON 本文として提供されるデータと複数の出力バインドを使って、データベースの 2 つの異なるテーブル (dbo.ToDodbo.RequestLog) にレコードを追加します。

2 番目のテーブル dbo.RequestLog は、次の定義に対応します。

CREATE TABLE dbo.RequestLog (
    Id int identity(1,1) primary key,
    RequestTimeStamp datetime2 not null,
    ItemCount int not null
)

function.json ファイルのバインド データを次に示します。

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "post"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItem",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
},
{
    "name": "requestLog",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.RequestLog",
    "connectionStringSetting": "SqlConnectionString"
}

C# スクリプト コードの例を次に示します。

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static IActionResult Run(HttpRequest req, ILogger log, out ToDoItem todoItem, out RequestLog requestLog)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = new StreamReader(req.Body).ReadToEnd();
    todoItem = JsonConvert.DeserializeObject<ToDoItem>(requestBody);

    requestLog = new RequestLog();
    requestLog.RequestTimeStamp = DateTime.Now;
    requestLog.ItemCount = 1;

    return new OkObjectResult(todoItem);
}

public class RequestLog {
    public DateTime RequestTimeStamp { get; set; }
    public int ItemCount { get; set; }
}

RabbitMQ 出力

次の例は、function.json ファイルの RabbitMQ 出力バインドと、そのバインドを使用する C# スクリプト関数を示しています。 この関数は、HTTP トリガーからメッセージを読み取り、RabbitMQ キューに出力します。

function.json ファイルのバインディング データを次に示します。

{
    "bindings": [
        {
            "type": "httpTrigger",
            "direction": "in",
            "authLevel": "function",
            "name": "input",
            "methods": [
                "get",
                "post"
            ]
        },
        {
            "type": "rabbitMQ",
            "name": "outputMessage",
            "queueName": "outputQueue",
            "connectionStringSetting": "rabbitMQConnectionAppSetting",
            "direction": "out"
        }
    ]
}

C# スクリプト コードを次に示します。

using System;
using Microsoft.Extensions.Logging;

public static void Run(string input, out string outputMessage, ILogger log)
{
    log.LogInformation(input);
    outputMessage = input;
}

SendGrid の出力

次の例は、function.json ファイルの Service SendGrid 出力バインディングと、そのバインディングを使用する C# スクリプト関数を示しています。

function.json ファイルのバインディング データを次に示します。

{
    "bindings": [
        {
          "type": "queueTrigger",
          "name": "mymsg",
          "queueName": "myqueue",
          "connection": "AzureWebJobsStorage",
          "direction": "in"
        },
        {
          "type": "sendGrid",
          "name": "$return",
          "direction": "out",
          "apiKey": "SendGridAPIKeyAsAppSetting",
          "from": "{FromEmail}",
          "to": "{ToEmail}"
        }
    ]
}

C# スクリプト コードを次に示します。

#r "SendGrid"

using System;
using SendGrid.Helpers.Mail;
using Microsoft.Azure.WebJobs.Host;

public static SendGridMessage Run(Message mymsg, ILogger log)
{
    SendGridMessage message = new SendGridMessage()
    {
        Subject = $"{mymsg.Subject}"
    };
    
    message.AddContent("text/plain", $"{mymsg.Content}");

    return message;
}
public class Message
{
    public string ToEmail { get; set; }
    public string FromEmail { get; set; }
    public string Subject { get; set; }
    public string Content { get; set; }
}

SignalR トリガー

function.json ファイルのバインディング データの例を次に示します。

{
    "type": "signalRTrigger",
    "name": "invocation",
    "hubName": "SignalRTest",
    "category": "messages",
    "event": "SendMessage",
    "parameterNames": [
        "message"
    ],
    "direction": "in"
}

そして、コードは次のとおりです。

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using System;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
using Microsoft.Extensions.Logging;

public static void Run(InvocationContext invocation, string message, ILogger logger)
{
    logger.LogInformation($"Receive {message} from {invocationContext.ConnectionId}.");
}

SignalR 入力

次の例は、function.json ファイルの SignalR 接続情報入力バインドと、そのバインドを使用して接続情報を返す C# スクリプト関数を示しています。

function.json ファイルのバインド データを次に示します。

function.json の例:

{
    "type": "signalRConnectionInfo",
    "name": "connectionInfo",
    "hubName": "chat",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "direction": "in"
}

C# スクリプト コードを次に示します。

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static SignalRConnectionInfo Run(HttpRequest req, SignalRConnectionInfo connectionInfo)
{
    return connectionInfo;
}

バインドの userId プロパティをいずれかのヘッダーの値に設定するには、バインド式として {headers.x-ms-client-principal-id} または {headers.x-ms-client-principal-name} を使用します。

function.json の例:

{
    "type": "signalRConnectionInfo",
    "name": "connectionInfo",
    "hubName": "chat",
    "userId": "{headers.x-ms-client-principal-id}",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "direction": "in"
}

C# スクリプト コードを次に示します。

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static SignalRConnectionInfo Run(HttpRequest req, SignalRConnectionInfo connectionInfo)
{
    // connectionInfo contains an access key token with a name identifier
    // claim set to the authenticated user
    return connectionInfo;
}

SignalR 出力

function.json ファイルのバインド データを次に示します。

function.json の例:

{
  "type": "signalR",
  "name": "signalRMessages",
  "hubName": "<hub_name>",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}

C# スクリプト コードを次に示します。

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    object message,
    IAsyncCollector<SignalRMessage> signalRMessages)
{
    return signalRMessages.AddAsync(
        new SignalRMessage
        {
            Target = "newMessage",
            Arguments = new [] { message }
        });
}

ユーザーに対して認証された接続だけにメッセージを送信するには、SignalR メッセージの user ID を設定します。

function.json の例:

{
  "type": "signalR",
  "name": "signalRMessages",
  "hubName": "<hub_name>",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}

C# スクリプト コードを次に示します。

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    object message,
    IAsyncCollector<SignalRMessage> signalRMessages)
{
    return signalRMessages.AddAsync(
        new SignalRMessage
        {
            // the message will only be sent to this user ID
            UserId = "userId1",
            Target = "newMessage",
            Arguments = new [] { message }
        });
}

グループに追加された接続だけにメッセージを送信するには、SignalR メッセージの group name を設定します。

function.json の例:

{
  "type": "signalR",
  "name": "signalRMessages",
  "hubName": "<hub_name>",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}

C# スクリプト コードを次に示します。

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    object message,
    IAsyncCollector<SignalRMessage> signalRMessages)
{
    return signalRMessages.AddAsync(
        new SignalRMessage
        {
            // the message will be sent to the group with this name
            GroupName = "myGroup",
            Target = "newMessage",
            Arguments = new [] { message }
        });
}

SignalR Service を使用すると、ユーザーまたは接続をグループに追加できます。 その後にメッセージをグループに送信できます。 SignalR 出力バインドを使ってグループを管理することができます。

次の例では、ユーザーをグループに追加します。

function.json の例

{
    "type": "signalR",
    "name": "signalRGroupActions",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "hubName": "chat",
    "direction": "out"
}

Run.csx

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    HttpRequest req,
    ClaimsPrincipal claimsPrincipal,
    IAsyncCollector<SignalRGroupAction> signalRGroupActions)
{
    var userIdClaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier);
    return signalRGroupActions.AddAsync(
        new SignalRGroupAction
        {
            UserId = userIdClaim.Value,
            GroupName = "myGroup",
            Action = GroupAction.Add
        });
}

次の例では、ユーザーをグループから削除します。

function.json の例

{
    "type": "signalR",
    "name": "signalRGroupActions",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "hubName": "chat",
    "direction": "out"
}

Run.csx

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    HttpRequest req,
    ClaimsPrincipal claimsPrincipal,
    IAsyncCollector<SignalRGroupAction> signalRGroupActions)
{
    var userIdClaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier);
    return signalRGroupActions.AddAsync(
        new SignalRGroupAction
        {
            UserId = userIdClaim.Value,
            GroupName = "myGroup",
            Action = GroupAction.Remove
        });
}

Twilio 出力

次の例は、function.json ファイルの Twilio 出力バインドと、そのバインドを使用する C# スクリプト関数を示しています。 関数は、outパラメーターを使用してテキスト メッセージを送信します。

function.json ファイルのバインド データを次に示します。

function.json の例:

{
  "type": "twilioSms",
  "name": "message",
  "accountSidSetting": "TwilioAccountSid",
  "authTokenSetting": "TwilioAuthToken",
  "from": "+1425XXXXXXX",
  "direction": "out",
  "body": "Azure Functions Testing"
}

C# スクリプト コードを次に示します。

#r "Newtonsoft.Json"
#r "Twilio"
#r "Microsoft.Azure.WebJobs.Extensions.Twilio"

using System;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs.Extensions.Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;

public static void Run(string myQueueItem, out CreateMessageOptions message,  ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");

    // In this example the queue item is a JSON string representing an order that contains the name of a
    // customer and a mobile number to send text updates to.
    dynamic order = JsonConvert.DeserializeObject(myQueueItem);
    string msg = "Hello " + order.name + ", thank you for your order.";

    // You must initialize the CreateMessageOptions variable with the "To" phone number.
    message = new CreateMessageOptions(new PhoneNumber("+1704XXXXXXX"));

    // A dynamic message can be set instead of the body in the output binding. In this example, we use
    // the order information to personalize a text message.
    message.Body = msg;
}

非同期コードで out パラメーターを使用することはできません。 非同期 C# スクリプトのコード例を次に示します。

#r "Newtonsoft.Json"
#r "Twilio"
#r "Microsoft.Azure.WebJobs.Extensions.Twilio"

using System;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs.Extensions.Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;

public static async Task Run(string myQueueItem, IAsyncCollector<CreateMessageOptions> message,  ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");

    // In this example the queue item is a JSON string representing an order that contains the name of a
    // customer and a mobile number to send text updates to.
    dynamic order = JsonConvert.DeserializeObject(myQueueItem);
    string msg = "Hello " + order.name + ", thank you for your order.";

    // You must initialize the CreateMessageOptions variable with the "To" phone number.
    CreateMessageOptions smsText = new CreateMessageOptions(new PhoneNumber("+1704XXXXXXX"));

    // A dynamic message can be set instead of the body in the output binding. In this example, we use
    // the order information to personalize a text message.
    smsText.Body = msg;

    await message.AddAsync(smsText);
}

Warmup トリガー

次に示すのは、function.json ファイルのウォームアップ トリガーと、新しいインスタンスがアプリに追加されるたびに実行される C# スクリプト関数の例です。

Functions ランタイムのバージョン 1.x ではサポートされていません。

function.json ファイルを次に示します。

{
    "bindings": [
        {
            "type": "warmupTrigger",
            "direction": "in",
            "name": "warmupContext"
        }
    ]
}
public static void Run(WarmupContext warmupContext, ILogger log)
{
    log.LogInformation("Function App instance is warm.");  
}

次のステップ