はじめに
deno は、node.js の生みの親である Ryan Dahl 氏が開発している V8 による TypeScript ラインタイム環境です。
Deno の開発背景や特徴は下記 id:yosuke_furukawa 氏の解説記事を、サーバー アプリの作り方は公式のチュートリアルや Qiita の記事を参考にしていただくとして。
yosuke-furukawa.hatenablog.com
この記事では、この deno を Azure Web Apps で動かす試みを紹介します。
Azure Web Apps の提供形態
一口に Web Apps といっても、Azure Web Apps は(大雑把に言って) 3 つの提供形態があります。
- Windows ベースの(いわゆる) Web Apps
- 組み込み Docker イメージ ベースの App Service on Linux
- カスタム Docker イメージを使用した Web App for Containers
それぞれで、deno による Web サーバーが構築できるかを検討したり試してみました。
1. Windows ベース の Web Apps
Windows ベースの Web Apps では、以前から node.js を公式サポートしているので、同じ仕組みが使えるか調べてみました。
Windows ベース Web Apps では、node.js に限らず、どのランタイム スタックを使用しても、クライアントからのリクエストを必ず IIS で受信します。
node.js を動かす場合、IIS で受信したクライアントからのリクエストを、iisnode というモジュールと net.Server の IPC の仕組みを利用して、IIS の裏でNamed Pipe を使って待ち受けている node.js へと渡します。レスポンスはその逆方向の動きをします。
同じ仕組みをそのまま利用しようとすると、deno が Named Pipe をサポートしている必要があります。
しかしながら、deno v0.2.5 の時点では、tcp しかサポートしていないようでした。残念。
いつの日か、deno で IPC をサポートしてくれることを期待して。
2. App Service on Linux
App Service on Linux は使用可能な Docker イメージが Azure から提供されているものに限られます。
したがって、Microsoft 公式から deno のイメージが提供されない限り、App Service on Linux で deno を動かすことは難しそうです。残念。
3. Web App for Containers
Web App for Containers は、カスタム コンテナー イメージを使用することができるので、deno のカスタム コンテナー イメージを用意できれば、大抵のものは動くはずです。
なので、Web App for Containers 向けに用意した deno の Docker イメージを作成してみました。
同梱している簡単なサンプル サーバーは動作したようです。
やはり頼れるのはコンテナーです。
一応、ssh デーモンも同梱したので、Azure ポータルからの Web SSH にも対応しています。
まとめ
現時点では、Web Apps で deno を動かすには、Web App for Containers + カスタム コンテナー イメージの組み合わせしかなさそうです。
ただ、コンテナーを使うなら、Web Apps にこだわらず、仮想マシンやコンテナーサービス(ACI: Azure Container Instance)を使えばいい気もしますが。。。
deno が Named Pipe をサポートしてくれれば、Windows ベースの Web Apps でも動きそうなんですけどね。