Azure Functions をローカルで開発するためのツールが2種類出ました(1つは結構前からですけど)
細かい話は本家Blog等を参照ください。
またこちらのBlog、動画も参考にどうぞ。
- Creating and Debugging Azure Functions Locally
- Debugging Azure Functions in Our Local Box
- Create an Azure Function using Visual Studio Code
基本的にAzure Functions CliがFunction Appを動かすためのホスト(ランナー)の役割を担います。
※Azure Functions Cliは他にもテンプレートから新規作成したりなども行えます。現状macOS上ではfunc new しかできません(今回のローカルデバッグなどの機能はWindows上でのみ可です)。もしxplatで動かしたいというのであれば、こちらのIssueにUpvote(イイネ)してください。
さて、このPostではVisual Studio 2015での話をします。Visual Studio Codeについては Running Azure Functions Locally with the CLI and VS Code あたりを見たほうが良いかと。
前提条件
- 現在のところVisual Studio Tools for Azure FunctionsはPreview提供です。
- 現在のバージョンは Visual Studio 2015 Update 3 と“Microsoft Web Developer Tools”がインストールされている環境が必要です。
- またAzure SDK for .NET 2.9.6 もインストールしておく必要があります。
現状の制限
- インテリセンスはC#とJavaScriptのみ現状はサポートされます。F#、Python、PowerShellのサポートは関連コンポーネントをインストールしていると使えるようです。またC#・F#の場合、.csxと.fsxファイルといくつかのシステム名前空間で定義されたクラス等に制限されているので注意ください。
- 「新しい項目の追加」メニューは動作しません(空っぽなので追加できない)。エクスプローラーなどで直接ファイル追加してください。
- 発行後正しくFunctionがAzure上に登録されない場合があります(Consumptionモデルの場合)。Azureポータル上でFunctionの一覧を更新してください。
- C#Image Resizeを作成すると、バインディングが正しく生成されません。生成されたfunction.jsonのバインディング「Azure Storage Blob out(imageMedium)」の設定によって、バインディング「Azure Storage Blob out(imageSmall)」の設定がオーバーライドされます。 回避するには生成されたfunction.json内の imageSmallバインディングを手動で編集します。
- ManualTriggerを実行する手段がない感じです。注意しましょう。(とりあえずHTTPトリガーとかで起動できるようにする感じですかね)
インストール方法
こちらからVisual Studio Tools for Azure Functionsをダウンロードしてインストールします。
インストーラーはごく普通のものなのでぽちぽちインストールしましょう。
条件満たしていれば特に問題なくインストール完了すると思います。
使い方
インストール後はVisual StudioにAzure Functions関連のテンプレート等が追加されます。
プロジェクトの新規作成ダイアログでテンプレートが増えてるので選択しましょう。
Azure Functionsのプロジェクトは複数のFunctionsを纏めたものという感じの扱いです。簡単にいうとAzure上でFunctionsを構成したときの状態と同じような感じです。ここにFunctionを追加していくわけですが、プロジェクトを右クリックして追加メニューからNew Azure Functionを選択すればテンプレート選択画面になり、Azureポータル上で操作するのと同じようにFunctionを追加できます。
テンプレートによって初期値が求められるので適宜入力してCreateで作成します。試しにシンプルなHttpTriggerなC#のテンプレートを選択して作成するとこんな感じでファイルが追加されます。
基本的にテンプレートはAzure上のものと同じです。C#テンプレートだとあらかじめproject.jsonが含まれてたり楽ですね。
ちなみにrun.csxなど.csxの編集ですが、基本的なもの(※細かく見れてませんけど)はインテリセンスが効きます。独自クラスぽいTraceWriter(logインスタンス)とかはインテリセンス効きません。今後に期待したいところですね。
ローカル デバッグ
デバッグはVisual Studioの通常の操作でデバッグするといいです。さてここからAzure Functions Cliの出番です。もしインストールされていなければインストールを促すダイアログが表示されます。
はいを選択すれば勝手にインストールしてくれます。ちなみにAzure Functions Cliがないとデバッグできないので注意ください。
※環境によってはファイアウォールにブロックされるので許可してあげましょう。
さて無事デバッグ実行ができますと、(UACのダイアログもでるかもしれませんが)func.exeが立ち上がってAzure Functionsが起動します。
基本的にFunctionsのホストが立ち上がる感じなので、プロジェクト内にあるFunctionが全部列挙されます。(function.jsonがなかったりするとFunction扱いしてくれませんので列挙されません)
あと最後にURLが表示されますがそのURLがFunctionのエンドポイントとなります。
※エンドポイントじゃなくて取りあえずルートに接続するとAzure Functionsのホストが起動してるというのがわかります。(Azure上のFunction Appも同様の画面見れます)
さてrun.csxに適当にブレイクポイントを貼ってコンソールに表示されてたエンドポイントに接続してみましょう。
ブレイクポイントで止まって値を確認したりステップ実行もできますね。
Func.exeのコンソールには呼び出されたこともわかります。(logで出力したりするとこちらに出力されます)
ちなみにデバッグ実行後、プロジェクトにいくつかファイルが増えます。
赤枠部分が増えたものです。secretsはAPIキーなどを格納するようのフォルダ、sampledataはAzureポータル上でDevelopするときに使われる(実行時の)初期Inputデータです。まぁAzure Functionsに詳しい方ならわかりますね。
ちなみに現状はHTTPトリガーなどで設定できる認証レベルを指定しても(既定だと例えばFunctionにしてても)デバッグ時は認証なしで接続できます。
デプロイ
デプロイはプロジェクトのコンテキストメニューから「公開」を選択してウィザードに従うだけで行えます。(WebDeployで直接発行する場合。CI連携してる場合などはここでは割愛します)
発行ウィザードから「Microsoft Azure App Service」を選択します。
Azureサブスクリプションに権限のあるユーザーでサインインすればAzure上にあるFunction Appが表示されると思うので選択します。後はウィザードに従ってデプロイしましょう。
ちなみにhost.jsonとか一緒に発行されてしまいますが無視される(たぶん)ので大丈夫です。またすでにAzure上に存在するファイルは残ってます。(WebDeployで消すように設定してなければ。たぶん。)
あとHTTPトリガーなどで使用するAPIキーは発行後自動的に生成されます。
※現状、HTTPトリガーではないトリガーなFunctionの場合、発行後にちゃんと認識してくれないようです。(発行後、Azureポータル上で一覧の更新をしてあげると良いようです)
リモート デバッグ
Visual StudioのCloud ExplorerからFunction Appを選択してデバッガーのアタッチを行えば簡単にリモートデバッグできます。
※当初はクラシックプランでないとダメだった気がしますがConsumption でもできるようになってました。
もしシンボルが読み込めないとかでデバッグできない(ブレイクポイントに止まらない)とかであればVisual Studioのオプションのデバッグのところで以下の2つのチェックを外してみてください。
- 「マイ コードのみを有効にする」
- 「元のバージョンと完全に一致するソース ファイルを必要とする」
またアタッチするのはいいけどうまく動作しないとかの場合は根気よく待つか(やたら遅いですね)、一度Azure Functionsを再起動しましょう(Azureポータル上で)
その他Tips
細かい挙動(特にFunctionsのホスト)を知りたい場合はGitHub見ましょう。
またローカル実行する際のホストの設定についてはhost.jsonを弄りますが、こちらもGitHub上のドキュメントがあります。
バインディングで接続文字列が必要なもの(Blob ストレージとか)をローカルで動作させる場合、function.jsonには接続文字列の設定名を記述して接続文字列等は appsettings.json に記述します。またAzure Storageなどローカル上でエミュレーター等が動作できる場合、そちらも使えます。
例: Blobに出力する
{ "disabled": false, "bindings": [ { "authLevel": "function", "name": "req", "type": "httpTrigger", "direction": "in" }, { "name": "res", "type": "http", "direction": "out" }, { "type": "blob", "name": "outputBlob", "path": "output/{rand-guid}.txt", "connection": "Output_STORAGE", "direction": "out" } ] }
function.json は↑こんなかんじ
appsettings.json は↓こんなかんじ
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "", "AzureWebJobsDashboard": "", "Output_STORAGE": "UseDevelopmentStorage=true" } }
もちろんちゃんとした接続文字列も使えます。
まとめ
Visual Studioでコーディングできるようになるとだいぶ楽ですね。何よりインテリセンスが使えたりデバッグができると格段に生産性が上がるかと思います。(インテリセンスは今後にさらに期待)
※一応 Microsoft Azure2 Advent Calendar 2016 の4日目の記事にしておきますね。
ピンバック: Azure Functions / Overview and Under the hood | ブチザッキ
ピンバック: Azure Update (2016.12.08) | ブチザッキ