ほりひログ

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

Deno を Azure Web Apps でサクッと試す

この記事は 「Deno Advent Calendar 2019」の 16 日目の記事です。

qiita.com

はじめに

以前コチラの記事に、カスタム コンテナーを使って、Azure 上 (Web App for Containers) で Deno を動かす方法を紹介しました。

uncaughtexception.hatenablog.com

その後、いろいろトライしたので、その結果を紹介します。

まず謝罪

以前の記事でこう書きました。

App Service on Linux は使用可能な Docker イメージが Azure から提供されているものに限られます。 したがって、Microsoft 公式から Deno のイメージが提供されない限り、App Service on Linux で deno を動かすことは難しそうです。残念。

これは嘘でした。ごめんなさい🙇‍♂️
今回は、カスタム コンテナーを使用せず、もっと簡単に App Service on Linux で Deno を動かす方法をご紹介します。

改めて App Service on Linux で Deno を動かす

つい最近、職場のアドベント カレンダーに、App Service on Linux のスタートアップ スクリプトを使用して、cron を例に一時的にプログラムを追加する方法を紹介しました。

qiita.com

ちょっとした追加であれば、スタート アップ スクリプトを工夫することで、前処理の処理が可能です。

あまり重い処理は起動時間が長くなるのでお勧めしませんが、Deno はワン バイナリーで、インストールも楽チンなので、この方法が使えるか試してみました。

そして結論

カスタム コンテナーは不要です(確信)。

アプリとなる ts ファイル等一式と、Deno のインストールと ts ファイルを実行するスタートアップ スクリプトをアップロードして、"Startup Command" にアップロードしたスタートアップ スクリプトを指定することで、
コンテナー既定のスタートアップ コマンド (Node.js のイメージであれば npm start ) を無視して、スタートアップ スクリプトに記述した Deno のインストールと ts ファイルの実行をすることが可能です。

f:id:horihiro:20191215073856p:plain

JavaRuby 以外*1の公式イメージ (Blessed Images) であれば、上記の方法が使えます。

f:id:horihiro:20191215065703p:plain

動作を確認したスタートアップ スクリプトは、下記リポジトリに公開しています。

github.com

無事 Deno のインストールが完了していると、Web SSH を開いたときに、下記のような画面が出るはずです。 f:id:horihiro:20191215075943p:plain

# バージョンがちょっと古い理由は後述

注意事項

いろいろ試している中で、シングル コアの PC で Deno v0.25.0 以降を実行した場合、下記 import 文の処理段階でハング アップすることがありました。

import { serve } from "https://deno.land/std@v0.24.0/http/server.ts";

より細かいは発生条件があるかもしれませんが、少なくとも --cpuset-cpus=0 オプション付きで起動した appsvc/php:5.6-apache_20191031.7 のコンテナーで、上記の import 文を実行すると再現します。
issue も上げてあるので、そのうち修正されると期待。

github.com

なおマルチ コアの価格帯 (S2, S3, P2V2, P3V2) を使えば v0.25.0 以降も使えます。

Windows は?

Windows 版の Web Apps については、前回の記事に下記のように書きました。

同じ仕組みをそのまま利用しようとすると、deno が Named Pipe をサポートしている必要があります。

ハイ、これもウソでした。ごめんなさい🙇🙇

これは、Windows 版 Web Apps で Node.js を動かす場合に、「既定では iisnode & NamedPipe を使っている」というだけの話で、httpPlatformHandler というモジュールを使った設定ができれば、Deno のように HTTP での待ち受けでしかできなくても問題ないです。
id:shiba-yan さんの記事に web.config の設定方法が紹介されています。

blog.shibayan.jp

これを Deno に試そうと思ったら、Web Apps 上では正常に起動しませんでした😢

D:\home>D:\home\.deno\bin\deno.exe
thread 'main' panicked at 'Could not get home directory.', src\libcore\option.rs:1190:5

というわけで、issue です。

github.com

bug タグが付いたので、これも Deno 側の対応待ちですね。

まとめ

長々と書きましたが、まとめると、2019年12月15日現在、Azure Web Apps 上での Deno の動作については、

  • スタートアップ スクリプトを使えば、App Service on Linux で動作可能
    • Deno 0.25.0 以降は、マルチ コアで。
  • もちろんカスタム コンテナーを作れば、Web App for Containers で動作可能
  • Windows 版は、Named Pipe は不要っぽいけど、Deno 側の修正待ち
  • あまり「サクッと」とはいかず、結果 issue を 2 つ提出

となりました。


12/17 追記

Windows 版の問題については、(うかつな ID コールで巻き込んでしまった) しばやんさんが解決してくれました!

続きはこちら。

blog.shibayan.jp

# なお v0.25.0 以降のシングル コアでのハングアップ問題は Windows 版でも出る模様。

2020/01/03 追記

v0.25.0 以降のシングル コアでのハングアップ問題は、v0.28.0 で解決しました 🎉🎉🎉
動作も確認済みです。

deno 0.25.0 or later sometimes hangs up on single core processor. · Issue #3466 · denoland/deno · GitHub tokio?のバージョンを 0.2 にあげた?とかなんとか。

ありがとうございました。

*1:
Javacurl と apt がない or パスが通っておらずインストールできない
RubyRails プロジェクトじゃないとスタートアップ スクリプトが動作しない