Azure Functions の Azure Service Bus トリガー

Service Bus トリガーを使用して、Service Bus キューまたはトピックからのメッセージに応答します。 拡張機能バージョン 3.1.0 以降では、セッションが有効なキューまたはトピックでトリガーを実行できます。

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

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

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

次の例は、メッセージ メタデータを読み取り、Service Bus キュー メッセージをログに記録する C# 関数を示しています。

[FunctionName("ServiceBusQueueTriggerCSharp")]                    
public static void Run(
    [ServiceBusTrigger("myqueue", Connection = "ServiceBusConnection")] 
    string myQueueItem,
    Int32 deliveryCount,
    DateTime enqueuedTimeUtc,
    string messageId,
    ILogger log)
{
    log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
    log.LogInformation($"EnqueuedTimeUtc={enqueuedTimeUtc}");
    log.LogInformation($"DeliveryCount={deliveryCount}");
    log.LogInformation($"MessageId={messageId}");
}

次の Java 関数は、@ServiceBusQueueTriggerからの @ServiceBusQueueTrigger 注釈を使用して、Service Bus キュー トリガーの構成について記述します。 この関数は、キューにあるメッセージを取得し、ログに追加します。

@FunctionName("sbprocessor")
 public void serviceBusProcess(
    @ServiceBusQueueTrigger(name = "msg",
                             queueName = "myqueuename",
                             connection = "myconnvarname") String message,
   final ExecutionContext context
 ) {
     context.getLogger().info(message);
 }

Service Bus トピックにメッセージが追加されたときに、Java 関数もトリガーできます。 次の例では、トリガー構成を記述する @ServiceBusTopicTrigger 注釈を使用します。

@FunctionName("sbtopicprocessor")
    public void run(
        @ServiceBusTopicTrigger(
            name = "message",
            topicName = "mytopicname",
            subscriptionName = "mysubscription",
            connection = "ServiceBusConnection"
        ) String message,
        final ExecutionContext context
    ) {
        context.getLogger().info(message);
    }

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

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

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

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

module.exports = async function(context, myQueueItem) {
    context.log('Node.js ServiceBus queue trigger function processed message', myQueueItem);
    context.log('EnqueuedTimeUtc =', context.bindingData.enqueuedTimeUtc);
    context.log('DeliveryCount =', context.bindingData.deliveryCount);
    context.log('MessageId =', context.bindingData.messageId);
};

次の例は、function.json ファイル内の Service Bus トリガー バインディングと、そのバインディングを使用する PowerShell 関数を示しています。

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

{
  "bindings": [
    {
      "name": "mySbMsg",
      "type": "serviceBusTrigger",
      "direction": "in",
      "topicName": "mytopic",
      "subscriptionName": "mysubscription",
      "connection": "AzureServiceBusConnectionString"
    }
  ]
}

Service Bus メッセージが送信されたときに実行される関数を次に示します。

param([string] $mySbMsg, $TriggerMetadata)

Write-Host "PowerShell ServiceBus queue trigger function processed message: $mySbMsg"

次の例では、トリガーを使用して ServiceBus キュー メッセージを読み取る方法を示します。

Service Bus のバインディングは function.json で定義され、そこで type に設定されます。

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "msg",
      "type": "serviceBusTrigger",
      "direction": "in",
      "queueName": "inputqueue",
      "connection": "AzureServiceBusConnectionString"
    }
  ]
}

_init_.py のコードによってパラメーターが として宣言され、関数でキュー メッセージを読み取ることができるようになります。

import azure.functions as func

import logging
import json

def main(msg: func.ServiceBusMessage):
    logging.info('Python ServiceBus queue trigger processed message.')

    result = json.dumps({
        'message_id': msg.message_id,
        'body': msg.get_body().decode('utf-8'),
        'content_type': msg.content_type,
        'expiration_time': msg.expiration_time,
        'label': msg.label,
        'partition_key': msg.partition_key,
        'reply_to': msg.reply_to,
        'reply_to_session_id': msg.reply_to_session_id,
        'scheduled_enqueue_time': msg.scheduled_enqueue_time,
        'session_id': msg.session_id,
        'time_to_live': msg.time_to_live,
        'to': msg.to,
        'user_properties': msg.user_properties,
        'metadata' : msg.metadata
    }, default=str)

    logging.info(result)

属性

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

次の表では、このトリガー属性を使用して設定できるプロパティについて説明します。

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

true に設定した場合、関数の実行が正常に完了するとトリガーによって自動的にメッセージが完了され、それ以外の場合はメッセージが破棄されます。

false に設定する場合は、false を呼び出し、メッセージを完了、破棄、または配信不能にする必要があります。 例外がスローされた場合 (かつ MessageReceiver メソッドが呼び出されなかった場合)、ロックは維持されます。 ロックが期限切れになると、メッセージはキューに再登録されて DeliveryCount はインクリメントされ、ロックは自動的に更新されます。

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

注釈

ServiceBusQueueTrigger 注釈を使用すると、Service Bus キュー メッセージの作成時に実行される関数を作成できます。 使用可能な構成オプションには、次のプロパティがあります。

プロパティ 説明
name 関数コード内のキューまたはトピック メッセージを表す変数の名前。
queueName 監視するキューの名前。 トピックではなくキューを監視する場合にのみ設定します。
topicName 監視するトピックの名前。 キューではなくトピックを監視する場合にのみ設定します。
subscriptionName 監視するサブスクリプションの名前。 キューではなくトピックを監視する場合にのみ設定します。
connection Service Bus への接続方法を指定するアプリ設定または設定コレクションの名前。 「接続」を参照してください。

ServiceBusTopicTrigger 注釈を使用すると、関数をトリガーするデータを対象とするトピックとサブスクリプションを指定できます。

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

詳細については、トリガーのを参照してください。

構成

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

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

true に設定した場合、関数の実行が正常に完了すると、トリガーによって自動的にメッセージが完了され、それ以外の場合はメッセージが破棄されます。

関数で例外が発生すると、ランタイムによってバックグラウンドで abandonAsync が呼び出されます。 例外が発生しなかった場合は、バックグラウンドで completeAsync が呼び出されます。 このプロパティは Azure Functions 2.x 以降でのみ利用できます。

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

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

使用方法

次のパラメーター型は、すべての C# モダリティと拡張機能バージョンでサポートされています。

Type 説明
System.String メッセージが単純なテキストである場合に使用します。
byte[] バイナリ データ メッセージに使用します。
Object メッセージに JSON が含まれている場合、Functions は JSON データを既知の plain-old CLR オブジェクト型に逆シリアル化しようとします。

メッセージング固有のパラメーター型には、追加のメッセージ メタデータが含まれます。 Service Bus トリガーによってサポートされる特定の型は、Functions Runtime のバージョン、拡張機能パッケージのバージョン、および使用される C# のモダリティによって異なります。

ServiceBusReceivedMessage 型を使用して、Service Bus キューとサブスクリプションからメッセージ メタデータを受信します。 詳細については、「メッセージ、ペイロード、およびシリアル化」を参照してください。

C# クラス ライブラリでは、属性のコンストラクターは、キューの名前、またはトピックとサブスクリプションを受け取ります。

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

[ServiceBusAccount("ClassLevelServiceBusAppSetting")]
public static class AzureFunctions
{
    [ServiceBusAccount("MethodLevelServiceBusAppSetting")]
    [FunctionName("ServiceBusQueueTriggerCSharp")]
    public static void Run(
        [ServiceBusTrigger("myqueue", AccessRights.Manage)] 
        string myQueueItem, ILogger log)
{
    ...
}

使用する Service Bus アカウントは、次の順序で決定されます。

  • ServiceBusTrigger 属性の Connection プロパティ。
  • ServiceBusTrigger 属性と同じパラメーターに適用された ServiceBusAccount 属性。
  • 関数に適用される ServiceBusAccount 属性。
  • クラスに適用される ServiceBusAccount 属性。
  • AzureWebJobsServiceBus アプリ設定。

Connection プロパティが定義されていないとき、Functions は AzureWebJobsServiceBus という名前のアプリ設定を探します。これは Service Bus 接続文字列の既定の名前です。 Connection プロパティを設定して、使用する Service Bus 接続文字列を含むアプリケーション設定の名前を指定することもできます。

受信 Service Bus メッセージは、ServiceBusQueueMessage または ServiceBusTopicMessage パラメーターを使用して利用できます。

context.bindings.<name from function.json> を使用して、キューまたはトピック メッセージにアクセスします。 Service Bus メッセージが文字列または JSON オブジェクトとして関数に渡されます。

Service Bus インスタンスは、function.json ファイルの name プロパティで構成されているパラメーター経由で使用できます。

キュー メッセージは、func.ServiceBusMessage として型指定されたパラメーターを介して関数で使用できます。 Service Bus メッセージが文字列または JSON オブジェクトとして関数に渡されます。

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

接続

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

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

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

接続文字列

接続文字列は、管理資格情報の取得に関する記事の手順に従って取得します。 接続文字列は、特定のキューまたはトピックに限らず、Service Bus 名前空間のものである必要があります。

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

アプリ設定の名前が "AzureWebJobs" で始まる場合は、名前の残りの部分のみを指定できます。 たとえば、connection を "MyServiceBus" に設定した場合、Functions ランタイムは "AzureWebJobsMyServiceBus" という名前のアプリ設定を探します。 connection を空のままにした場合、Functions ランタイムは、アプリ設定内の "AzureWebJobsServiceBus" という名前の既定の Service Bus 接続文字列を使用します。

ID ベースの接続

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

このモードでは、拡張機能に次のプロパティが必要です。

プロパティ 環境変数テンプレート 説明 値の例
完全修飾名前空間 <CONNECTION_NAME_PREFIX>__fullyQualifiedNamespace Service Bus の完全修飾名前空間。 <service_bus_namespace>.servicebus.windows.net

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

注意

Azure App Configuration または Key Vault を使用してマネージド ID 接続の設定を指定する場合、__ の代わりに :/ などの有効なキー区切り記号を使用して、名前が正しく解決されるようにしなければなりません。

たとえば、「 <CONNECTION_NAME_PREFIX>:fullyQualifiedNamespace 」のように入力します。

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

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

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

重要

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

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

[バインドの種類] 組み込みロールの例
トリガー 1 Azure Service Bus データ受信者Azure Service Bus データ所有者
出力バインド Azure Service Bus データ送信者

1 Service Bus トピックからのトリガーの場合、ロール割り当てには、Service Bus サブスクリプション リソースに対する有効なスコープが必要です。 トピックだけが含まれている場合は、エラーが発生します。 Azure portal などの一部のクライアントは、ロール割り当てのスコープとして、Service Bus サブスクリプション リソースを公開しません。 このような場合、代わりに Azure CLI を使用できます。 詳しくは、「Azure Service Bus 用の Azure 組み込みロール」を参照してください。

有害メッセージ

Azure Functions では、有害メッセージの処理を制御することも構成することもできません。 Service Bus 自体で、有害なメッセージが処理されます。

PeekLock 動作

Functions ランタイムは、メッセージを PeekLock モードで受信します。 それは、関数が正常に終了した場合はメッセージに対して Complete を呼び出し、関数が失敗した場合は Abandon を呼び出します。 関数が実行されている限り、関数の実行時間が PeekLock タイムアウトよりも長くなると、ロックが自動的に更新されます。

maxAutoRenewDurationmaxAutoRenewDuration に構成可能です。これは OnMessageOptions.MaxAutoRenewDuration にマップされます。 この設定の既定値は 5 分です。

メッセージのメタデータ

メッセージング固有の型を使用すると、オブジェクトのプロパティとしてメタデータを簡単に取得できます。 これらのプロパティは、Functions ランタイムのバージョン、拡張機能パッケージのバージョン、および使用される C# のモダリティによって異なります。

これらのプロパティは ServiceBusReceivedMessage クラスのメンバーです。

プロパティ Type 説明
ApplicationProperties ApplicationProperties 送信者によって設定されたプロパティ。
ContentType string アプリケーション固有のロジックのために送信者と受信者が利用するコンテンツ タイプ識別子。
CorrelationId string 関連付け ID。
DeliveryCount Int32 配信回数。
EnqueuedTime DateTime エンキューされた時刻 (UTC)。
ScheduledEnqueueTimeUtc DateTime スケジュールされたエンキュー時刻 (UTC)。
ExpiresAt DateTime 有効期限 (UTC)。
MessageId string 有効になっている場合に、重複するメッセージを識別するために Service Bus が使用できるユーザー定義の値
ReplyTo string キュー アドレスへの返信。
Subject string Label メタデータ プロパティの代わりに使用できるアプリケーション固有のラベル。
To string 送信先アドレス。

次のステップ