tech.guitarrapc.cóm

Technical updates

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

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

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

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

stackoverflow.com

目次

何がこまっていたのか

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

ネストの厄介なポイント

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

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

改善に伴う情報

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

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

github.com

そして、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.csxEnumerableExtensions.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"

github.com

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

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

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

gist.github.com

コンパイルが成功したことが確認できます。

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

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

まとめ

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

github.com

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

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

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

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