BEACHSIDE BLOG

MicrosoftとかC#を好むレンジャーの個人的メモ

Azure Functions - Queue トリガーの キュー の 接続文字列

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への接続文字列を定義をしない書き方)だと、

f:id:beachside:20180211144059p:plain


local.settings.json ファイルの Values > AzureWebJobsStorage の値をとってきます。

f:id:beachside:20180211144204p:plain


デフォルトでは、 "AzureWebJobsStorage": "UseDevelopmentStorage=true" と設定されているので、ローカルのエミュレーターをみに行きます。デバッグ時に Queue に何か入れたいときは、Azure Storage Explorer とかで、 Local の Storage Accounts の Development の中の Queues を操作してあげればよいですね。

f:id:beachside:20180211144529p:plain


ローカルでデバッグする際も Azure 上の Storage の Queue を使いたいときは、"UseDevelopmentStorage=true" の部分を、実際に使いたい Storage の接続文字列にしてあげればよいです。

プログラム側の local.settings.json での定義した情報は、Azure 上の Function App のインスタンス側には反映されません。これについては後述します。

キーを新たに定義するの場合

なんらかの理由で AzureWebJobsStorage 以外のキーを使いたい場合は、local.settings.json ファイルで適当に定義します。下の図だと、あえて別のセクションに2箇所に定義してみました。

f:id:beachside:20180211144944p:plain

Values セクションに定義する場合(上図だと、QueueConnectionString )は、プログラム側で以下のように書いてあげると取得できます。

f:id:beachside:20180211145807p:plain


または、StorageAccountAttribute を使ってこうでもいいですね。どちらでも構いません。

f:id:beachside:20180211145828p:plain


ということで、この書き方をしておくと無難です。

余談:無難じゃないけど試したくなる書き方

ASP.NET Core ではおなじみの appsettings.json で書きそうな「セクションでグルーピングして、その中の値をとってくる」って書き方を試したい。しかも、ConnectionStrings ってセクション名の場合どうなるんだろって気になりました。Azure の環境変数では、「アプリケーション設定」じゃなくて「接続文字列」の方で扱われるやつです。ここではどう動くのか試したい。

ということで、さきほどの local.settings.json ファイルの2つ目の定義を呼び出してみます。 以下図のように、App Service であるあるな普通の書き方(今回の例だと Connection = "ConnectionStrings:Queue" )で書いたら正常に動作でました。

f:id:beachside:20180211150007p:plain


問題なく動くので、念のためSDKの実装も確認してみたら...

azure-webjobs-sdk/ConfigurationUtility.cs at 24447418dcfd5657e320937c7c7ce5d305c0f28c · Azure/azure-webjobs-sdk · GitHub

ConnectionStrings セクションをみに行ってなければ AppSettings (ここでは local.settings.jsonValues セクション配下 )をみにいってるのですね。

しかしこの書き方だと、Azure 上でデプロイするとき、このままじゃ正しく動作しないので、(察しの通り、プログラム側での接続文字列のキーの指定は、 ConnectionStrings:Queue だと読み込んでくれないので、Queue って直さないといかんくなる)ので、余計なことはやめましょう...と結論付けました。(念のため動作確認してみましたが、想定通りの動きでした。)

Azure 上(の Functions )で環境変数の確認

Azure ポータルで設定を確認するには、作成した Function App の、アプリケーション設定 から確認できます。

f:id:beachside:20180211150209p:plain


AzureWebJobsStorage はデフォルトで作成されており Azure 上に Function App を作る際に指定したストレージの接続文字列が入っています。 前述でしたようなキーを別に定義する場合は、local.settings.json に追加したのと同じキーで登録してあげる必要があります。また、local.settings.jsonValues に設定した情報は、Azureポータル側のアプリケーション設定に設定してあげるとよいですね。

f:id:beachside:20180211150321p:plain


まとめ

2018/2月時点だと、シンプルにするためにこんな感じですればいいでしょうか。
(個人的主観です、正しく動く定義をすれば個々の好みでいいと思っています)

  • 特に理由がなければ、AzureWebJobsStorage に接続文字列をセットする
  • なんらかの理由で "AzureWebJobsStorage" ではなくカスタムなキーを使いたい場合は、アプリケーション設定の方で定義する
    • local.settings.json ファイルのValues セクションの配下にキーと値を定義
    • Azure 上の Function App のアプリケーション設定メニューの中で、アプリケーション設定の中に定義する

その他

あと、MS牛尾さんの記事、タイトル通りの話で落とし穴がこんなところにあるとは!って思いますわな。ちゃんとネーミングしてればいんだろーけど、知らずにこの挙動来たら焦りますね。

qiita.com


QueueTriggerAttribute から話がそれますが、
普通に環境変数を取得する書き方だと、昔からある ConfigurationManager クラス.aspx) を使って取得するってのがありますね。.NetFramework の環境(Azure Functions のv1)ならこれを使って書くので問題ないでしょう。

Azure Functions のv2環境だと、ASP.NET Core の Configuration を使って書いていくのがスタンダードになるんでしょうかね?

blog.jongallant.com


参考

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