Copyright 2021 Toranoana Inc.
とりあえずDenoを
CloudRunで動かしてみる
植竹 惇
虎の穴ラボ株式会社
1
Copyright 2021 Toranoana Inc.
目次

2
● 自己紹介

 

● 何をするのか



● 実際にやってみた



● 解説



● まとめ

Copyright  (C) 2020 Toranoana Inc. All Rights Reserved.
自己紹介
植竹惇(ウエタケ ジュン)
‣ 2018/08 入社のWebエンジニア
‣ 新規事業系 開発リーダー
‣ 前職:エンタメ系アプリ
   サーバーサイドエンジニア
入社理由
‣ 最高のモチベーションを
発揮できる業界で働きたい!
比較的得意なもの
‣ Rails
‣ GCP
Deno歴
‣ 3日程度
いま熱いコンテンツ
‣ バンドリ
‣ 淫獄団地
Copyright 2021 Toranoana Inc.
Deno初心者なので何から

手を付けるか……

4
Copyright 2021 Toranoana Inc.
とりあえず



実際に使うことを想定し、

クラウドサービスで動作させたい

5
Copyright 2021 Toranoana Inc.
※CloudRunについては8月のテックカンファレンスでも登壇 

https://www.slideshare.net/toranoana-lab/fantiagcp-250009922

6
CloudRunとはGCPにある、 

サーバーレスのコンテナ化された 

フルマネージドな

コンピューティング環境 



Copyright 2021 Toranoana Inc.
やってみた

7
Copyright 2021 Toranoana Inc.
参考にしたサイト

https://future-architect.github.io/articles/20200612/

















8
DockerでのHello Worldはできたが… 

Copyright 2021 Toranoana Inc.
$ docker build -t deno-lt .



$ docker tag deno-lt asia.gcr.io/XXXXXXXX/deno-lt:latest




$ docker push asia.gcr.io/XXXXXXXX/deno-lt:latest




$ gcloud beta run deploy deno-lt  …..(略)


9
ビルドして



タグ付けして



GCPのコンテナ登録して



デプロイする

これだけで指定ポートにアクセスしたら動くようになっていなくてはいけない。


Copyright 2021 Toranoana Inc.
つまりは



docker-conpose抜きで、



サーバーの起動まで実行されている必要がある

10
Copyright 2021 Toranoana Inc.
自分のDocker+CloudRunの理解が半端だったこともあり、だいぶ苦戦。



「これだ」というサンプルはないため、Dockerの基礎的な部分で躓く。

11
Copyright 2021 Toranoana Inc.
最終的に参考にしたサイト

https://github.com/denoland/deno_docker

















12
Copyright 2021 Toranoana Inc.
13
$ docker build -t deno-lt .
$ docker run -it -p 8080:8080 deno-lt
server starting on http://localhost:8080/
Ctrl-C to shutdown container
結局のところ、ローカル環境で上記の build+run 直後の



サーバー起動ができればCloudRunで動きます

Copyright 2021 Toranoana Inc.
FROM denoland/deno:1.14.1
EXPOSE 8080
WORKDIR /app
USER deno
ADD . .
RUN deno cache main.ts
CMD ["run", "--allow-net", "--allow-read", "main.ts"]
Dockerfile
公式のイメージ

利用ポート解放

denoのお作法ネッ
ト解放

denoのお作法

ファイル読取許可

Copyright 2021 Toranoana Inc.
import { serve } from "https://deno.land/std@0.113.0/http/server_legacy.ts";
const server = serve({ port: 8080 });
const template = await Deno.readTextFile("app/html/hello.html");
console.log("server starting on http://localhost:8080/nCtrl-C to shutdown
container");
for await (const req of server) {
req.respond({ body: template });
}
main.ts
readFileStrではローカル上のhtmlファイルを読んでいます。 



あとはお決まりのようなものなので特筆することもなく…。 

Copyright 2021 Toranoana Inc.


実際に動く環境を見てみよう 

16
Copyright 2021 Toranoana Inc.


次にoak(ミドルウェアフレームワーク)

を使ったルーティングのAPIも作ってみる

17
Copyright 2021 Toranoana Inc.
利用したサンプルコードのサイト

https://github.com/oakserver/oak



















18
Copyright 2021 Toranoana Inc.
19
import { Application, Router } from "https://deno.land/x/oak/mod.ts";
const samples = new Map<string, any>();
samples.set("1", {
id: "1",
title: "CloudRun Test Deno",
author: "JUNE-JUNE",
});
const router = new Router();
router
.get("/", (context) => {
context.response.body = "Hello world!";
})
.get("/sample", (context) => {
context.response.body = Array.from(samples.values());
})
.get("/sample/:id", (context) => {
if (context.params && context.params.id && samples.has(context.params.id)) {
context.response.body = samples.get(context.params.id);
}
});
const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: 8080 });
main.tsで動かすコード

Copyright 2021 Toranoana Inc.
20
await app.listen({ port: 8080 });
サンプルコードをそのまま使えます。

listenするポートを、CloudRunに合わせるのだけ忘れないように。

Copyright 2021 Toranoana Inc.


実際に動く環境を見てみよう 

21
Copyright 2021 Toranoana Inc.


まとめ



・とりあえず超簡易的に実用できるような検証をした



・どちらかといえばDockerとCloudRunの勉強になりました



・次はデータベースへの接続までCloudRunで試したい

22

【20211027_toranoana.deno#2】とりあえずDenoを CloudRunで動かしてみる

  • 1.
    Copyright 2021 ToranoanaInc. とりあえずDenoを CloudRunで動かしてみる 植竹 惇 虎の穴ラボ株式会社 1
  • 2.
    Copyright 2021 ToranoanaInc. 目次
 2 ● 自己紹介
  
 ● 何をするのか
 
 ● 実際にやってみた
 
 ● 解説
 
 ● まとめ

  • 3.
    Copyright  (C) 2020Toranoana Inc. All Rights Reserved. 自己紹介 植竹惇(ウエタケ ジュン) ‣ 2018/08 入社のWebエンジニア ‣ 新規事業系 開発リーダー ‣ 前職:エンタメ系アプリ    サーバーサイドエンジニア 入社理由 ‣ 最高のモチベーションを 発揮できる業界で働きたい! 比較的得意なもの ‣ Rails ‣ GCP Deno歴 ‣ 3日程度 いま熱いコンテンツ ‣ バンドリ ‣ 淫獄団地
  • 4.
    Copyright 2021 ToranoanaInc. Deno初心者なので何から
 手を付けるか……
 4
  • 5.
    Copyright 2021 ToranoanaInc. とりあえず
 
 実際に使うことを想定し、
 クラウドサービスで動作させたい
 5
  • 6.
    Copyright 2021 ToranoanaInc. ※CloudRunについては8月のテックカンファレンスでも登壇 
 https://www.slideshare.net/toranoana-lab/fantiagcp-250009922
 6 CloudRunとはGCPにある、 
 サーバーレスのコンテナ化された 
 フルマネージドな
 コンピューティング環境 
 

  • 7.
    Copyright 2021 ToranoanaInc. やってみた
 7
  • 8.
    Copyright 2021 ToranoanaInc. 参考にしたサイト
 https://future-architect.github.io/articles/20200612/
 
 
 
 
 
 
 
 
 8 DockerでのHello Worldはできたが… 

  • 9.
    Copyright 2021 ToranoanaInc. $ docker build -t deno-lt .
 
 $ docker tag deno-lt asia.gcr.io/XXXXXXXX/deno-lt:latest 
 
 $ docker push asia.gcr.io/XXXXXXXX/deno-lt:latest 
 
 $ gcloud beta run deploy deno-lt …..(略) 
 9 ビルドして
 
 タグ付けして
 
 GCPのコンテナ登録して
 
 デプロイする
 これだけで指定ポートにアクセスしたら動くようになっていなくてはいけない。 

  • 10.
    Copyright 2021 ToranoanaInc. つまりは
 
 docker-conpose抜きで、
 
 サーバーの起動まで実行されている必要がある
 10
  • 11.
    Copyright 2021 ToranoanaInc. 自分のDocker+CloudRunの理解が半端だったこともあり、だいぶ苦戦。
 
 「これだ」というサンプルはないため、Dockerの基礎的な部分で躓く。
 11
  • 12.
    Copyright 2021 ToranoanaInc. 最終的に参考にしたサイト
 https://github.com/denoland/deno_docker
 
 
 
 
 
 
 
 
 12
  • 13.
    Copyright 2021 ToranoanaInc. 13 $ docker build -t deno-lt . $ docker run -it -p 8080:8080 deno-lt server starting on http://localhost:8080/ Ctrl-C to shutdown container 結局のところ、ローカル環境で上記の build+run 直後の
 
 サーバー起動ができればCloudRunで動きます

  • 14.
    Copyright 2021 ToranoanaInc. FROM denoland/deno:1.14.1 EXPOSE 8080 WORKDIR /app USER deno ADD . . RUN deno cache main.ts CMD ["run", "--allow-net", "--allow-read", "main.ts"] Dockerfile 公式のイメージ
 利用ポート解放
 denoのお作法ネッ ト解放
 denoのお作法
 ファイル読取許可

  • 15.
    Copyright 2021 ToranoanaInc. import { serve } from "https://deno.land/std@0.113.0/http/server_legacy.ts"; const server = serve({ port: 8080 }); const template = await Deno.readTextFile("app/html/hello.html"); console.log("server starting on http://localhost:8080/nCtrl-C to shutdown container"); for await (const req of server) { req.respond({ body: template }); } main.ts readFileStrではローカル上のhtmlファイルを読んでいます。 
 
 あとはお決まりのようなものなので特筆することもなく…。 

  • 16.
    Copyright 2021 ToranoanaInc. 
 実際に動く環境を見てみよう 
 16
  • 17.
    Copyright 2021 ToranoanaInc. 
 次にoak(ミドルウェアフレームワーク)
 を使ったルーティングのAPIも作ってみる
 17
  • 18.
    Copyright 2021 ToranoanaInc. 利用したサンプルコードのサイト
 https://github.com/oakserver/oak
 
 
 
 
 
 
 
 
 
 18
  • 19.
    Copyright 2021 ToranoanaInc. 19 import { Application, Router } from "https://deno.land/x/oak/mod.ts"; const samples = new Map<string, any>(); samples.set("1", { id: "1", title: "CloudRun Test Deno", author: "JUNE-JUNE", }); const router = new Router(); router .get("/", (context) => { context.response.body = "Hello world!"; }) .get("/sample", (context) => { context.response.body = Array.from(samples.values()); }) .get("/sample/:id", (context) => { if (context.params && context.params.id && samples.has(context.params.id)) { context.response.body = samples.get(context.params.id); } }); const app = new Application(); app.use(router.routes()); app.use(router.allowedMethods()); await app.listen({ port: 8080 }); main.tsで動かすコード

  • 20.
    Copyright 2021 ToranoanaInc. 20 await app.listen({ port: 8080 }); サンプルコードをそのまま使えます。
 listenするポートを、CloudRunに合わせるのだけ忘れないように。

  • 21.
    Copyright 2021 ToranoanaInc. 
 実際に動く環境を見てみよう 
 21
  • 22.
    Copyright 2021 ToranoanaInc. 
 まとめ
 
 ・とりあえず超簡易的に実用できるような検証をした
 
 ・どちらかといえばDockerとCloudRunの勉強になりました
 
 ・次はデータベースへの接続までCloudRunで試したい
 22