C#スクリプト(.csx)のAzure Fuctoins開発環境を整えてみたけどすごい微妙

C#なAzure FunctionsとCSXなAzure Functions

Visual Studio2017でAzure Functionsのプロジェクトを作るとプリコンパイル方式となる。普通にC#が使えてビルドするとDLLが生成されて、このDLLがAzure環境で元気に稼働してくれる。プリコンパイルなので速い。VSのインテリセンスを効かせて開発できてストレスフリーなどいいことがたくさんあるのだが、この場合デプロイするときにDLL入れ替えのために少し実行が止まってしまうのが懸念される。できるだけ止まってほしくない用途にAzure Functionを使いたくて、じゃあC#スクリプト(.csx)を使ったらダウンタイム気にせず柔軟にFunctionのコードをメンテして入れ替えて、ってできるんじゃないかと思い、csxでのAzure Functions開発環境を整えてみようと思った。

Azureのポータル上で開発もできるがインテリセンスが効かなくてつらい。
じゃあVisual Studio Codeならいいのかな、と思い立ち環境を作ってみようとした記録。

結論から先に

まずcsxに対してインテリセンスを効かせることがどの環境でも結局できなかった。
そしてイチからC#ScriptのAzure Functionを作るのもVisual Studio CodeでもVisual Studio 2017でもうまくいかなかった。
最終的にうまくいった方法は、Azureポータルで作成したcsx方式のfunctionコード一式をダウンロードし、コードはインテリセンスが効くVS2017の適当なcsファイルで書き、それをVisual Studio Codeにコピペして動かすというだいぶ回りくどいもの。
ひとまずコード書いてローカルでデバッグして、ってできる状態にはなったが、もっと上手いやり方がないだろうか。

以下、結論に至るまでの流れです。

参考

基本この記事の通りやればうまくいくであろうという考えで始めました。記事通りjavascriptならうまく動いたけど、csxだとうまくいかなかった。

検証手順

  1. 前提
  2. 拡張機能からAzure Functionsをインストールする

  3. インストールできたらVisual Studio Code を再起動。左メニューにAzureのマークが出る

  4. フォルダに雷マークがついてるアイコンをクリックするとディレクトリを選べと言われるので開発用のフォルダを切って選択する。
    言語を選べと出てくるのだが、この並びにC# Scriptが出てこない。
    怪しい雲行きを感じつつとりあえずC#を選択。

  5. ウィザードに沿って進めるとC#の拡張機能をおすすめされたので黙ってインストールしておく

  6. フォルダが切られるので、今度は3.の手順で押したフォルダアイコンの隣にある雷マークのアイコンを押下して関数コードを追加する。
    ここでChange project languageとあったのでC# Scriptを選択してみたらテンプレートが何も出てこない。

    怪しい雲行きを感じつつChange template filterを押下し「All」としてみる。
    ここでHTTP Triggerが出てきたので選択。
    ファイル名を決めると認証レベルを選べと言われるのでひとまずAnonymousにする。

  7. run.csxが生成されるのでデバッグ実行してみるが、失敗。
    なんだそれっぽいコード出てくるじゃん、と思ったがそんなうまい話なかった。
    No job functions found.~とエラーが出力されてうまくFunctionが開始されない。
    設定ファイル周りかと思うがなかなかヒントに辿り着かないので別のやり方を考え始める。
    ちなみに全く同じ手順を言語でJavaScriptを選んでやると成功する。
    やはりC#Scriptは検証済みのテンプレートではないから簡単にデバッグできる感じではないらしい。

    No job functions found. Try making your job classes and methods public.
    If you're using binding extensions (e.g. ServiceBus, Timers, etc.) make
    sure you've called the registration method for the extension(s) in your
    startup code (e.g. config.UseServiceBus(), config.UseTimers(), etc.).

  8. じゃあAzure ポータル上でcsx方式のFunctionを生成してそれをローカルに持ってこよう
    Azureポータルから新しくAzure Functionを作成し、関数を追加。
    ポータル上で関数を作るよう選択するとブラウザでHTTP Triggerのrun.csxファイルが編集できるようになる。
    そしたらFunctionの概要ページにある「アプリのコンテンツのダウンロード」を選択。

    「コンテンツと Visual Studio プロジェクト」を選択してダウンロードするとcsprojファイルを含むソース一式が入ったzipファイルが手に入る。

  9. zipを解凍してVisual Studio Codeのワークスペースに追加
    VS Code上から解凍したフォルダに入っているcsprojを追加する。
    するとVS Codeが「VS Code以外で作られたAzure FunctionだけどVS Code向けに初期化する?」と聞いてくるのでYesを押下する。

  10. 初期化が完了したらF5でデバッグ
    Http Functions:と関数を発火させるURLが表示される。

    ブラウザなりでこのURLを叩いてrun.csxで書かれた処理を通ってレスポンスが来ていればVisual Studio Codeでのデバッグ実行は成功。

  11. VS2017だとどうか
    8.でダウンロードしたソースをVS2017で開いてみると、ビルドはできるがデバッグ実行でエラー。そんなアセンブラ知らないみたいなエラーが沢山出てきたけど深追いせず置いておく。

  12. インテリセンス
    VS Codeではサードパーティー製のプラグインでインテリセンスが効くような記事が散見されたものの、なんかうまくいかず断念。
    じゃあVS2017でC#のコード書いてしまえ。

ということで結論に至る。
ひとまずVS Codeでデバッグ実行できただけでも収穫か。
インテリセンス使いたいだけならAzureポータルの横でVS2017開いてコピペが一番手っ取り早いのかもしれない。
HTTP TriggerならAzureポータルでもテストには困らなさそうだしそもそもcsxなAzure Functionsはポータル使ってね、っていうことなのかも、
でもやっぱりcsxにもインテリセンスが効くようになってほしいなあ。