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

Azure Functions は、出力バインドを設定することによって、新しい Azure Queue storage メッセージを作成できます。

セットアップと構成の詳細については、概要に関するページをご覧ください。

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

  •     インプロセス クラス ライブラリ: Functions ランタイムと同じプロセスで実行されるコンパイル済みの C# 関数。
  •     分離プロセス クラス ライブラリ: そのランタイムから分離されたプロセスで実行されるコンパイル済みの C# 関数。 .NET 5.0 で実行されている C# 関数をサポートするには、分離プロセスが必要です。
  • C# スクリプト: Azure portal で c# 関数を作成するときに主に使用されます。

次の例は、受け取った HTTP 要求ごとにキュー メッセージを作成する C# 関数を示しています。

[StorageAccount("MyStorageConnectionAppSetting")]
public static class QueueFunctions
{
    [FunctionName("QueueOutput")]
    [return: Queue("myqueue-items")]
    public static string QueueOutput([HttpTrigger] dynamic input,  ILogger log)
    {
        log.LogInformation($"C# function processed: {input.Text}");
        return input.Text;
    }
}

次の例は、HTTP 要求によってトリガーされたときにキュー メッセージを作成する Java 関数を示しています。

@FunctionName("httpToQueue")
@QueueOutput(name = "item", queueName = "myqueue-items", connection = "MyStorageConnectionAppSetting")
 public String pushToQueue(
     @HttpTrigger(name = "request", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS)
     final String message,
     @HttpOutput(name = "response") final OutputBinding<String> result) {
       result.setValue(message + " has been added.");
       return message;
 }

Java 関数ランタイム ライブラリで、その値が Queue Storage に書き込まれる関数のパラメーター上で @QueueOutput 注釈を使用します。 パラメーターの型は OutputBinding<T> にする必要があります。T は POJO の Java の任意のネイティブ型です。

次の例は、function.json ファイルの HTTP トリガー バインドと、そのバインドを使用する JavaScript 関数を示しています。 この関数では、受け取った HTTP 要求ごとにキュー項目を作成します。

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

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

これらのプロパティについては、「構成」セクションを参照してください。

JavaScript コードを次に示します。

module.exports = async function (context, input) {
    context.bindings.myQueueItem = input.body;
};

一度で複数のメッセージを送信するには、myQueueItem 出力バインドのメッセージ配列を定義します。 次の JavaScript コードは、受け取った HTTP 要求ごとにハードコーディングされた値を含む 2 つのキュー メッセージを送信します。

module.exports = async function(context) {
    context.bindings.myQueueItem = ["message 1","message 2"];
};

次のコードの例は、HTTP によってトリガーされる関数からキュー メッセージを出力する方法を示しています。 queuetype がある構成セクションで、出力バインディングを定義します。

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    },
    {
      "type": "queue",
      "direction": "out",
      "name": "Msg",
      "queueName": "outqueue",
      "connection": "MyStorageConnectionAppSetting"
    }
  ]
}

このバインディング構成で、PowerShell 関数は Push-OutputBinding を使用してキュー メッセージを作成できます。 この例では、クエリ文字列または本文のパラメーターからメッセージが作成されます。

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

# Interact with query parameters or the body of the request.
$message = $Request.Query.Message
Push-OutputBinding -Name Msg -Value $message
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = 200
    Body = "OK"
})

一度に複数のメッセージを送信するには、メッセージ配列を定義し、Push-OutputBinding を使用してキュー出力バインドにメッセージを送信します。

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

# Interact with query parameters or the body of the request.
$message = @("message1", "message2")
Push-OutputBinding -Name Msg -Value $message
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = 200
    Body = "OK"
})

次の例では、ストレージ キューに 1 つの値と複数の値を出力する方法を示します。 function.json で必要な構成は、どちらでも同じです。

ストレージ キュー バインディングは function.json で定義され、そこで typequeue に設定されます。

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "type": "queue",
      "direction": "out",
      "name": "msg",
      "queueName": "outqueue",
      "connection": "AzureStorageQueuesConnectionString"
    }
  ]
}

キューに個々のメッセージを設定するには、 set メソッドに 1 つの値を渡します。

import azure.functions as func

def main(req: func.HttpRequest, msg: func.Out[str]) -> func.HttpResponse:

    input_msg = req.params.get('message')

    msg.set(input_msg)

    return 'OK'

キュー上で複数のメッセージを作成するには、パラメーターを適切なリスト型として宣言し、値の配列 (リスト型と一致する) を set メソッドに渡します。

import azure.functions as func
import typing

def main(req: func.HttpRequest, msg: func.Out[typing.List[str]]) -> func.HttpResponse:

    msg.set(['one', 'two'])

    return 'OK'

属性

C# ライブラリで出力バインドを定義する属性は、C# クラス ライブラリを実行するモードによって異なります。 代わりに、C# スクリプトでは、function.json 構成ファイルを使用します。

C# クラス ライブラリでは、QueueAttribute を使用します。

この属性は、out パラメーターまたは関数の戻り値に適用されます。 次の例のように、属性のコンストラクターはキューの名前を受け取ります。

[FunctionName("QueueOutput")]
[return: Queue("myqueue-items")]
public static string Run([HttpTrigger] dynamic input,  ILogger log)
{
    ...
}

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

[FunctionName("QueueOutput")]
[return: Queue("myqueue-items", Connection = "StorageConnectionAppSetting")]
public static string Run([HttpTrigger] dynamic input,  ILogger log)
{
    ...
}

StorageAccount 属性を使用して、クラス、メソッド、またはパラメーターのレベルでストレージ アカウントを指定できます。 詳細については、「トリガー - 属性」をご覧ください。

注釈

QueueOutput 注釈を使用すると、メッセージを関数の出力として書き込むことができます。 次の例は、キュー メッセージを作成する HTTP トリガー関数を示しています。

package com.function;
import java.util.*;
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;

public class HttpTriggerQueueOutput {
    @FunctionName("HttpTriggerQueueOutput")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION) HttpRequestMessage<Optional<String>> request,
            @QueueOutput(name = "message", queueName = "messages", connection = "MyStorageConnectionAppSetting") OutputBinding<String> message,
            final ExecutionContext context) {

        message.setValue(request.getQueryParameters().get("name"));
        return request.createResponseBuilder(HttpStatus.OK).body("Done").build();
    }
}
プロパティ 説明
name 関数シグネチャのパラメーター名を宣言します。 関数がトリガーされると、このパラメーターの値にはキュー メッセージの内容が含められます。
queueName ストレージ アカウントのキュー名を宣言します。
connection ストレージ アカウントの接続文字列を示します。

QueueOutput 注釈に関連するパラメーターは、OutputBinding<T> インスタンスとして型指定されます。

構成

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

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

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

完全な例については、セクションの例を参照してください。

使用方法

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

インプロセス クラス ライブラリは、Functions ランタイムと同じプロセスで実行されるコンパイル済みの C# 関数です。

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

out T paramName などのメソッドのパラメーターを使用して、単一のキュー メッセージを書き込みます。 out パラメーターではなくメソッドの戻り値の型を使用することができます。T は次に示すいずれかの型の場合があります。

  • JSON としてシリアル化可能なオブジェクト
  • string
  • byte[]
  • QueueMessage

これらの型の使用例については、拡張機能の GitHub リポジトリに関するページを参照してください。

キューに複数のメッセージを書き込むには、次のいずれかの型を使用します。

  • ICollector<T> または IAsyncCollector<T>
  • QueueClient

QueueMessage および QueueClient の使用例については、「拡張機能の GitHub リポジトリ」に関するページを参照してください。

属性は Connection プロパティを受け取りますが、 Connection を使用してストレージ アカウント接続を指定することもできます。 これは、ライブラリ内の他の関数とは異なるストレージ アカウントを使用する必要がある場合に実行できます。 コンストラクターは、ストレージ接続文字列を含むアプリ設定の名前を受け取ります。 属性は、パラメーター、メソッド、またはクラス レベルで適用できます。 次の例では、クラス レベルとメソッド レベルを示します。

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

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

  • トリガーまたはバインド属性の Connection プロパティ。
  • トリガーまたはバインド属性と同じパラメーターに適用された StorageAccount 属性。
  • 関数に適用される StorageAccount 属性。
  • クラスに適用される StorageAccount 属性。
  • AzureWebJobsStorage アプリケーション設定で定義されている、関数アプリの既定のストレージ アカウント。

QueueOutput 注釈を使用して関数からキューを書き込むには、次の 2 つのオプションがあります。

  • 戻り値: 注釈を関数自体に適用することにより、関数の戻り値がキューに書き込まれます。

  • 命令型:メッセージ値を明示的に設定するには、 型の特定のパラメーターに注釈を適用します。 ここで、T は POJO または任意のネイティブ Java 型です。 この構成では、setValue メソッドに値を渡すと、値がキューに書き込まれます。

出力キュー項目は、context.bindings.<NAME> を介して使用できます。ここで、<NAME>function.json で定義されている名前と一致します。 キュー項目ペイロードには、文字列または JSON のシリアル化可能なオブジェクトを使用できます。

キュー メッセージへの出力は Push-OutputBinding 経由で利用できます。この場合、function.json ファイルのバインドの name パラメーターで指定された名前と一致する引数を渡します。

構成されたキューに関数から書き込むには、次の 2 つのオプションがあります。

  • 戻り値:function.json 内の name プロパティを $return に設定します。 この構成では、関数の戻り値は Queue storage メッセージとして永続化されます。

  • 命令型:Out 型として宣言されたパラメーターの set メソッドに値を渡します。 set に渡された値は、Queue storage メッセージとして永続化されます。

接続

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

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

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

接続文字列

接続文字列を取得するには、「ストレージ アカウント アクセス キーを管理する」の手順に従います。

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

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

ID ベースの接続

バージョン 5.x 以上の拡張機能を使用する場合は、シークレットを含む接続文字列の代わりに、アプリで Azure Active Directory ID を使用することができます。 これを行うには、トリガーおよびバインド構成の connection プロパティにマップされる共通のプレフィックスに設定を定義します。

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

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

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

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

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

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

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

重要

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

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

[バインドの種類] 組み込みロールの例
トリガー ストレージ キュー データ閲覧者ストレージ キュー データのメッセージ プロセッサ
出力バインド ストレージ キュー データ共同作成者ストレージ キュー データのメッセージ送信者

例外とリターン コード

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

次のステップ