Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
2022/08/24

toranoana.deno #8 



虎の穴ラボ

奥谷 一陽

Deno Deployと組み合わせるのに

upstashをおすすめしたい

Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
自己紹介

奥谷 一陽

所属:虎の穴ラボ株式会社

担当:とらコインSHOPなど新規事業系の開発

興味:TypeScript、Deno

おすすめコンテンツ:

  『プラネテス』

  『暴太郎戦隊ドンブラザーズ』



Twitter:@okutann88

Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
Deno Deploy どのくらい使っ
てますか?

Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
Deno Deploy と組み合わせる前提で、

オススメSaaSを紹介したい

Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
upstash

















参考:https://upstash.com/

Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
upstash

- カルフォルニアの Upstash, Inc. が運営するSaaS

- Redis Kafka qStashを提供

- キーワード:グローバル 低レイテンシ 上限付きの従量課金



Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
upstash の Redis

- 無料プラン:10K コマンド/日

- 有料プラン:0.2 $/100Kコマンド、月間最大 $120 まで

- 公式が、deno.land/x にモジュールを公開済み

https://deno.land/x/upstash_redis@v1.12.0-next.1

- Redisと銘打つものの、内部でfetchが使用されたhttpリクエストを使用

「Redisっぽく動く」 「Redis互換の」ぐらいの感触

Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
upstash の Redis の使用例

import { Application, Router, Context } from "https://deno.land/x/oak/mod.ts";
import { Redis } from "https://deno.land/x/upstash_redis/mod.ts";
const redis = new Redis({
url: Deno.env.get("UPSTASH_URL"),
token: Deno.env.get("UPSTASH_TOKEN"),
});
const router = new Router();
router.get("/", async (context: Context) => {
const count = await redis.get("count");
context.response.body = count;
});
router.post("/update", async (context: Context) => {
await redis.incr("count");
context.response.body = "updated";
});
const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: 8080 });


Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
upstash の Redis で実際にやりたいのは?

- キャッシュの仕組みが有ったときに、Webサービスで扱いたいのは

「セッション」では無いだろうか(偏見かもしれません)

- oak_session モジュール + upstash_redis モジュール は組み合わせ可能?

=> できる ただし...、 オプションが必須

Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
upstash の Redis を oak_session で使う

import { Application, Context, Router } from
"https://deno.land/x/oak/mod.ts";
import { RedisStore, Session } from
"https://deno.land/x/oak_sessions/mod.ts";
import { Redis } from "https://deno.land/x/upstash_redis/mod.ts";
const redis = new Redis({
url: Deno.env.get("UPSTASH_URL")!,
token: Deno.env.get("UPSTASH_TOKEN")!,
automaticDeserialization: false, // <== ポイント
});
const router = new Router();
router.get("/", async (context: Context) => {
const name = await context.state.session.get("name");
context.response.body = `
<!DOCTYPE html>
<html>
<body>
<div>
${!name ? "" : "name=" + name}
</div>
<form method="POST">
<input name="name">
<button type="submit">submit</button>
</form>
</body>
</html>
`;
});
router.post("/", async (context: Context) => {
const form = await context.request.body({ type: "form" }).value;
const name = form.get("name");
if (!!name) context.state.session.set("name", name);
context.response.redirect("/");
});
type AppState = {
session: Session;
};
const app = new Application<AppState>();
const store = new RedisStore(redis);
app.use(Session.initMiddleware(store));
app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: 8080 });


upstash_redisは、デフォルトで、jsonの自動デシリアライズが
ONになっているので この機能を停止させる


デシリアライズは、oak_session に任せる!




Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
qStash ?

- upstashの独自サービス

- サーバーレス、エッジランタイム向け、HTTPベースメッセージング/

スケジューリングソリューション

- 無料プラン:50リクエスト/日

- 有料プラン:50Kリクエスト/日 0.4 $/1Kリクエスト 月間最大 $450 

- 最大のポイント Deno Deploy をスケジュール実行できる

=> さらに、upstash公式が deno deploy をサポート

Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
qStash の deno deploy サポート

Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
Deno Deployで qStash 使ってみる 

以下の内容を実装する

- qStashから1分に1回 Deno Deploy に置いたアプリを呼び出す

- 呼び出しに対応して upstash Redisに保管した値をカウントする

- ブラウザからアクセスし値を参照する

Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
Deno Deployで qStash 使ってみる 

ポイント

- 公式が、deno.land/x にモジュールを公開済み

- https://deno.land/x/upstash_qstash@v0.1.7

- qStashからのリクエストであることを upstash_qstash モジュールを

使い検証すること



Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
Deno Deploy で qStash を使う実装例

import { Application, Router, Context } from
"https://deno.land/x/oak/mod.ts";
import { Redis } from
"https://deno.land/x/upstash_redis/mod.ts";
import { Receiver } from
"https://deno.land/x/upstash_qstash/mod.ts";
const redis = new Redis({
url: Deno.env.get("UPSTASH_URL"),
token: Deno.env.get("UPSTASH_TOKEN"),
})
const receiver = new Receiver({
currentSigningKey:
Deno.env.get("QSTASH_CURRENT_SIGNING_KEY")!,
nextSigningKey:
Deno.env.get("QSTASH_NEXT_SIGNING_KEY")!,
});
const router = new Router();
router.get("/", async(context:Context) => {
const count = await redis.get("count");
context.response.body = count;
});


router.post("/update", async(context:Context) => {
const isValid = await receiver.verify({ // <== ポイント
signature: context.request.headers.get("Upstash-Signature")!,
body: await context.request.body({ type: "text" }).value,
}).catch((err: Error) => {
console.error(err);
return false;
});
if (!isValid) {
return new Response("Invalid signature", { status: 401 });
}
await redis.incr("count");
return new Response("OK", { status: 200 });
});
const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: 8080 });


Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
現在動作中です。

一分に一回カウントアップされます。
https://late-otter-59.deno.dev/





Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
まとめ

- Deno Deployの有効活用のため、upstashの組み合わせオススメ

- 出来ることが、大きく広がる

- Deno Deploy 起点のフルサーバーレスなサービスを開発できる可能性

例えば?



Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
Deno Deploy 起点フルサーバーレス サービス インフラ 構想



deno deploy
・APIサーバー
・DB管理
・ストレージ
キャッシュ呼び出し
Redis
qStash
バッチ処理呼び出し
フロントサーバー
Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
Deno Deploy 起点フルサーバーレス サービス インフラ 構想

deno deploy
フロントサーバー
・APIサーバー
・DB管理
・ストレージ
キャッシュ呼び出し
Redis qStash
バッチ処理呼び出し
deno deploy
+      +
bunny cdn ...
API呼び出し
Copyright  (C) 2021 Toranoana Inc. All Rights Reserved.
ありがとうございました


More Related Content

PDF
戦う情シス!全社 API で社内アプリ開発を加速させよう
PPTX
Azure API Management 俺的マニュアル
PDF
使いこなそうGUC
PDF
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
PPTX
Apache Bigtopによるオープンなビッグデータ処理基盤の構築(オープンデベロッパーズカンファレンス 2021 Online 発表資料)
PPTX
EC2でマルチキャスト
PDF
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
PPTX
Cesiumを動かしてみよう
戦う情シス!全社 API で社内アプリ開発を加速させよう
Azure API Management 俺的マニュアル
使いこなそうGUC
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
Apache Bigtopによるオープンなビッグデータ処理基盤の構築(オープンデベロッパーズカンファレンス 2021 Online 発表資料)
EC2でマルチキャスト
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
Cesiumを動かしてみよう

What's hot (20)

PPTX
smarthrを支えるインフラ
PDF
Apache Auroraの始めかた
PDF
Kongの概要と導入事例
PDF
Apache Pulsarの概要と近況
PPTX
BigtopでHadoopをビルドする(Open Source Conference 2021 Online/Spring 発表資料)
PDF
Kubernetes 疲れに Azure Container Apps はいかがでしょうか?(江東区合同ライトニングトーク 発表資料)
PDF
今さらだけどMySQLとライセンス
PDF
KeycloakのDevice Flow、CIBAについて
PDF
OAuth / OpenID Connectを中心とするAPIセキュリティについて #yuzawaws
PDF
Infrastructure as Code (IaC) 談義 2022
PPTX
Azure Api Management 俺的マニュアル 2020年3月版
PDF
アイデアソン・ハッカソン運営ガイドブック
PDF
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
PDF
Vacuum徹底解説
PDF
Microsoft Graph APIを活用した社内アプリケーション開発
PPTX
Azure AD による Web API の 保護
PDF
Dockerイメージの理解とコンテナのライフサイクル
PPTX
グラフ構造のデータモデルをPower BIで可視化してみた
PDF
Dbts2013 特濃jpoug log_file_sync
PPTX
世の中のPostgreSQLエンジニアのpsql設定(第34回PostgreSQLアンカンファレンス@オンライン 発表資料)
smarthrを支えるインフラ
Apache Auroraの始めかた
Kongの概要と導入事例
Apache Pulsarの概要と近況
BigtopでHadoopをビルドする(Open Source Conference 2021 Online/Spring 発表資料)
Kubernetes 疲れに Azure Container Apps はいかがでしょうか?(江東区合同ライトニングトーク 発表資料)
今さらだけどMySQLとライセンス
KeycloakのDevice Flow、CIBAについて
OAuth / OpenID Connectを中心とするAPIセキュリティについて #yuzawaws
Infrastructure as Code (IaC) 談義 2022
Azure Api Management 俺的マニュアル 2020年3月版
アイデアソン・ハッカソン運営ガイドブック
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
Vacuum徹底解説
Microsoft Graph APIを活用した社内アプリケーション開発
Azure AD による Web API の 保護
Dockerイメージの理解とコンテナのライフサイクル
グラフ構造のデータモデルをPower BIで可視化してみた
Dbts2013 特濃jpoug log_file_sync
世の中のPostgreSQLエンジニアのpsql設定(第34回PostgreSQLアンカンファレンス@オンライン 発表資料)
Ad

More from 虎の穴 開発室 (20)

PDF
FizzBuzzで学ぶJavaの進化
PDF
Railsのデバッグ どうやるかを改めて確認する
PDF
虎の穴ラボ エンジニア採用説明資料 .pdf
PDF
toranoana.deno #6 アジェンダ 採用説明
PDF
Deno 向け WEB 開発用のツールを作ったので 紹介します
PDF
GCPの画像認識APIの紹介
PDF
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
PDF
GitHub APIとfreshで遊ぼう
PDF
通販開発部の西田さん「通販開発マネジメントの5ルール」
PDF
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
PDF
セキュリティを強化しよう!CloudArmorの機能解説
PDF
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発
PDF
Amplify Studioを使ってみた
PDF
いいテスト会 (スプリントレビュー) をやろう!
PDF
【Saitama.js】Denoのすすめ
PDF
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
PDF
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
PDF
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
PDF
【20220120 toranoana.deno#4】deno を使って「ログイン」するサービスを作る
PDF
【20220120 toranoana.deno#4】denoでffiの続き
FizzBuzzで学ぶJavaの進化
Railsのデバッグ どうやるかを改めて確認する
虎の穴ラボ エンジニア採用説明資料 .pdf
toranoana.deno #6 アジェンダ 採用説明
Deno 向け WEB 開発用のツールを作ったので 紹介します
GCPの画像認識APIの紹介
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
GitHub APIとfreshで遊ぼう
通販開発部の西田さん「通販開発マネジメントの5ルール」
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
セキュリティを強化しよう!CloudArmorの機能解説
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発
Amplify Studioを使ってみた
いいテスト会 (スプリントレビュー) をやろう!
【Saitama.js】Denoのすすめ
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
【20220120 toranoana.deno#4】deno を使って「ログイン」するサービスを作る
【20220120 toranoana.deno#4】denoでffiの続き
Ad

Recently uploaded (9)

PDF
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
PDF
20250823_IoTLT_vol126_kitazaki_v1___.pdf
PDF
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
PDF
ココロ分解帳|感情をやさしく分解し自分と他者を理解するためのモバイルノートアプリ
PDF
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
PPTX
Vibe Codingを触って感じた現実について.pptx .
PPTX
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
PDF
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
PPTX
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
20250823_IoTLT_vol126_kitazaki_v1___.pdf
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
ココロ分解帳|感情をやさしく分解し自分と他者を理解するためのモバイルノートアプリ
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
Vibe Codingを触って感じた現実について.pptx .
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。

Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf

  • 1. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. 2022/08/24
 toranoana.deno #8 
 
 虎の穴ラボ
 奥谷 一陽
 Deno Deployと組み合わせるのに
 upstashをおすすめしたい

  • 2. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. 自己紹介
 奥谷 一陽
 所属:虎の穴ラボ株式会社
 担当:とらコインSHOPなど新規事業系の開発
 興味:TypeScript、Deno
 おすすめコンテンツ:
   『プラネテス』
   『暴太郎戦隊ドンブラザーズ』
 
 Twitter:@okutann88

  • 3. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. Deno Deploy どのくらい使っ てますか?

  • 4. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. Deno Deploy と組み合わせる前提で、
 オススメSaaSを紹介したい

  • 5. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. upstash
 
 
 
 
 
 
 
 
 参考:https://upstash.com/

  • 6. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. upstash
 - カルフォルニアの Upstash, Inc. が運営するSaaS
 - Redis Kafka qStashを提供
 - キーワード:グローバル 低レイテンシ 上限付きの従量課金
 

  • 7. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. upstash の Redis
 - 無料プラン:10K コマンド/日
 - 有料プラン:0.2 $/100Kコマンド、月間最大 $120 まで
 - 公式が、deno.land/x にモジュールを公開済み
 https://deno.land/x/[email protected]
 - Redisと銘打つものの、内部でfetchが使用されたhttpリクエストを使用
 「Redisっぽく動く」 「Redis互換の」ぐらいの感触

  • 8. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. upstash の Redis の使用例
 import { Application, Router, Context } from "https://deno.land/x/oak/mod.ts"; import { Redis } from "https://deno.land/x/upstash_redis/mod.ts"; const redis = new Redis({ url: Deno.env.get("UPSTASH_URL"), token: Deno.env.get("UPSTASH_TOKEN"), }); const router = new Router(); router.get("/", async (context: Context) => { const count = await redis.get("count"); context.response.body = count; }); router.post("/update", async (context: Context) => { await redis.incr("count"); context.response.body = "updated"; }); const app = new Application(); app.use(router.routes()); app.use(router.allowedMethods()); await app.listen({ port: 8080 }); 

  • 9. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. upstash の Redis で実際にやりたいのは?
 - キャッシュの仕組みが有ったときに、Webサービスで扱いたいのは
 「セッション」では無いだろうか(偏見かもしれません)
 - oak_session モジュール + upstash_redis モジュール は組み合わせ可能?
 => できる ただし...、 オプションが必須

  • 10. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. upstash の Redis を oak_session で使う
 import { Application, Context, Router } from "https://deno.land/x/oak/mod.ts"; import { RedisStore, Session } from "https://deno.land/x/oak_sessions/mod.ts"; import { Redis } from "https://deno.land/x/upstash_redis/mod.ts"; const redis = new Redis({ url: Deno.env.get("UPSTASH_URL")!, token: Deno.env.get("UPSTASH_TOKEN")!, automaticDeserialization: false, // <== ポイント }); const router = new Router(); router.get("/", async (context: Context) => { const name = await context.state.session.get("name"); context.response.body = ` <!DOCTYPE html> <html> <body> <div> ${!name ? "" : "name=" + name} </div> <form method="POST"> <input name="name"> <button type="submit">submit</button> </form> </body> </html> `; }); router.post("/", async (context: Context) => { const form = await context.request.body({ type: "form" }).value; const name = form.get("name"); if (!!name) context.state.session.set("name", name); context.response.redirect("/"); }); type AppState = { session: Session; }; const app = new Application<AppState>(); const store = new RedisStore(redis); app.use(Session.initMiddleware(store)); app.use(router.routes()); app.use(router.allowedMethods()); await app.listen({ port: 8080 }); 
 upstash_redisは、デフォルトで、jsonの自動デシリアライズが ONになっているので この機能を停止させる 
 デシリアライズは、oak_session に任せる! 
 

  • 11. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. qStash ?
 - upstashの独自サービス
 - サーバーレス、エッジランタイム向け、HTTPベースメッセージング/
 スケジューリングソリューション
 - 無料プラン:50リクエスト/日
 - 有料プラン:50Kリクエスト/日 0.4 $/1Kリクエスト 月間最大 $450 
 - 最大のポイント Deno Deploy をスケジュール実行できる
 => さらに、upstash公式が deno deploy をサポート

  • 12. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. qStash の deno deploy サポート

  • 13. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. Deno Deployで qStash 使ってみる 
 以下の内容を実装する
 - qStashから1分に1回 Deno Deploy に置いたアプリを呼び出す
 - 呼び出しに対応して upstash Redisに保管した値をカウントする
 - ブラウザからアクセスし値を参照する

  • 14. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. Deno Deployで qStash 使ってみる 
 ポイント
 - 公式が、deno.land/x にモジュールを公開済み
 - https://deno.land/x/[email protected]
 - qStashからのリクエストであることを upstash_qstash モジュールを
 使い検証すること
 

  • 15. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. Deno Deploy で qStash を使う実装例
 import { Application, Router, Context } from "https://deno.land/x/oak/mod.ts"; import { Redis } from "https://deno.land/x/upstash_redis/mod.ts"; import { Receiver } from "https://deno.land/x/upstash_qstash/mod.ts"; const redis = new Redis({ url: Deno.env.get("UPSTASH_URL"), token: Deno.env.get("UPSTASH_TOKEN"), }) const receiver = new Receiver({ currentSigningKey: Deno.env.get("QSTASH_CURRENT_SIGNING_KEY")!, nextSigningKey: Deno.env.get("QSTASH_NEXT_SIGNING_KEY")!, }); const router = new Router(); router.get("/", async(context:Context) => { const count = await redis.get("count"); context.response.body = count; }); 
 router.post("/update", async(context:Context) => { const isValid = await receiver.verify({ // <== ポイント signature: context.request.headers.get("Upstash-Signature")!, body: await context.request.body({ type: "text" }).value, }).catch((err: Error) => { console.error(err); return false; }); if (!isValid) { return new Response("Invalid signature", { status: 401 }); } await redis.incr("count"); return new Response("OK", { status: 200 }); }); const app = new Application(); app.use(router.routes()); app.use(router.allowedMethods()); await app.listen({ port: 8080 }); 

  • 16. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. 現在動作中です。
 一分に一回カウントアップされます。 https://late-otter-59.deno.dev/
 
 

  • 17. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. まとめ
 - Deno Deployの有効活用のため、upstashの組み合わせオススメ
 - 出来ることが、大きく広がる
 - Deno Deploy 起点のフルサーバーレスなサービスを開発できる可能性
 例えば?
 

  • 18. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. Deno Deploy 起点フルサーバーレス サービス インフラ 構想
 
 deno deploy ・APIサーバー ・DB管理 ・ストレージ キャッシュ呼び出し Redis qStash バッチ処理呼び出し フロントサーバー
  • 19. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. Deno Deploy 起点フルサーバーレス サービス インフラ 構想
 deno deploy フロントサーバー ・APIサーバー ・DB管理 ・ストレージ キャッシュ呼び出し Redis qStash バッチ処理呼び出し deno deploy +      + bunny cdn ... API呼び出し
  • 20. Copyright  (C) 2021 Toranoana Inc. All Rights Reserved. ありがとうございました