Azure Functionsの出力バインドをAzure Event Hubsする

この記事では、Azure Functionsの Azure Event Hubs バインドを操作する方法について説明します。 Azure Functionsでは、Event Hubs のトリガーと出力のバインドがサポートされます。

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

Event Hubs 出力バインドを使用して、イベント ストリームにイベントを書き込みます。 イベントを書き込むには、イベント ハブへの送信アクセス許可が必要です。

出力バインディングを実装する前に、必要なパッケージ参照が用意されていることを確認してください。

重要

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

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

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

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

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

次の例は、メソッドの戻り値を出力として使用してメッセージ文字列をイベント ハブに書き込む C# 関数を示しています。

[Function(nameof(EventHubFunction))]
[FixedDelayRetry(5, "00:00:10")]
[EventHubOutput("dest", Connection = "EventHubConnection")]
public string EventHubFunction(
    [EventHubTrigger("src", Connection = "EventHubConnection")] string[] input,
    FunctionContext context)
{
    _logger.LogInformation("First Event Hubs triggered message: {msg}", input[0]);

    var message = $"Output message created at {DateTime.Now}";
    return message;
}

タイマーでトリガーされ、イベント ハブに 1 つのメッセージを送信する TypeScript 関数を次の例に示します。

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

export async function timerTrigger1(myTimer: Timer, context: InvocationContext): Promise<string> {
    const timeStamp = new Date().toISOString();
    return `Message created at: ${timeStamp}`;
}

app.timer('timerTrigger1', {
    schedule: '0 */5 * * * *',
    return: output.eventHub({
        eventHubName: 'myeventhub',
        connection: 'MyEventHubSendAppSetting',
    }),
    handler: timerTrigger1,
});

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

const timeStamp = new Date().toISOString();
const message = `Message created at: ${timeStamp}`;
return [`1: ${message}`, `2: ${message}`];

タイマーでトリガーされ、イベント ハブに 1 つのメッセージを送信する JavaScript 関数を次の例に示します。

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

const eventHubOutput = output.eventHub({
    eventHubName: 'myeventhub',
    connection: 'MyEventHubSendAppSetting',
});

app.timer('timerTrigger1', {
    schedule: '0 */5 * * * *',
    return: eventHubOutput,
    handler: (myTimer, context) => {
        const timeStamp = new Date().toISOString();
        return `Message created at: ${timeStamp}`;
    },
});

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

const timeStamp = new Date().toISOString();
const message = `Message created at: ${timeStamp}`;
return [`1: ${message}`, `2: ${message}`];

PowerShell の完全な例は保留中です。

次の例は、イベント ハブ トリガーのバインドと、そのバインドを使用するPython関数を示しています。 この関数では、メッセージをイベント ハブに書き込みます。 この例は、v1 または v2 のどちらのプログラミング モデルPythonを使用するかによって異なります。

import logging
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="eventhub_output")
@app.route(route="eventhub_output")
@app.event_hub_output(arg_name="event",
                      event_hub_name="<EVENT_HUB_NAME>",
                      connection="<CONNECTION_SETTING>")
def eventhub_output(req: func.HttpRequest, event: func.Out[str]):
    body = req.get_body()
    if body is not None:
        event.set(body.decode('utf-8'))
    else:    
        logging.info('req body is none')
    return 'ok'

複数のメッセージを送信するPythonコードを次に示します。

import logging
import azure.functions as func
from typing import List

app = func.FunctionApp()

@app.function_name(name="eventhub_output")
@app.route(route="eventhub_output")
@app.event_hub_output(arg_name="event",
                      event_hub_name="<EVENT_HUB_NAME>",
                      connection="<CONNECTION_SETTING>")

def eventhub_output(req: func.HttpRequest, event: func.Out[List[str]]) -> func.HttpResponse:
    my_messages=["message1", "message2","message3"]
    event.set(my_messages)
    return func.HttpResponse(f"Messages sent")

次の例は、現在の時刻を含むメッセージをイベント ハブに書き込むJava関数を示しています。

@FunctionName("sendTime")
@EventHubOutput(name = "event", eventHubName = "samples-workitems", connection = "AzureEventHubConnection")
public String sendTime(
   @TimerTrigger(name = "sendTimeTrigger", schedule = "0 */5 * * * *") String timerInfo)  {
     return LocalDateTime.now().toString();
 }

Java関数ランタイム ライブラリで、値が Event Hubs に発行されるパラメーターに対して @EventHubOutput 注釈を使用します。 パラメーターは OutputBinding<T> 型である必要があります。ここで、T は POJO または任意のネイティブ Java型です。

属性

インプロセス分離ワーカー プロセスの C# ライブラリはどちらも、属性を使用してバインドを構成します。 C# スクリプトでは、C# スクリプト ガイドで説明されているように、代わりに function.json 構成ファイルを使用します。

[EventHubOutputAttribute] を使って、次のプロパティをサポートするイベント ハブへの出力バインドを定義します。

パラメーター 説明
EventHubName イベント ハブの名前。 イベント ハブ名が接続文字列にも存在する場合、その値は実行時にこのプロパティをオーバーライドします。
接続 Event Hubs への接続方法を指定するアプリ設定または設定コレクションの名前。 詳細については、「接続」を参照してください

デコレータ

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

デコレーターを使用して定義Python v2 関数の場合、event_hub_outputでは、次のプロパティがサポートされます。

プロパティ 説明
arg_name イベントを表す関数コードに使用される変数の名前。
event_hub_name イベント ハブの名前。 イベント ハブ名が接続文字列にも存在する場合、その値は実行時にこのプロパティをオーバーライドします。
connection Event Hubs への接続方法を指定するアプリ設定または設定コレクションの名前。 詳細については、「接続」を参照してください

function.json を使用して定義Python関数については、「Configuration」セクションを参照してください。

注釈

Java関数ランタイム ライブラリで、値が Event Hubs に発行されるパラメーターに対して EventHubOutput 注釈を使用します。 注釈では、次の設定がサポートされています。

構成

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

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

プロパティ 説明
eventHubName イベント ハブの名前。 イベント ハブ名が接続文字列にも存在する場合、その値は実行時にこのプロパティをオーバーライドします。
接続 Event Hubs への接続方法を指定するアプリ設定または設定コレクションの名前。 詳細については、「接続」を参照してください

次の表は、function.json ファイルで設定するバインド構成プロパティの説明です。ランタイムのバージョンごとに異なります。

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

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

使用法

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

関数で 1 つのイベントを書き込む場合、Event Hubs の出力バインドは次の型にバインドできます。

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

関数で複数のイベントを書き込むとき、Event Hubs 出力バインドは次の型にバインドできます。

タイプ 説明
T[] (T は単一のイベントの種類の 1 つ) 複数のイベントを含む配列。 各エントリは 1 つのイベントを表します。

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

EventHubOutput 注釈を使用して関数から Event Hubs メッセージを出力するには、次の 2 つのオプションがあります。

  • 戻り値: 関数自体に注釈を適用すると、関数の戻り値が Event Hubs メッセージとして永続化されます。

  • Imperative: メッセージ値を明示的に設定するには、注釈を型 OutputBinding<T> の特定のパラメーターに適用します。ここで、T は POJO または任意のネイティブ Java型です。 この構成では、setValue メソッドに値を渡すと、その値が Event Hubs メッセージとして保持されます。

PowerShell の完全な例は保留中です。

値を直接返すか、context.extraOutputs.set() を使って、出力メッセージにアクセスします。

関数から Event Hubs メッセージを出力するには、次の 2 つのオプションがあります。

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

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

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

接続

connectionプロパティはアプリケーション設定でキーに設定されており、Functionsランタイムがイベントハブの名前空間に接続するために使う値を返します。その名前空間は拡張で使われるイベントハブです。 接続プロパティ設定の値は接続の種類によって異なります:

  • マネージド・アイデンティティ接続: 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プロパティ設定は名前空間の実際の接続文字列を返します。 接続文字列は、イベント ハブ自体ではなく、Event Hubs 名前空間用である必要があります。 接続文字列には共有の秘密鍵が含まれているため、可能であれば管理型アイデンティティ接続の使用を検討すべきです。 詳細については、「 接続の定義」を参照してください。

バインディング接続について詳しく知りたい方は、Azure Functionsの「Manage connection in Connection」をご覧ください。

Event Hubs名前空間の接続文字列を取得する方法については、「Get an Event Hubs 接続文字列」をご覧ください。

例外とリターン コード

バインド リファレンス
Event Hubs 運用ガイド

次のステップ