Azure FunctionsをVSCodeからデプロイする際、files.excludeで指定したファイルがデプロイ対象から除外される

新しいプロジェクトの一環で、Azure FunctionsをVisual Studio Codeで開発しているが、デプロイしても関数が認識されない事態が発生。

めちゃくちゃハマったのでメモ。

環境

Azure Functions Core Tools v4.0.6280、VSCode v1.94.2、VSCodeのAzure Functions拡張機能v1.15.4。

Azure Functionsのランタイムバージョンはv4.36.0.23246だが、クライアント側の問題なので関係ない。

問題

Azure FunctionsをVSCodeで開発し始めた。言語はTypeScriptを使用。

プロジェクト作成やVSCode上でのデバッグ、デプロイパイプラインの作成など、一通り検証が済んだため本格的な開発に入った。

しかし、いざAzureにデプロイすると、デプロイは成功するが関数が反映されない。コマンドパレットから「Azure Functions: Execute Function Now」しても「No functions found.」となる。

調査

F5でのローカルデバッグでは関数が動き、デプロイも成功しているので、デプロイ時にアップロードされるZIPファイルに問題があるのではと考えた。

Azureポータルの関数アプリからデプロイ先の関数を選択し、「概要」の「アプリ コンテンツのダウンロード」から、アップロードされたZIPファイルをダウンロードできる。

ZIPファイルの内容を確認すると、distおよびnode_modulesディレクトリが含まれていなかった。これらは本格的に開発を開始した段階で、 .vscode/settings.jsonfiles.exclude に指定し、VSCodeエクスプローラーで非表示としていた。

{
  ...
  "files.exclude": {
    "dist": true,
    "node_modules": true
  },
  ...

files.exclude からdistおよびnode_modulesの記述を削除し、デプロイを実行すると、ZIPファイルのサイズが増加。関数が認識され、実行可能となった。ZIPファイルの内容も確認したが、両ディレクトリとも含まれていた。

対応

issueがあるだろうと思い、Azure Functions for Visual Studio Codeのissueを検索。

似たものはあったが、こちらは .funcignore ファイルが存在しない場合、 files.exclude で指定したファイルがZIPファイルから除外されるというもの。

github.com

同じ原因のissueはなさそう。 .funcignore!**/dist などの指定を追加してみたが変わらず。

結局、 .vscode/settings.json から files.exclude の記述を削除して対応した。

また、 files.exclude の代わりに files.readonlyInclude および search.exclude に指定し、読み取り専用および検索対象外にしておく。

{
  ...
  "files.exclude": {
  },
  "files.readonlyInclude": {
    "dist/**/*": true,
    "node_modules/**/*": true
  },
  "search.exclude": {
    "dist/**/*": true,
    "node_modules/**/*": true
  },
  ...

振り返り

今回はTypeScriptの場合だが、JavaScriptでnode_modulesを非表示にしたり、コンパイルが必要な言語で出力ディレクトリを非表示にしたりするので、他の言語でも発生すると思われる。

適当なプロジェクト設定で進めていた検証時は動き、検証終わってきっちりプロジェクト設定したら動かなくなるという罠。

ZIPファイル化するときに、 files.exclude の設定を反映するか選択できるようになればいいんだが。