HonoをAzure Functionsで動かす

※このエントリはHono Advent Calendar 2023の10日目の記事です。

Azure Functionsとは

Azure Functionsは、MicrosoftがAzure上で提供する、サーバーレスな関数を作成するためのサービスです。Azure Functionsは、以下のような特徴があります。

サーバーレス

Azure Functionsは、サーバーレスなサービスです。サーバーレスとは、サーバーを意識せずに、コードを実行できることを指します。Azure Functionsでは、コードを実行するためのサーバーを意識する必要がありません。また、コードを実行するためのサーバーを自分で用意する必要もありません。

イベント駆動

Azure Functionsは、イベント駆動なサービスです。Azure Functionsでは、以下のようなイベントをトリガーに、コードを実行することができます。

  • HTTPリクエスト
  • メッセージキュー
  • データベースの変更
  • タイマー

今回はHTTPリクエストをトリガーにコードを実行する方法となります。

言語の選択肢が豊富

Azure Functionsでは、以下の言語を利用して、コードを実行することができます。

  • C#
  • Java
  • JavaScript
  • TypeScript
  • PowerShell
  • Python

その他にも、カスタムハンドラーDockerコンテナ を利用して、さらに多くの言語を利用することができます。

HonoをAzure Functionsで動かす

まずAzure Functions Core Toolsを利用して、ローカルな環境でHonoをAzure Functionsで動かしてみます。

今回はすぐに動作を試せるように、サンプルを使いましょう。サンプルはこちらで公開しています。

Dev Containerで開発環境を構築する

まずは、開発環境を構築します。開発環境はDev Containerで構築します。Dev Containerという拡張機能を利用しますので、Visual Studio CodeにDev Containerをインストールしてください。

次に、Visual Studio Codeで、ytnobody-hono-on-azure-functions-prototypeを開きます。コマンドパレットを開き、Remote-Containers: Reopen in Containerを選択します。すると、Dev Containerが起動します。初回は起動までに結構な時間がかかります。

Dev Containerが起動したら、以下のコマンドを実行して、依存関係をインストールします。

1
npm install

一緒に azure-functions-core-tools もインストールされます。これがAzure Functions Core Toolsです。

Azure Functions Core Toolsを起動して動作確認する

Azure Functions Core Toolsを起動して、動作確認をします。以下のコマンドを実行します。

1
npm run start

このコマンドでビルドも行われ、Azure Functions Core Toolsが起動します。

以下のようなログが出力されましたら、Azure Functions Core Toolsが無事に起動しています。

1
2
3
4
5
6
7
8
[2023-12-09T23:11:32.503Z] Worker process started and initialized.

Functions:

ytnobody-hono-func: [GET,POST] http://localhost:7071/api/ytnobody-hono-func

For detailed output, run func with --verbose flag.
[2023-12-09T23:11:36.744Z] Host lock lease acquired by instance ID '000000000000000000000000E7F5F683'.

Azure Functions Core Toolsが起動したら、ブラウザでhttp://localhost:7071/api/ytnobody-hono-funcにアクセスします。以下のようなJSONが表示されましたら、無事に動作しています。

Alt text

実際にAzure Funtionsでも動作した!

一応実環境でも同じように動作するか確認してみました。以下のURLにアクセスしてみてください(そのうち消します)。

https://ytnobody-hono-on-azure-functions-prototype.azurewebsites.net/api/ytnobody-hono-func

POSTメソッドでJSONを送ると、そのデータが含まれたJSONが返ってきます。

この方法の制約

Honoでアプリケーションを開発する際、複数のハンドラーを実装することが多いでしょう。つまり、 GET /POST /item に対応したいというように、複数のエンドポイントを実装しますよね、という話です。

ところが、Azure FunctionsのHTTP Triggerでは、1つの関数に対して1つのエンドポイントしか設定できません。つまり、 GET /POST /item に対応するためには、2つの関数アプリを作成する必要があります。

また、Azure FunctionsのHTTP Triggerでは、function.jsonというファイルに、エンドポイントの設定を記述します。ここにHTTPメソッドを指定するため、Hono側でHTTPメソッドの指定をしたとしても、Function.jsonの設定が優先されてしまいます。

そのため、Honoアプリケーション側で指定するHTTPメソッドは基本的にはallを指定することになるでしょう。

Hono coreへのPull Request

Hono coreに、今回作成したAdapterを含むPull Requestを送りました。まだDraftの状態ですが、以下のURLから確認できます。

https://github.com/honojs/hono/pull/1797

もうすこしブラッシュアップして、マージできるようにしたいと思います。

もう一つの方法:Docker on Azure Functions

Azure Functionsでは、Dockerコンテナを利用して、さらに多くの言語を利用することができます。これを利用すると、Honoをそのまま動かすことができます。

Dockerコンテナを利用する方法は、以下のURLに詳しく書かれています。

https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-function-linux-custom-image

おわりに

Azure FunctionsでHonoを動かす方法を紹介しました。Azure Functionsは、サーバーレスなサービスで、イベント駆動なサービスです。TypeScriptにも対応しており、nodeもv18が使える状態でしたので、Honoを動かすことができます。

また、Azure Functionsで動作するように、Hono coreにもPull Requestを送りました。ブラッシュアップの末にこれがマージされれば、制約はありますがAzure FunctionsでHonoを動かすことができるようになります。