.NET 6.0 もリリースされて Azure Functions Runtime v4 もでたということで手元のアレコレをアップデートしてたのですが、IoT HubトリガーやEvent Hubsトリガーで使う Microsoft.Azure.WebJobs.Extensions.EventHubs 5.0.0 が出ていたのでついでに更新することにしたのですが、少し手直しが必要になったのでメモしておきます。
(現状、Visual StudioでIoT HubトリガーなFunctionsを追加すると 4.3.0 が使われるので更新すると同じことをしないといけないはず)
5.x での変更点
Event Hubs 拡張機能 5.x 以降でも書かれていますが、5.x以降では接続文字列で共有キー以外にもManaged Identitiesが使えるようになったりしています(=設定からキーを排除できますね)。あと .NET でバインドする際の EventDataが Microsoft.Azure.EventHubs
から Azure.Messaging.EventHubs に変わりました。
Event Hubs トリガーの場合
トリガーのバインディングで EventData を使っている場合は Azure.Messaging.EventHubs に代わっているので、修正します。基本的にはIntelliSenceに任せておけばいいと思いますが。 EventDataのBodyプロパティなどは非推奨になってるのでEventBodyに変えたりとかもしましょう。
EventHubsについては基本的にコンパイルエラーがでないようにすればOKだと思います。
それからEvent HubsのEventHubOptionsで起動時のオフセットをコードで行っている場合はオプションの指定方法が変わってるので直しましょう。
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Azure.WebJobs.EventHubs;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(Test.EventHubStartup))]
namespace Test
{
public class EventHubStartup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.PostConfigure<EventHubOptions>(o => o.InitialOffsetOptions.Type = OffsetType.FromEnd);
}
}
}
他のオプション含めてhost.jsonで設定してもいい気がしますね()
IoT Hubトリガーの場合
IoT Hubトリガーは実体としてEvent Hubsトリガーなので基本的に同じ対応をすればOK…と思いきや。そのままで起動するとエラーがでて起動しません。
Azure.Messaging.EventHubs: The path to an Event Hub may be specified as part of the connection string or as a separate value, but not both. Please verify that your connection string does not have the `EntityPath` token if you are passing an explicit Event Hub name. (Parameter 'connectionString').
Value cannot be null. (Parameter 'provider')
Event Hubs名を指定する場合は接続文字列にEntityPathがあったらだめだよってことですが、チュートリアルなりに従ってAzureポータルから接続文字列をコピーしてくるとEntityPath込み、かつIoTHubトリガーのeventHubNameは messages/events
を指定してるのでこのエラーが発生する感じです。まぁ結論としてはeventHubNameのほうを空文字にすればOKでした。
[FunctionName("FuncV5")]
public static void Run(
[IoTHubTrigger(
"",
Connection = "connstr"
)]EventData message,
ILogger log)
{
log.LogInformation(BitConverter.ToString(message.EventBody.ToArray()));
}
接続文字列のEntityPathを消してその値をeventHubNameに設定してもOKです。
※ messages/events
はIoT Hubの組み込みEvent Hubs互換なのですが、4.x以降無くても解釈してくれるようになったのか元からなのかよくわかりませんね。。とりあえず無くても組み込みエンドポイントなEvent Hubsにはアクセスできたのでそういうものか、、
参考
- Azure WebJobs Event Hubs client library for .NET
- ついでに
Microsoft.Azure.WebJobs.Extensions.Storage
も 5.xにしたらやたら409の警告ログがでるようになってしまって(リースの取得時のログだと思うけど)ウザくなったのでログを抑制するようにしたりした。直るといいね。