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ランタイムの普及を目的として無料で一定数使えます。
- 10万リクエスト/日 まで無料
- HTTPSにも対応(後述
- カスタムドメインにも対応
対象のコードを書く
mkdir denotime
cd denotime
deno init
vi main.ts
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
時間がかってくればローカル動作確認はOK
起動するポートはなんでもいい
一番疑問に思ったのは公式にかかれてあるサンプルコードはport8000を開けているのですが
特に「8000を指定してね」という記述もありません。上記のコードをデプロイしてhttpsのport443にうまくつながるのか不安でしたが、ポートがあいていれば自動的にそこにフォワードするようになっているようです。
なので管理画面でポートを指定する必要もありませんでした。(謎便利機能)
GitHubにレポジトリをつくっておく
プライベートでもパブリックでもOK
Deno Deployにサインアップ
ここは画面に従うだけなので省略 GitHubアカウントが必要
ここで自動的にGitHubに連携される
Deno Deployのプロジェクトを作成
すでにGitHubにソースがある場合は右を選ぶ
対象の組織やアカウントから連携するレポジトリを選択する
デプロイ方法を決める
デプロイ時にGitHub Actionを実行できるが、シンプルなのは何もしない左のほう。
左のほうを選ぶとmainブランチにコミットしたときに同時にリリースされる(便利)
起動対象となるWEBアプリケーションのソースファイルを選ぶ
起動に必要なライブラリのインストール
Advanced Setupを選ぶとデプロイされる
リリース完了
自動で deno.devドメインに2つわりあてがされる
上記であれば
などでアクセスが可能
長い名前のほうはリビジョンにひも付きリリースするたびに毎回変わる
動作確認
ブラウザで開く
デプロイできました!
ドメインを変更する (.deno.devドメイン版)
デフォルトではランダムななにかの単語が割り当てられますが
サブドメイン名は好きな名前に変更できます
画面のSettingsに移動しプロジェクト名をつけます
ここではsample-zikanとしました
Overview画面に戻ると
ドメイン名が変わっているのがわかります
sample-zikan.deno.dev/time でアクセスが可能になりました
カスタムドメインに変更する
ここが一番便利と感じた点
カスタムドメイン変更する際ガイドがしっかりしていました
settingsのDomainsを押す
ここからは私が実際に運用しているプロジェクトのほうの画面で紹介します
自分が持っているドメイン名をまず入力します
なんでも入力できてしまうため「本当にこれで設定できんのか?」という不安になるインターフェースでもありますが
やってみるとシンプルイズベストでかなり快適でした。
そうするとPENDING状態になるためSetupボタンを押します
そうすると契約しているドメイン会社の設定画面に入れるべき値のガイドがでてきます。
例えばお名前.comの画面にはいってAレコード、AAAAレコード、検証用のCNAMEを設定して
DNSの反映まで数分待ちます。お名前.comであれば3〜5分で反映されるので
反映できたらValidateボタンを押します。
カスタムドメインに対してSSL証明書の自動設定 (これも無料
ドメイン検証が終わったら上記のようなメッセージになり
今度はSSL証明書を設定してくれ的なメッセージになります。
初期画面では「いったいどこでSSL証明書設定すんだ」と思ったのですがチュートリアル形式で出現する仕様でした。
自分でSSL証明書をもっている場合はアップロード、そうでない場合は左で自動生成(Let's Encrypt)してくれます。超絶便利です。
成功すると緑マークがつきます
ここまででデプロイは終了です
お疲れ様でした。
たぶん慣れれば10分で1サービスのリリースができます。
その他便利機能1 リアルタイムログ
管理画面からリアルタイムログが閲覧できます
- どのリージョンで起動しているか
- いつ起動したか
- アプリケーションにしこんでいるログ(console.log)
がみれます
実際にGCPのアジヤやヨーロッパで起動しているのが確認できます
ログからわかることは常時稼働ではないということ
数分単位で起動しているのがわかるため常時稼働しているタイプではなくサーバーレスタイプでリクエストがあったときに起動するようになっているのがわかります。またリージョンもバラバラなので、アプリケーションにメモリキャッシュするようなコードは意味をなさないので避ける必要があります。
リリースリビジョンを保持して過去のものが起動できる
Deployments画面にいくとリリース履歴(今回の場合mainブランチへのコミットと同等)が見えて
リンクを押すと過去のリビジョンでのページの見え方が確認できます。
まとめ
無料でWEBアプリケーションをデプロイできるサービスとしては数少ない1つだと思いました。
あくまでもDenoが普及するまでのサービスタイムだとは思いますが、簡単にデプロイできる工夫も考えられており完動しました。サクっとAPIサービスを作りたい場合や、コストをかけたくないホビー用途、プログラミング学習+講座の場合の選択肢の一つになりえるのではないでしょうか。