Azure Functions の Queue Trigger で、キューの ConnectionString のメモです。
たまーに新規に Queue Trigger 作るとき、後述する 余談 が気になって試して時間を浪費している気がしたので..メモっておきました。
環境
- Visual Studion 2017 で C# ( C# script じゃない方)
- Microsoft Azure Webjobs ツール - v15.0.40108.0
- Microsofot.Net.Sdk.Functions - v1.0.b
- Queue Trigger の Functions App
QueueTriggerAttribute を使った接続文字列の設定方法のメモです。
接続文字列の定義の基本
まずはプログラム側です。
Visual Studio 2017 で Azure Functions のプロジェクトを作った場合、Queue の接続文字列は local.settings.json
ファイルで定義できます。
エントリーポイントが以下のコード(Queue名はあるけど、Queueへの接続文字列を定義をしない書き方)だと、
local.settings.json
ファイルの Values
> AzureWebJobsStorage
の値をとってきます。
デフォルトでは、 "AzureWebJobsStorage": "UseDevelopmentStorage=true"
と設定されているので、ローカルのエミュレーターをみに行きます。デバッグ時に Queue に何か入れたいときは、Azure Storage Explorer とかで、 Local の Storage Accounts の Development の中の Queues を操作してあげればよいですね。
ローカルでデバッグする際も Azure 上の Storage の Queue を使いたいときは、"UseDevelopmentStorage=true"
の部分を、実際に使いたい Storage の接続文字列にしてあげればよいです。
プログラム側の local.settings.json
での定義した情報は、Azure 上の Function App のインスタンス側には反映されません。これについては後述します。
キーを新たに定義するの場合
なんらかの理由で AzureWebJobsStorage
以外のキーを使いたい場合は、local.settings.json
ファイルで適当に定義します。下の図だと、あえて別のセクションに2箇所に定義してみました。
Values
セクションに定義する場合(上図だと、QueueConnectionString
)は、プログラム側で以下のように書いてあげると取得できます。
または、StorageAccountAttribute
を使ってこうでもいいですね。どちらでも構いません。
ということで、この書き方をしておくと無難です。
余談:無難じゃないけど試したくなる書き方
ASP.NET Core ではおなじみの appsettings.json
で書きそうな「セクションでグルーピングして、その中の値をとってくる」って書き方を試したい。しかも、ConnectionStrings
ってセクション名の場合どうなるんだろって気になりました。Azure の環境変数では、「アプリケーション設定」じゃなくて「接続文字列」の方で扱われるやつです。ここではどう動くのか試したい。
ということで、さきほどの local.settings.json
ファイルの2つ目の定義を呼び出してみます。 以下図のように、App Service であるあるな普通の書き方(今回の例だと Connection = "ConnectionStrings:Queue"
)で書いたら正常に動作でました。
問題なく動くので、念のためSDKの実装も確認してみたら...
ConnectionStrings
セクションをみに行ってなければ AppSettings
(ここでは local.settings.json
の Values
セクション配下 )をみにいってるのですね。
しかしこの書き方だと、Azure 上でデプロイするとき、このままじゃ正しく動作しないので、(察しの通り、プログラム側での接続文字列のキーの指定は、 ConnectionStrings:Queue
だと読み込んでくれないので、Queue
って直さないといかんくなる)ので、余計なことはやめましょう...と結論付けました。(念のため動作確認してみましたが、想定通りの動きでした。)
Azure 上(の Functions )で環境変数の確認
Azure ポータルで設定を確認するには、作成した Function App の、アプリケーション設定 から確認できます。
AzureWebJobsStorage
はデフォルトで作成されており Azure 上に Function App を作る際に指定したストレージの接続文字列が入っています。
前述でしたようなキーを別に定義する場合は、local.settings.json
に追加したのと同じキーで登録してあげる必要があります。また、local.settings.json
の Values
に設定した情報は、Azureポータル側のアプリケーション設定に設定してあげるとよいですね。
まとめ
2018/2月時点だと、シンプルにするためにこんな感じですればいいでしょうか。
(個人的主観です、正しく動く定義をすれば個々の好みでいいと思っています)
- 特に理由がなければ、
AzureWebJobsStorage
に接続文字列をセットする - なんらかの理由で
"AzureWebJobsStorage"
ではなくカスタムなキーを使いたい場合は、アプリケーション設定の方で定義するlocal.settings.json
ファイルのValues
セクションの配下にキーと値を定義- Azure 上の Function App のアプリケーション設定メニューの中で、アプリケーション設定の中に定義する
その他
あと、MS牛尾さんの記事、タイトル通りの話で落とし穴がこんなところにあるとは!って思いますわな。ちゃんとネーミングしてればいんだろーけど、知らずにこの挙動来たら焦りますね。
QueueTriggerAttribute から話がそれますが、
普通に環境変数を取得する書き方だと、昔からある ConfigurationManager クラス.aspx) を使って取得するってのがありますね。.NetFramework の環境(Azure Functions のv1)ならこれを使って書くので問題ないでしょう。
Azure Functions のv2環境だと、ASP.NET Core の Configuration を使って書いていくのがスタンダードになるんでしょうかね?
参考
Azure Functions における Azure Queue Storage のバインド | Microsoft Docs
GitHub - Azure/azure-webjobs-sdk: Azure WebJobs SDK
GitHub - Azure/azure-webjobs-sdk-extensions: Azure WebJobs SDK Extensions