Amazon Linux 2 で Deno を動かす

Amazon Linux 2 で Nginx を介して Deno で動いているアプリケーションをうごかしてみたので、メモとして残しておきます。

前提

  • Amazon Linux 2 のインスタンスを作ってある
  • インバウンドルールで HTTP を許可してある

準備

以下の操作は、root アカウントで実施。

Nginx 導入

1
2
3
4
5
$ amazon-linux-extras install nginx1.12
$ which nginx
/usr/sbin/nginx

$ systemctl start nginx

/etc/nginx.conf を編集

Deno で unix ドメインソケットを使ってnginxと連携(失敗)で書いた /etc/nginx.conf の編集を実施。

/etc/conf.d/deno-app.conf を作成

/etc/conf.d/deno-app.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
upstream deno_app_port {
server localhost:3000;
}

server {
listen 80 default_server;
server_name _;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

root /root/testapp/public;

location / {
try_files $uri @deno_app;
}

location @deno_app {
proxy_pass http://deno_app_port;
}
}

設定再読み込み

1
nginx -s reload

Deno インストール

1
2
3
4
5
6
7
8
9
$ curl -fsSL https://deno.land/x/install/install.sh | sh
######################################################################## 100.0%
Archive: /root/.deno/bin/deno.zip
inflating: /root/.deno/bin/deno
Deno was installed successfully to /root/.deno/bin/deno
Manually add the directory to your $HOME/.bash_profile (or similar)
export DENO_INSTALL="/home/ec2-user/.deno"
export PATH="$DENO_INSTALL/bin:$PATH"
Run '/root/.deno/bin/deno --help' to get started

~/.bash_profile に以下を追記。

1
2
export DENO_INSTALL="/home/ec2-user/.deno"
export PATH="$DENO_INSTALL/bin:$PATH"

以下コマンドで、再読み込み。

1
2
3
$ source ~/.bash_profile
$ deno -V
deno 1.15.2

アプリケーション

app.ts を作成。

app.ts
1
2
3
4
5
import { listenAndServe } from "https://deno.land/std@0.112.0/http/server.ts";

listenAndServe(":3000", () => new Response("Hello World\n"));

console.log("http://localhost:3000/");

実行

1
$ deno run --allow-net app.ts

ここまで実行して、
EC2インスタンスのパブリックホスト名でアクセスしてみると、Hello world が返ってきます。

Ultra を動かしてみる

今度は Ultra を使ってみます。
環境設定はultra-init を使います。

1
2
3
4
5
6
deno run --allow-net --allow-write https://deno.land/x/ultra_init@0.0.1/cli.ts
# << app

cd app
make dev
# デフォルトで、3000番ポートで立ち上がる

ここまで実行して、
EC2インスタンスのパブリックホスト名でアクセスしてみると、Hello world の表示が返ってきます。

Unix ドメインソケットは、現在はどうなった?

Deno で unix ドメインソケットを使ってnginxと連携(失敗) にて以前確認しました。
deno 1.15.2 でも確認してみます。

socket.ts
1
2
3
4
5
6
7
8
9
10
const listener = await Deno.listen({
path: "tmp/deno.sock",
transport: "unix",
});

const conn = await listener.accept();

for await (const chunk of Deno.iter(conn)) {
console.log(new TextDecoder().decode(chunk));
}

こちらを実行してみると、リクエストの内容を拾いはできますが、今回はプログラムが終了するようになっていました。

1
2
3
4
5
6
7
8
9
10
11
12
$ deno run --unstable --allow-net --allow-read --allow-write app.ts
Check file:///root/app/app.ts
GET / HTTP/1.0
Host: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
X-Real-IP: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
X-Forwarded-Host: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
X-Forwarded-Server: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
X-Forwarded-For: XXXXXXXXXXXXXXXXXXXXXXXXXXX
Connection: close
Cache-Control: max-age=0
DNT: 1
# 以下記載が続く

また std/httpで提供されているライブラリには、socket の対応が無いので、サーバーアプリにまで繋げられない状況でした。


Ultra の実行サーバーとして、EC2を使えることを確認できました。
(まぁ、できるだろうという話ではあるのですが。)

ではでは。