ほりひログ

所属組織の製品 (Azure とか) に関連する内容が多めだけど、個人の見解であって、所属組織を代表する公式情報ではないです。

deno を Azure Web Apps で動かす試み

はじめに

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 つの提供形態があります。

  1. Windows ベースの(いわゆる) Web Apps
  2. 組み込み Docker イメージ ベースの App Service on Linux
  3. カスタム 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 へと渡します。レスポンスはその逆方向の動きをします。

github.com

同じ仕組みをそのまま利用しようとすると、deno が Named Pipe をサポートしている必要があります。
しかしながら、deno v0.2.5 の時点では、tcp しかサポートしていないようでした。残念。

deno.land

いつの日か、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 イメージを作成してみました。

github.com

同梱している簡単なサンプル サーバーは動作したようです。
やはり頼れるのはコンテナーです。

一応、ssh デーモンも同梱したので、Azure ポータルからの Web SSH にも対応しています。

まとめ

現時点では、Web Apps で deno を動かすには、Web App for Containers + カスタム コンテナー イメージの組み合わせしかなさそうです。
ただ、コンテナーを使うなら、Web Apps にこだわらず、仮想マシンやコンテナーサービス(ACI: Azure Container Instance)を使えばいい気もしますが。。。

deno が Named Pipe をサポートしてくれれば、Windows ベースの Web Apps でも動きそうなんですけどね。