Azure Functionsで、ファンクション本体のrun.csxから、外部のrun.csxを呼び出せるようになりました!
これは相当大きな改善なので早速見てみましょう。
あ、あと、Azure WebJobsとAzure Functionsをどう選択するか、中の人の神記事があるので読んでおきましょう。
何がこまっていたのか
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.csxとtext.csxを取り込みます。
この時に利用するのが、#load <対象の.csxファイル名>構文です。
#loadis 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に追加しておきました。
これでAzure Functionsのネストがすべて解消されました! 非常に素直で極めて強力です。
外部 .csxでNuGetパッケージを参照したければ、ファンクション側のproject.jsonにパッケージを追加すればいいのもわかりやすくていいですね。
Azure Functionsいよいよ使える機能が揃いました。残りは、モニター と実行が時々コケる件ですね。コケるのは、自動的に再実行してくれると嬉しいのですが。
*1:1つのラムダ/ファンクション処理だけなら単純なリトライでいいのですけどね