Azure Functions における RabbitMQ の出力バインドの概要

Note

RabbitMQ バインドは、Premium および Dedicated プランでのみ完全にサポートされています。 従量課金はサポートされていません。

RabbitMQ 出力バインドを使用して、RabbitMQ キューにメッセージを送信します。

セットアップと構成の詳細については、概要に関する記事を参照してください。

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

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

次の例は、メソッドの戻り値を出力として使用して 5 分ごとに TimerTrigger によってトリガーされたときに RabbitMQ メッセージを送信する C# 関数を示しています。

[FunctionName("RabbitMQOutput")]
[return: RabbitMQ(QueueName = "outputQueue", ConnectionStringSetting = "rabbitMQConnectionAppSetting")]
public static string Run([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer, ILogger log)
{
    log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
    return $"{DateTime.Now}";
}

次の例は、IAsyncCollector インターフェイスを使用してメッセージを送信する方法を示しています。

[FunctionName("RabbitMQOutput")]
public static async Task Run(
[RabbitMQTrigger("sourceQueue", ConnectionStringSetting = "rabbitMQConnectionAppSetting")] string rabbitMQEvent,
[RabbitMQ(QueueName = "destinationQueue", ConnectionStringSetting = "rabbitMQConnectionAppSetting")]IAsyncCollector<string> outputEvents,
ILogger log)
{
     // send the message
    await outputEvents.AddAsync(JsonConvert.SerializeObject(rabbitMQEvent));
}

次の例は、メッセージを POCO として送信する方法を示しています。

namespace Company.Function
{
    public class TestClass
    {
        public string x { get; set; }
    }
    public static class RabbitMQOutput{
        [FunctionName("RabbitMQOutput")]
        public static async Task Run(
        [RabbitMQTrigger("sourceQueue", ConnectionStringSetting = "rabbitMQConnectionAppSetting")] TestClass rabbitMQEvent,
        [RabbitMQ(QueueName = "destinationQueue", ConnectionStringSetting = "rabbitMQConnectionAppSetting")]IAsyncCollector<TestClass> outputPocObj,
        ILogger log)
        {
            // send the message
            await outputPocObj.AddAsync(rabbitMQEvent);
        }
    }
}

次の Java 関数は、@RabbitMQOutput からの @RabbitMQOutput 注釈を使用して、RabbitMQ キュー出力バインディングの構成を記述します。 この関数は、5 分ごとに TimerTrigger によってトリガーされたときに RabbitMQ キューにメッセージを送信します。

@FunctionName("RabbitMQOutputExample")
public void run(
@TimerTrigger(name = "keepAliveTrigger", schedule = "0 */5 * * * *") String timerInfo,
@RabbitMQOutput(connectionStringSetting = "rabbitMQConnectionAppSetting", queueName = "hello") OutputBinding<String> output,
final ExecutionContext context) {
    output.setValue("Some string");
}

次の例は、function.json ファイルの RabbitMQ 出力バインドと、そのバインドを使用する JavaScript 関数を示しています。 この関数は、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"
        }
    ]
}

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

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

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

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

{
    "scriptFile": "__init__.py",
    "bindings": [
        {
            "authLevel": "function",
            "type": "httpTrigger",
            "direction": "in",
            "name": "req",
            "methods": [
                "get",
                "post"
            ]
        },
        {
            "type": "http",
            "direction": "out",
            "name": "$return"
        },​​
        {
            "type": "rabbitMQ",
            "name": "outputMessage",
            "queueName": "outputQueue",
            "connectionStringSetting": "rabbitMQConnectionAppSetting",
            "direction": "out"
        }
    ]
}

_init_.py の内容:

import azure.functions as func

def main(req: func.HttpRequest, outputMessage: func.Out[str]) -> func.HttpResponse:
    input_msg = req.params.get('message')
    outputMessage.set(input_msg)
    return 'OK'

属性

インプロセス分離プロセスの C# ライブラリはどちらも、 属性を使用して関数を定義します。 代わりに、C# スクリプトでは、function.json 構成ファイルを使用します。

この属性のコンストラクターは、次のパラメーターを受け取ります。

パラメーター 説明
QueueName メッセージを受け取るキューの名前。
HostName キューのホスト名 (10.26.45.210 など)。 ConnectStringSetting を使う場合は無視されます。
UserNameSetting キューにアクセスするためのユーザー名を含むアプリ設定の名前 (UserNameSetting: "%< UserNameFromSettings >%" など)。 ConnectStringSetting を使う場合は無視されます。
PasswordSetting キューにアクセスするためのパスワードを含むアプリ設定の名前 (PasswordSetting: "%< PasswordFromSettings >%" など)。 ConnectStringSetting を使う場合は無視されます。
ConnectionStringSetting RabbitMQ メッセージ キュー接続文字列を含むアプリ設定の名前。 アプリの設定を使わず、接続文字列を直接指定した場合、トリガーは機能しません。 たとえば、ConnectionStringSetting: "rabbitMQConnection" を設定した場合、local.settings.json と関数アプリの両方で、"RabbitMQConnection" : "< ActualConnectionstring >" のような設定が必要になります。
ポート 使用されているポートを取得または設定します。 既定値は 0 です。これは、5672 という RabbitMQ クライアントの既定のポート設定を指します。

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

インプロセス ライブラリのメソッド シグネチャの RabbitMQTrigger 属性は次のとおりです。

[FunctionName("RabbitMQOutput")]
public static async Task Run(
[RabbitMQTrigger("SourceQueue", ConnectionStringSetting = "TriggerConnectionString")] string rabbitMQEvent,
[RabbitMQ("DestinationQueue", ConnectionStringSetting = "OutputConnectionString")]IAsyncCollector<string> outputEvents,
ILogger log)
{
    ...
}

注釈

RabbitMQOutput 注釈を使用すると、RabbitMQ メッセージの作成時に実行される関数を作成できます。

注釈は、次の構成設定をサポートしています。

設定 説明
queueName メッセージを受け取るキューの名前。
hostName キューのホスト名 (10.26.45.210 など)。 ConnectStringSetting を使う場合は無視されます。
userNameSetting キューにアクセスするためのユーザー名を含むアプリ設定の名前 (UserNameSetting: "%< UserNameFromSettings >%" など)。 ConnectStringSetting を使う場合は無視されます。
passwordSetting キューにアクセスするためのパスワードを含むアプリ設定の名前 (PasswordSetting: "%< PasswordFromSettings >%" など)。 ConnectStringSetting を使う場合は無視されます。
connectionStringSetting RabbitMQ メッセージ キュー接続文字列を含むアプリ設定の名前。 アプリの設定を使わず、接続文字列を直接指定した場合、トリガーは機能しません。 たとえば、ConnectionStringSetting: "rabbitMQConnection" を設定した場合、local.settings.json と関数アプリの両方で、"RabbitMQConnection" : "< ActualConnectionstring >" のような設定が必要になります。
port 使用されているポートを取得または設定します。 既定値は 0 です。これは、5672 という RabbitMQ クライアントの既定のポート設定を指します。

詳細については、出力バインドのを参照してください。

構成

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

function.json のプロパティ 説明
type RabbitMQ に設定する必要があります。
direction out に設定する必要があります。
name 関数コード内のキューを表す変数の名前。
queueName メッセージの送信先となるキューの名前。
hostName キューのホスト名 (10.26.45.210 など)。 connectStringSetting を使う場合は無視されます。
userName UserNameSetting のような、キューにアクセスするユーザー名を含むアプリ設定の名前 (UserNameSetting: "< UserNameFromSettings >" など)。 connectStringSetting を使う場合は無視されます。
password UserNameSetting のような、キューにアクセスするパスワードを含むアプリ設定の名前 (UserNameSetting: "< UserNameFromSettings >" など)。 connectStringSetting を使う場合は無視されます。
connectionStringSetting RabbitMQ メッセージ キュー接続文字列を含むアプリ設定の名前。 local.settings.json でアプリの設定を使わず、接続文字列を直接指定した場合、トリガーは機能しません。 たとえば、connectionStringSetting: "rabbitMQConnection" を設定した場合、local.settings.json と関数アプリの両方で、"rabbitMQConnection" : "< ActualConnectionstring >" のような設定が必要になります。
port 使用されているポートを取得または設定します。 既定値は 0 です。これは、5672 という RabbitMQ クライアントの既定のポート設定を指します。

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

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

使用方法

RabbitMQ トリガーによってサポートされるパラメーターの型は、Functions ランタイムのバージョン、拡張機能パッケージのバージョン、および使用される C# のモダリティによって異なります。

出力バインドには、次のパラメーターの型を使用します。

  • byte[] - 関数が終了したときにパラメーター値が null の場合、Functions はメッセージを作成しません。
  • string - 関数が終了したときにパラメーター値が null の場合、Functions はメッセージを作成しません。
  • POCO - メッセージが C# オブジェクトとして書式設定されている場合。

C# 関数を使用する場合:

  • 非同期関数には、out パラメーターの代わりに戻り値または IAsyncCollector が必要です。

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

出力バインドには、次のパラメーターの型を使用します。

  • byte[] - 関数が終了したときにパラメーター値が null の場合、Functions はメッセージを作成しません。
  • string - 関数が終了したときにパラメーター値が null の場合、Functions はメッセージを作成しません。
  • POJO - パラメーター値が Java オブジェクトとして書式設定されていない場合は、エラーが発生します。

キュー メッセージは、context.bindings.<NAME> を介して使用できます。この <NAME> は function.json で定義されている名前と一致します。 ペイロードが JSON の場合、値はオブジェクトに逆シリアル化されます。

Python のを参照してください。

次の手順