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

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

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

重要

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

Azure Functions では、Python の 2 つのプログラミング モデルがサポートされています。 バインドを定義する方法は、選択したプログラミング モデルによって異なります。

Python v2 プログラミング モデルでは、Python 関数コードでデコレーターを使用してバインドを直接定義できます。 詳細については、「Python 開発者ガイド」を参照してください。

この記事は、両方のプログラミング モデルをサポートしています。

このバインドに関しては現在、Goのサポートは利用できません。

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

  • 分離されたワーカー モデル: ランタイムから分離されたワーカー プロセスで実行されるコンパイル済みの C# 関数。 分離ワーカー プロセスは、LTS および 非 LTS バージョンの .NET および .NET Framework で実行されている C# 関数をサポートするために必要です。 分離ワーカー プロセス関数の拡張機能では、Microsoft.Azure.Functions.Worker.Extensions.* 名前空間が使用されます。
  • インプロセス モデル: Functions ランタイムと同じプロセスで実行されるコンパイル済みの C# 関数。 このモデルの一部では、主に C# ポータルの編集のためにサポートされている C# スクリプトを使用して Functions を実行できます。 インプロセス関数の拡張機能では、Microsoft.Azure.WebJobs.Extensions.* 名前空間が使用されます。
[Function(nameof(QueueInputOutputFunction))]
[QueueOutput("output-queue")]
public string[] QueueInputOutputFunction([QueueTrigger("input-queue")] Album myQueueItem, FunctionContext context)
{
    // Use a string array to return more than one message.
    string[] messages = {
        $"Album name = {myQueueItem.Name}",
        $"Album songs = {myQueueItem.Songs}"};

    _logger.LogInformation("{msg1},{msg2}", messages[0], messages[1]);

    // Queue Output messages
    return messages;
}

Queue Storage への出力バインドを構成する方法のエンド ツー エンドの例については、次のいずれかの記事を参照してください。

次の例は、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 の任意のネイティブ型です。

Queue Storage への出力バインドを構成する方法のエンド ツー エンドの例については、次のいずれかの記事を参照してください。

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

import { app, HttpRequest, HttpResponseInit, InvocationContext, output } from '@azure/functions';

const queueOutput = output.storageQueue({
    queueName: 'outqueue',
    connection: 'MyStorageConnectionAppSetting',
});

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    const body = await request.text();
    context.extraOutputs.set(queueOutput, body);
    return { body: 'Created queue item.' };
}

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    extraOutputs: [queueOutput],
    handler: httpTrigger1,
});

複数のメッセージを出力するには、1 つのオブジェクトではなく配列を返します。 次に例を示します。

context.extraOutputs.set(queueOutput, ['message 1', 'message 2']);

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

const { app, output } = require('@azure/functions');

const queueOutput = output.storageQueue({
    queueName: 'outqueue',
    connection: 'MyStorageConnectionAppSetting',
});

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    extraOutputs: [queueOutput],
    handler: async (request, context) => {
        const body = await request.text();
        context.extraOutputs.set(queueOutput, body);
        return { body: 'Created queue item.' };
    },
});

複数のメッセージを出力するには、1 つのオブジェクトではなく配列を返します。 次に例を示します。

context.extraOutputs.set(queueOutput, ['message 1', 'message 2']);

Queue Storage への出力バインドを構成する方法のエンド ツー エンドの例については、次のいずれかの記事を参照してください。

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

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

Queue Storage への出力バインドを構成する方法のエンド ツー エンドの例については、次のいずれかの記事を参照してください。

次の例では、ストレージ キューに 1 つの値と複数の値を出力する方法を示します。 function.json で必要な構成は、どちらでも同じです。 この例は、v1 と v2 のどちらの Python プログラミング モデルを使用するかによって異なります。

import logging
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="QueueOutput1")
@app.route(route="message")
@app.queue_output(arg_name="msg", 
                  queue_name="<QUEUE_NAME>", 
                  connection="<CONNECTION_SETTING>")
def main(req: func.HttpRequest, msg: func.Out[str]) -> func.HttpResponse:
    input_msg = req.params.get('name')
    logging.info(input_msg)

    msg.set(input_msg)

    logging.info(f'name: {name}')
    return 'OK'

Queue Storage への出力バインドを構成する方法のエンド ツー エンドの例については、次のいずれかの記事を参照してください。

属性

C# ライブラリで出力バインドを定義する属性は、C# クラス ライブラリを実行するモードによって異なります。

分離ワーカー プロセスで実行する場合、次の例に示すように、キューの名前を受け取る QueueOutputAttribute を使用します。

[Function(nameof(QueueInputOutputFunction))]
[QueueOutput("output-queue")]
public string[] QueueInputOutputFunction([QueueTrigger("input-queue")] Album myQueueItem, FunctionContext context)

分離ワーカー プロセスで実行される場合、返される変数のみがサポートされます。 出力パラメーターは使用できません。

デコレーター

Python v2 プログラミング モデルにのみ適用されます。

デコレータを使用して定義された Python v2 関数の場合、queue_output に次のプロパティがあります。

プロパティ 説明
arg_name 関数コード内のキューを表す変数の名前。
queue_name キューの名前。
connection Azure キューへの接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。

function.json を使用して定義された Python 関数については、[構成] セクションを参照してください。

注釈

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> インスタンスとして型指定されます。

構成

"Python v1 プログラミング モデルにのみ適用されます。"

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

プロパティ 説明
queueName キューの名前。
接続 Azure キューへの接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。

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

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

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

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

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

使用方法

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

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

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

関数で 1 つのメッセージを書き込む場合、キュー出力バインドは次の型にバインドできます

タイプ 説明
string メッセージの内容を表す文字列。 メッセージが単純なテキストである場合に使用します。
byte[] メッセージのバイト数。
JSON シリアル化可能な型 JSON メッセージの内容を表すオブジェクト。 Functions は、単純な従来の CLR オブジェクト (POCO) 型を JSON データにシリアル化しようとします。

関数で複数のメッセージを書き込む場合、キュー出力バインドは次の型にバインドできます

タイプ 説明
T[] (T は単一メッセージ型の 1 つ) 複数のメッセージの内容を含む配列。 各エントリは 1 つのメッセージを表します。

その他の出力シナリオでは、 QueueClientAzure.Storage.Queues の他の型と共に を直接作成して使用します。 依存関係の挿入を使用して Azure SDK からクライアントの種類を作成する例については Azure クライアントの登録に関するページを参照してください。

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

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

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

値を直接返すか、context.extraOutputs.set() を使用することで出力メッセージにアクセスします。 キュー項目ペイロードには、文字列または JSON のシリアル化可能なオブジェクトを使用できます。

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

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

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

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

出力関数パラメーターは、 func.Out[func.QueueMessage]func.Out[str]、または func.Out[bytes]として定義する必要があります。 詳細については、 出力例 を参照してください。

接続

connectionプロパティはアプリケーション設定でキーに設定されており、Functionsランタイムが拡張で使用しているストレージアカウントに接続するために使われる値を返します。 接続プロパティ設定の値は接続の種類によって異なります:

  • マネージドID接続: connection プロパティは、複数の設定群が共有する <CONNECTION_NAME_PREFIX> であり、これらが共にストレージアカウントへのアイデンティティベースの接続を定義します。 詳細については、「 同一性接続の定義」を参照してください。
  • Key Vault参照:connectionプロパティ設定は、接続文字列が中央管理されている場所への参照Azure Key Vaultを返します。 詳細については、「Key Vault connectionsの定義」をご覧ください。
  • App Configuration reference:connectionプロパティ設定は接続文字列またはKey Vault参照を返すAzure App Configuration参照を返します。 詳細については、接続記事のAzure App Configurationをご覧ください。
  • Connection string:connectionプロパティ設定は実際のストレージアカウント接続文字列を返します。 接続文字列には共有の秘密鍵が含まれているため、可能であれば管理型アイデンティティ接続の使用を検討すべきです。 詳細については、「 接続の定義」を参照してください。

バインディング接続について詳しく知りたい方は、Azure Functionsの「Manage connection in Connection」をご覧ください。 接続文字列を取得するには、「ストレージ アカウント アクセス キーを管理する」の手順に従います。

connectionをキーやAzureWebJobsStorageという名前のキープレフィックスに設定したり、空文字列に設定した場合、バインディング拡張はデフォルトのホストストレージアカウントを使用します。 詳細については 、「ストレージパフォーマンスの最適化」をご覧ください。

例外とリターン コード

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

次のステップ