マイクロサービス・FaaS・NoSQL・Object Storage が作り放題な Deta.sh を試してみた

少し前に Cloudflare Pages・Workers・Workers KV を活用して、FaaS と NoSQL を無料で試した。

同じく無料で、FaaS と NoSQL、さらには Object Storage も作れる、Deta.sh というサービスを見付けたので試してみた。

Deta Micros と Deta Base を使って実装したサンプルアプリは以下。

コードは全て以下に置いた。

以下、詳細。

目次

Deta.sh とは

Deta.sh とは、以下のサービスが無料で利用できるクラウドサービスである。

これらが無料なのってかなり太っ腹。データは暗号化された状態で AWS に保管されているとのこと。

Micros と Base を使ってみた

容量的には Cloudflare Workers よりも沢山使えそうだったので、試しに Deta Micros (マイクロサービス) と Deta Base (NoSQL DB) を使って簡単なアプリを作ってみた。Deta Drive も使ってみたかったが、サンプルアプリを作るのが大変そうだったので断念。w

Deta CLI を導入する

開発には Deta CLI を使う。

インストールコマンドがあるのでコレを使って deta コマンドをインストールしたら、deta login でログインする。

$ deta version
deta v1.1.4-beta x86_64-darwin

$ deta login
# ブラウザが起動するのでログインする

# 認証できるとこんな風にプロジェクトが確認できる
$ deta projects
[
        {
                "name": "default",
                "description": "Default project for neos21",
                "created": "2021-07-07T05:14:30Z"
        }
]

ログインしたユーザ情報は ~/.deta/ 配下に保存されている。

マイクロサービスを作成する

適当に Node.js 製のアプリを作るため、package.json だけ配置したディレクトリで $ deta new を叩いてみる。

$ npm init -y
$ npm install -S express

# エンドポイント URL が発行されている
$ deta new
Successfully created a new micro
{
        "name": "practice-deta",
        "runtime": "nodejs12.x",
        "endpoint": "https://47tex5.deta.dev",
        "visor": "enabled",
        "http_auth": "disabled"
}
Adding dependencies...

+ express@4.17.1
added 50 packages from 37 contributors and audited 50 packages in 2.181s
found 0 vulnerabilities

# エンドポイント URL にパブリック・アクセスできるように以下を指定しておく
$ deta auth disable
Successfully disabled http auth

# プロジェクトの詳細確認
$ deta details
{
        "name": "practice-deta",
        "runtime": "nodejs12.x",
        "endpoint": "https://47tex5.deta.dev",
        "dependencies": [
                "express@4.17.1"
        ],
        "visor": "enabled",
        "http_auth": "disabled"
}

そしたら、超簡単なアプリを作ってみる。

const express = require('express');

const app = express();
app.get('/', (_req, res) => res.send('Hello World'));

// Express App をエクスポートする
module.exports = app;

トップページにアクセスすると「Hello World」と返すだけの、Express サーバだ。ココから先の実装は、Express.js で普通のウェブサーバを作る要領で好きに実装できるので、Deta.sh 特有の知識はほぼ必要ない。

一点だけ注意すべきは、最終行で module.exports している点。Deta Micros では app.listen() はせず、app をエクスポートしてやる。

プロジェクトをデプロイする

Deta.sh および Deta CLI には、ローカル開発環境を提供するモノがない。Deta.sh に直接デプロイして直接動作確認する流れで、ほぼタイムラグなしに開発ができるので、さほど問題ではないかな。

# 資材をデプロイする
$ deta deploy
Deploying...
Successfully deployed changes

デプロイ後、すぐに URL エンドポイントにアクセスしても、高速で変更が反映されていてストレスがない。

# ファイルの変更を検知してデプロイする
$ deta watch

↑ ファイルの変更を検知して、すぐ $ deta deploy するコマンドもあったりする。

{
  "scripts": {
    "start": "node -e \"require('./index').listen(3000, () => console.log('Server Started'));\""
  }
}

↑ ローカルで開発したい場合は、package.json にこんな npm-scripts を書いておくと、ローカルサーバを起動して確認できるだろう。Deta Micros では、Heroku と違ってデプロイ後に npm start が実行されたりはしないので、コレで問題ない。

$ deta deploy を行うと、プロジェクトディレクトリに .deta/ ディレクトリが生成されている。

などが記録されている。どちらも機密情報はないため、このまま Git コミットしても問題なさそう。

エイリアス URL を作る

デフォルトで発行されるエンドポイント URL はランダムな文字列になっていて分かりづらい。ブラウザで Deta.sh の管理コンソールにアクセスし、プロジェクトの詳細を開くと、エイリアス URL を1つだけ作れる。

自分の場合、

というデフォルトの URL に対して、

というエイリアス URL を作って指定してあげた。

作成したプロジェクトをローカルにコピーする

ブラウザで管理コンソールを見ていたら、以下のようなコマンドを見付けた。

任意の作業ディレクトリに移動し、試しに叩いてみよう。

$ deta clone --name practice-deta --project default
Cloning...
Successfully cloned deta micro to '/PATH/TO/USER2/practice-deta'

$ tree
.
└── practice-deta
    ├── index.html
    ├── index.js
    └── package.json

1 directory, 3 files

デプロイされている資材をダウンロードできるようだ。資材を Git 管理していなくても、最新の資材を Deta.sh から直接落として来られるというワケだ。

# 最新の資材を落としてくる
$ deta pull
Files already present may be overwritten. Continue? [y/n]
y
Successfully pulled latest deployed code

↑ こんな感じで、git pull に近いコマンドもあった。

変更の過程で削除したファイルも、Deta.sh 上には残っているらしく、$ deta clone$ deta pull で再取得ができてしまった。ちょっと気持ち悪い感じもするので、気になる人はプロジェクトを作り直してデプロイし直すなどしよう。

その他の deta サブコマンド

開発で使う deta サブコマンドはこんなところだが、他にも以下のようなサブコマンドがあった。

Deta Base を使ってみる

ココまでの実装では、Express を用いたウェブサーバをデプロイしただけなので、見ようによっては Heroku や Glitch のような、Node.js アプリが動く PaaS と変わらない感覚であろう。

次は、Deta.sh が提供する NoSQL サービスである Deta Base を使ってみる。

Deta Base や Deta Drive を操作するための SDK が提供されているので、Node.js の場合は以下のように npm でインストールしよう。

$ npm install --save deta

SDK の使い方は以下の公式ドキュメントで十分確認できる。

const { Deta } = require('deta');

// Project Key を指定して初期化する
const deta = Deta(process.env.DETA_PROJECT_KEY);  // ← ココで入力するプロジェクトキーは Git コミットしないように!.env などを使って環境変数で注入してやろう
// Deta Base に接続 (初回は新規 DB 作成) する
const db = deta.Base('posts');  // 任意の DB 名を付けられる

// レコードを Upsert する例
const createdSeq = await db.put({
  type: 'seq',
  seq : 1
}, 'seq');  // ← 第2引数で Key 名を指定している
const createdPost = await db.put({
  type: 'post',
  text: 'Hello World'
});  // ← 第2引数を指定しなかった場合は自動的にランダムな文字列で Key が生成される

// 条件指定して複数のレコードを取得する例
const query   = { type : 'post' };  // 条件として「type」カラムの値が「post」であるレコードを取得する
const options = { limit: 10 };      // 最大10件取得するオプション
const result  = await db.fetch(query, options);
const count   = result.count;  // 取得した件数
const items   = result.items;  // 取得したデータの配列 (0件の時は空配列)

// Key を指定してレコードを1件削除する例
await db.delete('my_key');  // 戻り値は常に `null`

Deta Base SDK でよく使いそうなのはこんなところか。

これらのメソッドを使って、Express で Web API を構築していけるだろう。

サンプルアプリの実装

改めて、サンプルアプリは以下。1行の書き込みができる匿名掲示板、といった形で、1件あたり200文字まで、全100件を Deta Base に保持するよう制御している。

コードは以下。

index.js にて、index.htmlfavicon.ico をレスポンスする定義と、各種 API の実装をしている。index.js のルーティング定義なしでは、デプロイされている他の資材にはアクセスできないので、やはり「マイクロサービス」を作るつもりでいないと、ルーティング定義が大変になってくる。

作成した API は2つのみ。

詳細は実装を見てもらえば分かると思う。

ひとまず以上

コレ全部無料で使えるの?容量制限もないし凄いね。

Deta Micros の実行速度はそこそこ速いが、Deta Base の実行速度はイマイチ。テキスト数件でも書き込みと取得でまぁまぁ時間がかかる。ラフなマイクロアプリを無料で作りたい時にはちょうど良いかな。