Azure Functions で、ファンクション本体の run.csx
から、外部の .csx
を呼び出せるようになりました!
これは相当大きな改善なので早速見てみましょう。
あ、あと、Azure WebJobs と Azure Functions をどう選択するか、中の人の神記事があるので読んでおきましょう。
目次
何がこまっていたのか
AWS Lambda や Azure Functions で少しもんにょりするのが、各種ラムダ処理、ファンクション処理で共通で呼び出すときにどうするかです。これまでどうしていたかというと「それぞれの処理用にラムダ/ファンクションを作って呼び出し」しました。つまり、ラムダ/ファンクションの多段処理(ネスト)です。
ネストの厄介なポイント
ネストを行うと1つのやりたいことのために、リクエストが多重化されます。
それに加えて、AWS Lambda も Azure Functionsも100% 実行が保証されているわけではない、ということが前提にあるため多段にしているとどこで失敗したのか追跡が厄介です。*1
改善に伴う情報
この C# Script (.csx)で外部の .csxファイルを読み込む仕組みがあります。それが、#load
キーワードです。#r
では独自アセンブリのリファレンスが可能ですが、#load
では 外部.csx ファイルの読み込みが可能になります。
Azure Functions でこの機能を使いたいというIssue がこれです。
そして、6日たったのでまだかなぁとつぶやくと、安定の中の人から今デプロイした連絡がありました。
@guitarrapc_tech Yup! We're still in the process of documenting it, but it should be checked into master right now. cc @codesapien
— Christopher Anderson (@crandycodes) April 14, 2016
@guitarrapc_tech @crandycodes yes! It's there. Went in with the last drop. #load "MyFile.csx" will compile those files with your function.
— Fabio Cavalcante (@codesapien) April 14, 2016
外部.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.csx
と EnumerableExtensions.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"
ではサンプルです。ファンクションのエントリポイントである run.csx
で外部 .csx の読み込みを追記します。
#load "test.csx"
#load "..\EnumerableExtensions.csx"
#load "..\NuGetSample.csx"
run.csx で外部.csx で定義したメソッドも呼び出せるようになります。
コンパイルが成功したことが確認できます。
ちなみに、#load でみるパスを間違えたり、project.json
にNuGet追加忘れ、参照やメソッドが足りなければコンパイルエラーが表示されます。安心ですね!
実行してみると?うまく実行されましたね!
まとめ
今回の外部 .csx 参照も、Github に追加しておきました。
これで Azure Functions のネストがすべて解消されました!非常に素直で極めて強力です。
外部 .csx で NuGet パッケージを参照したければ、ファンクション側の project.json
にパッケージを追加すればいいのもわかりやすくていいですね。
Azure Functions いよいよ使える機能が揃いました。残りは、モニター と 実行が時々コケる件ですね。コケるのは、自動的に再実行してくれると嬉しいのですが。
*1:1つのラムダ/ファンクション処理だけなら単純なリトライでいいのですけどね