tech.guitarrapc.cóm

Technical updates

Azure Functions C#で外部.csxファイルをファンクションにロード可能になりました

Azure Functionsで、ファンクション本体のrun.csxから、外部のrun.csxを呼び出せるようになりました!

これは相当大きな改善なので早速見てみましょう。

あ、あと、Azure WebJobsAzure Functionsをどう選択するか、中の人の神記事があるので読んでおきましょう。

https://stackoverflow.com/questions/36610952/azure-webjobs-vs-azure-functions-how-to-choose/36611919#36611919

何がこまっていたのか

AWS LambdaやAzure Functionsで少しもんにょりするのが、各種ラムダ処理、ファンクション処理で共通呼び出しをどうやるかです。これまでどうしていたかというと「それぞれの処理用にラムダ/ファンクションを作って呼び出し」しました。つまり、ラムダ/ファンクションの多段処理(ネスト)です。

ネストの厄介なポイント

ネストを行うと1つのやりたいことのために、リクエストが多重化されます。

それに加えて、AWS Lambda、Azure Functions共に100 実行が保証されているわけではないのが前提なので、多段にしているとどこで失敗したのか追跡が厄介です。*1

改善に伴う情報

このC# Script (.csx)で外部の .csxファイルを読み込む仕組みがあります。それが、#loadキーワードです。#loadでは独自アセンブリのリファレンスが可能ですが、#loadでは外部.csxファイルの読み込みが可能になります。

Azure Functionsでこの機能を使いたいというIssueがこれです。

https://github.com/Azure/azure-webjobs-sdk-script/issues/221

そして、6日たったのでまだかなぁとつぶやくと、安定の中の人から今デプロイした連絡がありました。

外部.csxの参照

さっそく、外部 .csxを配置して参照、呼び出してみましょう。

.csxの配置

参照先の .csxは、Visual Studio OnlineやGitHub CIで配置しましょう。

ここでは、Visual Studio Onlineで配置します。

Visual Studio Onlineへは、Function app settings > Tools > Visual Studio Onlineで移動できます。

作ったファンクションと同じディレクトリにtest.csxを配置します。

上位のディレクトリにEnumerableExtensions.csxを配置します。

もう1つ上位のディレクトリにNuGetSample.csxを配置します。これは、NuGetパッケージを参照した .csxです。

もし外部 .csxでNuGetパッケージを参照する場合、呼び出し元のFunctionのproject.jsonでそのパッケージを追加してあげれば問題ありません。

配置した外部.csxの参照と呼び出し

実際に利用するファンクションで、外部に配置したtext.csxtext.csxを取り込みます。

この時に利用するのが、#load <対象の.csxファイル名>構文です。

#load is used to execute a script file. Variables from the loaded script will shadow previously defined script variables in the new script. Example: #load "myScriptContext.csx"

https://github.com/dotnet/roslyn/wiki/Interactive-Window#load

ではサンプルです。ファンクションのエントリポイントであるrun.csxで外部 .csxの読み込みを追記します。

  • #load "test.csx"
  • #load "..\EnumerableExtensions.csx"
  • #load "..\NuGetSample.csx"

run.csxで外部.csxで定義したメソッドも呼び出せるようになります。

https://gist.github.com/guitarrapc/55c0ce117d5fbe2a3fe38168659a2250

コンパイル成功が確認できます。

ちなみに、#loadでみるパスを間違えたり、project.jsonにNuGet追加忘れ、参照やメソッドが足りなければコンパイルエラーが表示されます。安心ですね!

実行してみると? うまく実行されましたね!

まとめ

今回の外部 .csx参照も、GitHubに追加しておきました。

https://github.com/guitarrapc/AzureFunctionsIntroduction

これでAzure Functionsのネストがすべて解消されました! 非常に素直で極めて強力です。

外部 .csxでNuGetパッケージを参照したければ、ファンクション側のproject.jsonにパッケージを追加すればいいのもわかりやすくていいですね。

Azure Functionsいよいよ使える機能が揃いました。残りは、モニター と実行が時々コケる件ですね。コケるのは、自動的に再実行してくれると嬉しいのですが。

*1:1つのラムダ/ファンクション処理だけなら単純なリトライでいいのですけどね