無料で10万リクエスト/日まで使えるDeno Deployでのリリースが超カンタンだったので使用感紹介

EC2でGo言語＋RDS:MySQLでたてていた放映しているTVアニメ情報を返すAnime APIサーバーをコストダウンを目的としてDeno Deployに移植しました。


Go言語
https://github.com/Project-ShangriLa/anime_api_golang
↓
Deno版
https://github.com/Project-ShangriLa/anime_api_deno


今回は言語の話にはふれずDeno Deployが超カンタンだったのに衝撃をうけたのでまったく使ったことがない人向けにイメージがつくように紹介してみます。

※本文にでてくるURLはテスト用のものなので後に削除されます



# Deno Deployとは

Deno(TypeScript)で書いたWEBアプリケーションをデプロイできるサービスです。
Vercelなどと同じくDenoランタイムの普及を目的として無料で一定数使えます。

https://deno.com/deploy/pricing

![スクリーンショット 2023-06-12 15.49.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/826320dc-5646-20a0-b708-ba57ec094f6c.png)

- 10万リクエスト/日　まで無料
- HTTPSにも対応（後述
- カスタムドメインにも対応

# 対象のコードを書く

```
mkdir denotime
cd denotime
deno init
vi main.ts
```

```typescript
import {
  Application,
  Router,
} from "https://deno.land/x/oak@v12.5.0/mod.ts";

// アプリケーションを起動する
async function startApp() {
  const app = new Application();
  const router = new Router();
  // 時刻を返すエンドポイントの登録
  router.get("/time", (ctx) => {
    const now = new Date(); // 現在の時刻を取得
    ctx.response.body = { "time": now.toISOString() }; // JSON形式で現在の時刻を返す
  })
  // ルートを登録
  app.use(router.routes());
  app.use(router.allowedMethods());

  // アプリケーションを起動
  await app.listen({ port: 8001 });
}

// アプリケーションの起動を開始
startApp();

```

# ローカルで動作確認

```
/denotime:deno task dev
Task dev deno run --watch main.ts   
Watcher Process started.
├ Requested by `Deno.listen()` API.   
├ Run again with --allow-net to bypass this prompt.
└ Allow? [y/n/A] (y = yes, allow; n = no, deny; A = allow all net permissions)  <-listen許可を求められるのでyをおす
✅ Granted net access to "0.0.0.0:8001".
```



ブラウザでひらく　http://localhost:8001/time

![スクリーンショット 2023-06-12 16.14.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/d2733a67-6393-cf09-60ca-84204ce31120.png)

時間がかってくればローカル動作確認はOK

# 起動するポートはなんでもいい

一番疑問に思ったのは公式にかかれてあるサンプルコードはport8000を開けているのですが
特に「８０００を指定してね」という記述もありません。上記のコードをデプロイしてhttpsのport443にうまくつながるのか不安でしたが、ポートがあいていれば自動的にそこにフォワードするようになっているようです。
なので管理画面でポートを指定する必要もありませんでした。（謎便利機能）


# GitHubにレポジトリをつくっておく

プライベートでもパブリックでもOK

https://github.com/AKB428/deno_deploy_sample

# Deno Deployにサインアップ

ここは画面に従うだけなので省略 GitHubアカウントが必要
ここで自動的にGitHubに連携される


# Deno Deployのプロジェクトを作成

![スクリーンショット 2023-06-12 16.19.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/0810ff59-8187-d4d7-46c0-163f612df3fb.png)

![スクリーンショット 2023-06-12 16.20.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/8b585fef-40b1-eb87-a754-19bf3222ae9c.png)


 すでにGitHubにソースがある場合は右を選ぶ

## 対象の組織やアカウントから連携するレポジトリを選択する

![スクリーンショット 2023-06-12 16.21.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/7b0278ed-7855-33ec-4cda-4a2a5e6e4367.png)

## デプロイ方法を決める

![スクリーンショット 2023-06-12 16.24.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/a1b4ad30-0f8b-6e5b-26a2-62f01dd08af8.png)


デプロイ時にGitHub Actionを実行できるが、シンプルなのは何もしない左のほう。
左のほうを選ぶと**mainブランチにコミットしたときに同時にリリースされる（便利）**


## 起動対象となるWEBアプリケーションのソースファイルを選ぶ

 ![スクリーンショット 2023-06-12 16.26.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/a850e6e9-61e8-19ea-b6e4-a9f2536f252f.png)


## 起動に必要なライブラリのインストール 

Advanced Setupを選ぶとデプロイされる 

![スクリーンショット 2023-06-12 16.27.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/30d72cf0-d767-8e4f-4bd6-bf0ffa26f881.png)


## リリース完了

![スクリーンショット 2023-06-12 16.29.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/4171d60b-b21a-2046-6393-ad7a28034c3f.png)


自動で deno.devドメインに２つわりあてがされる
上記であれば

https://dirty-spider-86.deno.dev/time

などでアクセスが可能

長い名前のほうはリビジョンにひも付きリリースするたびに毎回変わる


## 動作確認

ブラウザで開く 

![スクリーンショット 2023-06-12 16.31.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/1db32e02-784e-6602-6ff5-a6b9484acf18.png)

デプロイできました！


## ドメインを変更する (.deno.devドメイン版)

デフォルトではランダムななにかの単語が割り当てられますが
サブドメイン名は好きな名前に変更できます
画面のSettingsに移動しプロジェクト名をつけます

![スクリーンショット 2023-06-12 16.35.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/139ff86c-3fa3-b5ff-e822-db0b7061c4ed.png)


ここではsample-zikanとしました

Overview画面に戻ると
ドメイン名が変わっているのがわかります

sample-zikan.deno.dev/time でアクセスが可能になりました

![スクリーンショット 2023-06-12 16.37.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/ea8159d3-a14d-b9f5-df98-f03322d15ecf.png)


![スクリーンショット 2023-06-12 16.37.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/a552c39a-867e-9ae7-2050-1c6cc7450ba5.png)

## カスタムドメインに変更する

ここが一番便利と感じた点
カスタムドメイン変更する際ガイドがしっかりしていました


![スクリーンショット 2023-06-12 16.39.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/d1419770-4390-2980-4fa4-1ebf2baf1d9d.png)


settingsのDomainsを押す

ここからは私が実際に運用しているプロジェクトのほうの画面で紹介します



自分が持っているドメイン名をまず入力します
なんでも入力できてしまうため「本当にこれで設定できんのか？」という不安になるインターフェースでもありますが
やってみるとシンプルイズベストでかなり快適でした。


![スクリーンショット 2023-06-11 14.08.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/81137277-c0d2-32d6-febc-d178097d0a08.png)


そうするとPENDING状態になるためSetupボタンを押します


![スクリーンショット 2023-06-11 14.08.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/331e0588-b384-408e-062a-555180ba0bfd.png)


そうすると契約しているドメイン会社の設定画面に入れるべき値のガイドがでてきます。
例えばお名前.comの画面にはいってAレコード、AAAAレコード、検証用のCNAMEを設定して
DNSの反映まで数分待ちます。お名前.comであれば３〜5分で反映されるので
反映できたらValidateボタンを押します。

![スクリーンショット 2023-06-11 14.18.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/8cf11ea1-c407-e1f4-ff5b-404129c0c5a3.png)

# カスタムドメインに対してSSL証明書の自動設定 (これも無料

ドメイン検証が終わったら上記のようなメッセージになり
今度はSSL証明書を設定してくれ的なメッセージになります。
初期画面では「いったいどこでSSL証明書設定すんだ」と思ったのですがチュートリアル形式で出現する仕様でした。
自分でSSL証明書をもっている場合はアップロード、そうでない場合は左で**自動生成(Let's Encrypt)してくれます。超絶便利**です。

![スクリーンショット 2023-06-11 14.18.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/d3d820c8-b238-f9eb-d456-c1d9fc10cfea.png)


成功すると緑マークがつきます

![スクリーンショット 2023-06-11 14.19.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/af96f5ea-c67c-d8e9-f8a0-aa8bdbc32bd0.png)


ここまででデプロイは終了です
お疲れ様でした。
たぶん慣れれば10分で１サービスのリリースができます。



# その他便利機能1 リアルタイムログ

管理画面からリアルタイムログが閲覧できます

- どのリージョンで起動しているか
- いつ起動したか
- アプリケーションにしこんでいるログ(console.log)

がみれます
実際にGCPのアジヤやヨーロッパで起動しているのが確認できます

![スクリーンショット 2023-06-12 16.56.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/efc5d753-fbbe-8c8d-677b-a19198c04214.png)

![スクリーンショット 2023-06-12 16.56.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/7e7cc69c-bab5-31f7-baf7-a82fa82b0f09.png)

## ログからわかることは常時稼働ではないということ

数分単位で起動しているのがわかるため常時稼働しているタイプではなくサーバーレスタイプでリクエストがあったときに起動するようになっているのがわかります。またリージョンもバラバラなので、アプリケーションにメモリキャッシュするようなコードは意味をなさないので避ける必要があります。

## リリースリビジョンを保持して過去のものが起動できる

Deployments画面にいくとリリース履歴（今回の場合mainブランチへのコミットと同等）が見えて
リンクを押すと過去のリビジョンでのページの見え方が確認できます。


![スクリーンショット 2023-06-12 16.59.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36931/8e5edfaf-3cba-f170-081a-f8c517729bf5.png)


# まとめ

無料でWEBアプリケーションをデプロイできるサービスとしては数少ない１つだと思いました。
あくまでもDenoが普及するまでのサービスタイムだとは思いますが、簡単にデプロイできる工夫も考えられており完動しました。サクっとAPIサービスを作りたい場合や、コストをかけたくないホビー用途、プログラミング学習＋講座の場合の選択肢の一つになりえるのではないでしょうか。