Azure Functions Core Tools v3.x を使ってローカル関数プロジェクト開発をする方法

7 min読了の目安(約4700字TECH技術記事

はじめに

Azure Functions のローカル関数プロジェクトを利用した開発方法については、公式サイトの「Azure Functions Core Tools の操作」で詳しく紹介されています。

このページの通り進めることで Azure Functions Core Tools のバージョンが v2.x ではうまく動作させることが可能となっていますが、v3.x ではうまく動作しません。
// Node.js 13.x 以降を利用している場合に限る

また、Azure Functions は F# に対応しているにも関わらず、Azure Functions Core Toolsを使って F# のローカル関数プロジェクトを作成することができません

そこで今回は (1) Azure Functions Core Toolsv3.x を利用 しつつ、(2) F# でローカル関数プロジェクト開発するための方法 について紹介していきたいと思います。

前提条件

筆者の動作環境は以下のようになっています。

名称 バージョン
Windows 10 64bit 1903
Visual Studio Code 1.46.1
.NET Core 3.1.301
node 14.1.0
npm 6.14.5

バージョンが更新されることで、今回の対応が不要になる可能性が高まると思います。

Azure Functions Core Tools v3.x の導入

以下のコマンドを利用して Azure Functions Core Tools v3.x をインストールします。

npm install -g azure-functions-core-tools@3 --unsafe-perm true

すると以下のようにダウンロードが完了していないにも関わらず、インストール処理が終了してしまうと思います。

# <中略>
attempting to GET "https://functionscdn.azureedge.net/public/3.0.2534/Azure.Functions.Cli.win-x64.3.0.2534.zip"
[------------------] Downloading Azure Functions Core Tools+ azure-functions-core-tools@3.0.2534
updated 6 packages in 1.289s

そこで以下のコマンドを実行し、azure-functions-core-tools に unzipper@0.10.7 をインストールします。

cd $env:AppData/npm/node_modules/azure-functions-core-tools
npm install unzipper@0.10.7
node .\lib\install.js

参考 Issue: Any 'func' command does not work #1804

すると無事 Azure Functions Core Tools v3.x がインストールされます。
これでめでたく func コマンドが利用できるようになりました。

F# でローカル関数プロジェクトを作成する

通常、func init コマンドを利用することでローカル関数プロジェクトを作成することができます。
2020/06/23 現在、C# / Java / JavaScript / TypeScript / PowerShell / Python の6言語についてはオプションを指定することでプロジェクトを即座に作成することができます。

そう、F# を除くすべての言語が対応しているのです!!
// Microsoft、そういうトコやぞ

では F# はどうすればよいのかというと、仕方がないので C# のプロジェクトを修正するしかありません。

まずは以下のコマンドでローカル関数プロジェクトを作成します。

func init SampleFuncProj

すると以下のような選択肢が現れるので、dotnet を選択します。
image.png

実行が完了するとローカル関数プロジェクトができあがります。
これを VSCode で起動します。

code ./SampleFuncProj

VSCode 上では次のような構成になっていると思います。
image.png

次に SampleFuncProj .csproj を SampleFuncProj .fsproj にリネームします。
そして SampleFuncProj.fsproj 内の以下の箇所を書き換えます。

<!-- <None Update="host.json"> --> 10行目あたりのコード
     <None Include="host.json">

参考 Issue: Host.json file in missing #1963

修正後は以下のようになっていると思います。
image.png

これで F# 用のローカル関数プロジェクトが完成しました!

おまけ:F# のローカル関数プロジェクトで Hello, World してみる

fsproj を Visual Studio で開くことで C# と同じように開発できるのですが、今回は VSCode を利用しての開発方法について紹介しておきます。
hello.fs というファイルを作成し、SampleFuncProj.fsproj を以下のように修正しています。
image.png

※ファイルの追加については ionide を利用することで、fsproj に対象ファイルの情報が自動で反映されるのでそちらを利用する方が良いと思います。

次に hello.fs を以下のようにします。

module Hello

open Microsoft.AspNetCore.Mvc
open Microsoft.Azure.WebJobs
open Microsoft.Azure.WebJobs.Extensions.Http
open Microsoft.AspNetCore.Http

[<FunctionName("hello")>]
let run ([<HttpTrigger(AuthorizationLevel.Function, "post", "get", Route = null)>] req: HttpRequest) =
    OkObjectResult "Hello, World" :> ActionResult

最後に以下のコマンドを実行することで、Azure Functions をローカル実行することができます。

func start --build

以下のエンドポイントにアクセスすることで実行することができます。
image.png
image.png

おまけのおまけ

余談ですが VSCode に Azure Functions の拡張機能を入れているとローカル関数プロジェクトを開いたときに以下のようなメッセージが表示されます。
image.png

これで Yes を選択してあげると、F5 でデバッグ実行が可能となります。

もちろんブレークポイントを設定してステップ実行をすることも可能です。

もし VSCode で Azure Functions の開発をする際には是非利用してみてください。

【参考画像】
image.png