※このエントリは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 | [2023-12-09T23:11:32.503Z] Worker process started and initialized. |
Azure Functions Core Toolsが起動したら、ブラウザでhttp://localhost:7071/api/ytnobody-hono-funcにアクセスします。以下のようなJSONが表示されましたら、無事に動作しています。
実際に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を動かすことができるようになります。