../encore

Encore freefordevシリーズ1

お金がない!! ということでfreefordevを見て試していくシリーズを書く。 第一弾は Paas のEncore

Encore とは

ホームページには

Encore is the Development Platform for building event-driven and distributed systems. Move faster with purpose-built local dev tools and DevOps automation for AWS/GCP.

と書いてある。訳すとこんな感じ。

Encore はイベント駆動な分散システムを開発するためのプラットフォームです。専用のローカルな開発ツールと AWS/GCP のための DevOps 自動化でもっと速く

その下には

iwr https://encore.dev/install.ps1 | iex

とある。

試す

Quick startに沿って進めたい。 上のワンライナーを Powershell で実行する。

そのあと

encore app create

を実行する。そうするとアカウントを作るか聞かれて、そのあと Go か TS かを選ばされる。 Go は全く使えないのに対し、TS は殆ど使えないので TS で進める。

正直、この時点で刺さらないことは結構確定しているので終ってもいいが、Encore の日本語情報が無いので続ける

テンプレートは Typescript の Hello world(Simple REST API という名前になっていた)を選んだ。 hello/hello.tsを見る。コメントを除くと以下のようになっている。

import { api } from "encore.dev/api";

export const get = api(
  { expose: true, method: "GET", path: "/hello/:name" },
  async ({ name }: { name: string }): Promise<Response> => {
    const msg = `Hello ${name}!`;
    return { message: msg };
  }
);

interface Response {
  message: string;
}

比較的分かりやすい。getというパブリックな関数を定義している。 非同期の無名関数と API の情報を Encore の SDK の api 関数に投げると API を登録できるようだ。 実行するには

encore run

を実行する。そうすると開発ツールと API のエンドポイントがローカルで立ちあがる。

Encoreのローカルの開発ダッシュボード。左側(画面の1/5程度)は黒く、右側は白い。右側の左側には作ったAPIが並んでいる。右側の右側にはTRACEと書かれておりログが見れる。
Encoreのダッシュボード
encore runを実行してコマンドの結果が表示されている。ダッシュボードのurlとAPIのurlが表示されている。またヒントとして作ったAPIの呼び出し方の例もある。
encore run

開発ツールからも API を呼べる。

先ほどの説明に加え右側の左側の並んでいるAPIの下にAPIが呼び出されており結果とログが表示されている。TRACEには一回helloが呼ばれ成功したことが表示されている
APIをEncoreのダッシュボードから呼んでいる様子

このあと Quick start ではデプロイを始めているが、この記事では試しにもう一個 API を書いてみる。ちなみにencore runはホットリロードにも対応している。

こんな感じになった。/cat/world3とするとMeow world! Meow world! Meow world!が帰ってくる。logは比較的使いやすかった。

import log from "encore.dev/log";

export const cat = api(
  { expose: true, method: "GET", path: "/cat/:param" },
  async ({ param }: { param: string }): Promise<Response> => {
    log.info(`${param}`, { is_subscriber: true });
    const num: number = Number(param.match(/\d+$/));
    if (Number.isNaN(num)) {
      throw new Error("The last letter is not a number.");
    }
    const name = param.split(/\d+$/)[0];

    const msg = Array(num).fill(`Meow ${name}!`).join(" ");
    return { message: msg };
  }
);

デプロイ

本来なら専用のGithubリポジトリとリンクしてmainにpushした時に自動でデプロイしてくれるようだ。しかし、開始時に「なんかリポジトリできてる、消すか」と思って消してsandbox内にある。しかも見た感じrootにないとダメそう。ビルドプロセス自体はencore.appというファイルを作ることでカスタマイズできる。結局いろいろ見ていたがダメそうなので諦めた。

値段

無料プランでは以下の通り。(ここから。変わっている可能性あり)

アプリケーション毎
リクエスト100,000 / 日
データベース容量1 GB
PubSubメッセージ100,000 / 日
Cron1時間に一回

結構安い。安すぎるくらいだと思う。(この表ダサいからそのうち変えたい)

所感

所感は以下の通り。

そこまで大きいプロジェクトではなく、GoかTypescriptを採用できるなら刺さると思う。自分はどちらの言語もほとんどかけない(上のcatでも20分くらい調べながら作った)からめっちゃ刺さったというわけではない。今回のソースコードはGithubのsatler-git/sandboxの中で見れる。

Tags /freefordev/cloud/