ほりひログ

所属組織の製品 (Azure とか) に関連する内容が多めだけど、個人の見解であって、所属組織を代表する公式情報ではないです。

Azure Functions Node.js Framework v4 で作った関数を Azure 上にデプロイする

以前のエントリーで「新しいプログラミング モデル」と書いてたもの、どうやら 「Azure Functions Node.js Framework v4」というらしい。

github.com

長いので以下 V4 と書く。

Visual Studio Code の Azure Functions 拡張機能が、V4 用のテンプレートを作ってくれるようになったので試してみた。

プロジェクト作成手順

  1. まず Azure Functions 拡張機能Visual Studio Code に入れる。
    バージョンが1.10.0 以降になっているか確認すること。ちなみに 2023/2/9 現在、最新バージョンは 1.10.1。

  2. 次に設定 (Ctrl + ,) から Azure Functions: Show Node Programming Model を探してチェックを入れる。

  3. 設定が終わったら、これまで通り、空っぽのディレクトリで Azure Functions のプロジェクトを作成する。

  4. ウィザードの途中で「プログラミング モデルを選べ」と出てくるので Model V4 (Preview) を選択する*1

あとは関数も一緒に作るか、とか出てくるがそこは今までと同じなので省略。

すると、こういうファイル構成になる。
今回は TypeScript を選択し、HTTP トリガーの関数を一緒に作ってみた。

以前のエントリーで書いた通り、関数 httpTrigger1.ts があるディレクトリに function.json はない。
さらに、関数のディレクトリ自体も package.jsonmain の値で決まるので、どこにあってもいい。

TypeScript のテンプレートの場合、初期構成と tsconfig.json 内の設定やらが相まって、dist/src/functions 以下の JavaScript ファイルをインポートすることになっている。

関数コードの内容も、以前のモデルでは最低限関数を export するだけだったが、V4 では定義した関数とトリガー/バインディングをセットで app というオブジェクトに登録する処理が追加された。
V4 ではこの app への登録が重要で各関数を export しておく必要はない((けど、単体テストとかを考えると export しておいた方がよさそう))。

Azure Functions にデプロイしてみる

と、ローカルでのファイル構成の確認はここまでにして、さっそく Azure 上にデプロイしてみる。

まずは Function App リソースを作る。

ランタイムは当然 Node.js 、バージョンは 18 LTS。
OS もプランもどれでもいいはず。

出来上がったら Visual Studio Code からも確認。
作ったリソースを右クリックして、おもむろに Deploy to Function App... を実行。

npm install やら tsc といった前処理が動いて Azure 上へのデプロイも完了!

と思いきやログの最後が気になる。

No HTTP triggers found.

だって。 HTTP トリガー関数しか作ってないのにそれすらないとは。

Azure ポータルから見ても、確かにない。

V4 として認識されてない感じ。

冒頭のリンク先を見直してみると、Setup の最後にズバリ書いてあった。

なるほど、確かにローカルの local.settings.json (下図右) には AzureWebJobsFeatureFlags がある。
けど、デプロイしたての Function App (下図左) にはなかった。

なので、作ってみる。
Upload local settings...local.settings.json の内容をアップロードできるの便利。

できた。

関数も認識された。

テンプレ通りの関数なので動作結果は割愛。

聞いてみた

デプロイ先の Function App に AzureWebJobsFeatureFlags がなかったら何らかのメッセージが欲しいと思ったので、Azure Functions 拡張機能リポジトリに issue を立てたら、

そのフラグ、ホスト側の対応でもうすぐいらなくなるから。

とコメントがついて、わずか 1 時間で閉じられた。
自分が立てた issue で最速クローズかもしれない。

github.com

即レスもらえたのはいいことだ。
けど Teams のチャットかメールの方がよかったかもと思った。

(2/11 追記) Azure Functions Host の v4.15.2 で👆の「ホスト側の対応」が実施されたみたいなので、これが Azure 上でデプロイされれ AzureWebJobsFeatureFlags のくだりは不要になるはず。

*1:V4 なのは Model なのか Framework なのか。。。