マイクロサービス・FaaS・NoSQL・Object Storage が作り放題な Deta.sh を試してみた
少し前に Cloudflare Pages・Workers・Workers KV を活用して、FaaS と NoSQL を無料で試した。
- 過去記事 : Cloudflare Workers による FaaS・Cloudflare Workers KV による Key-Value Store を試してみた
- 過去記事 : Cloudflare Pages と Cloudflare Workers KV を組み合わせてウェブアプリを作ってみた
同じく無料で、FaaS と NoSQL、さらには Object Storage も作れる、Deta.sh というサービスを見付けたので試してみた。
Deta Micros と Deta Base を使って実装したサンプルアプリは以下。
コードは全て以下に置いた。
以下、詳細。
目次
- Deta.sh とは
- Micros と Base を使ってみた
- Deta CLI を導入する
- マイクロサービスを作成する
- プロジェクトをデプロイする
- エイリアス URL を作る
- 作成したプロジェクトをローカルにコピーする
- その他の
deta
サブコマンド - Deta Base を使ってみる
- サンプルアプリの実装
- ひとまず以上
Deta.sh とは
Deta.sh とは、以下のサービスが無料で利用できるクラウドサービスである。
- Deta Micros
- FaaS というか、マイクロサービス
- 実行基盤は Python v3.7 と Node.js v12。これらの言語・バージョンで実装ができる
- Node.js の場合は Express.js で実装したウェブサーバが動作するので、関数単位で実行される FaaS というよりは、「マイクロサービス」という表現が適切か
- 実行時間は1回のリクエストあたり10秒まで。RAM は 128MB。といった制限がある
/tmp
領域に 512MB まで書き込みができる- 実行時間やスペックには制限があるものの、デプロイ出来る資材の量などには制約がないのが特徴
- 参考 : Introduction to Deta Micros | Deta Docs
- Deta Base
- NoSQL データベース
- 容量無制限でデータを格納できる
- Node.js と Python の SDK があり、データ操作が容易
- 参考 : About Deta Base | Deta Docs
- Deta Drive
- 無料で 10GB までアップロードできるファイルストレージ
- SDK からアップロードやダウンロードができるので、Object Storage として利用できる
- 参考 : About Deta Drive | Deta Docs
これらが無料なのってかなり太っ腹。データは暗号化された状態で 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"
}
そしたら、超簡単なアプリを作ってみる。
index.js
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/
ディレクトリが生成されている。
.deta/prog_info
にはプロジェクト等の情報.deta/state
にはデプロイされたファイルのハッシュ値
などが記録されている。どちらも機密情報はないため、このまま Git コミットしても問題なさそう。
エイリアス URL を作る
デフォルトで発行されるエンドポイント URL はランダムな文字列になっていて分かりづらい。ブラウザで Deta.sh の管理コンソールにアクセスし、プロジェクトの詳細を開くと、エイリアス URL を1つだけ作れる。
自分の場合、
というデフォルトの URL に対して、
というエイリアス URL を作って指定してあげた。
作成したプロジェクトをローカルにコピーする
ブラウザで管理コンソールを見ていたら、以下のようなコマンドを見付けた。
$ deta clone --name practice-deta --project default
任意の作業ディレクトリに移動し、試しに叩いてみよう。
$ 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 run
: エンドポイントが JSON を返すような作りの場合、ローカルでリクエストを投げて動作確認できるようだ。HTML をレスポンスするような作りだとエラーになってしまい使い勝手が悪いdeta cron
: Cron 設定をする際に使うdeta logs
: 叩いても何も起こらない。以前はあったサブコマンドみたいだが、現在はドキュメントもなく、恐らく何かの名残りで今は使えないモノと思われるupdate
: 環境変数を設定するためのサブコマンドvisor
: 管理コンソールの「Visor」タブを有効化・無効化するコマンド。Visor ではリクエスト別のconsole.log
が参照できる- 参考 : Deta CLI Reference | Deta Docs
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.html
と favicon.ico
をレスポンスする定義と、各種 API の実装をしている。index.js
のルーティング定義なしでは、デプロイされている他の資材にはアクセスできないので、やはり「マイクロサービス」を作るつもりでいないと、ルーティング定義が大変になってくる。
作成した API は2つのみ。
- GET
/posts
- 投稿データを取得する
- 一応「100件取得する」という
limit
オプションをかけているが、100件以上はデータを保持しないように実装しているので、あくまで保険
- PUT
/posts
- リクエストされた文字列を投稿データ1件として保存する
- Deta Base に保存しておく投稿データの件数を100件に留めておくため、古いデータを削除する処理も入れている
- シーケンス値を管理するレコードを用意しておき、100件以上前のシーケンス値のレコードを Delete するようにした
詳細は実装を見てもらえば分かると思う。
ひとまず以上
コレ全部無料で使えるの?容量制限もないし凄いね。
Deta Micros の実行速度はそこそこ速いが、Deta Base の実行速度はイマイチ。テキスト数件でも書き込みと取得でまぁまぁ時間がかかる。ラフなマイクロアプリを無料で作りたい時にはちょうど良いかな。