Slide 1

Slide 1 text

Cloud Run を中心としたWebアプリケーション構築事例 BigQueryとの統合解説 #serverlessdays #serverlesstokyo

Slide 2

Slide 2 text

クラメソZennチームで働いている和田といいます クラスメソッドへ入社 2016年2月 AWS EC2、Scala、Backend API サーバーレス(FaaSベース)アプリ開発 2018年7月 AWS Lambda、Node.js、Backend API, React SPA Zennをきっかけに Google Cloud の世界へ 2021年7月 Cloud Run、Next.js、Ruby on Rails、Zenn全般 福岡県北九州市出身です!

Slide 3

Slide 3 text

サーバーレスといえば…

Slide 4

Slide 4 text

サーバーレスといえば… API Gateway AWS Lambda DynamoDB

Slide 5

Slide 5 text

クラスメソッドでも お客様の課題解決に活用しています サーバーレスソリューションを駆使してきた アプリケーション開発メンバーに 「変化」を探るべく アンケートをとってみました

Slide 6

Slide 6 text

開発者へのアンケート AWS、Azure、Google Cloud 問わず Q1. これまでアプリ開発で使ってきたコンピューティングサービス Q2. これから使ってみたいコンピューティングサービス ※ クラウドプラットフォームやサービスを比較するものではありません

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

コメント紹介(一部) > LambdaのSnapStartも追い風となり、かつてはバットプ ラクティスだったLambdaにWebフレームワークのデプロイ が推奨される時代が来ていると感じています。 > APIGWやStepFunctionsを前段に置いて適切な粒度で処理 を区切れば多くの場合、コンピューティングはLambdaで問 題ないのかなと思っています。一方で、(中略)App Runner も主要な検討対象になってきたかなと思っています。 > 潮流的にFaaS->コンテナへの回帰を感じるが、FaaSは上記 の点でやはり優れたプラットフォームだと思う

Slide 10

Slide 10 text

サーバーレスの選択肢が確実に広がっている サーバーレスのどんな要素に我々は心打たれたのか? 使った分だけ課金 素早い市場投入 無限のスケール これらの特性を取り入れたサービス・ソリューションが増えている コンテナもそのひとつ

Slide 11

Slide 11 text

「サーバーレスってこう」ではなく… Zennを動かしているのは: Cloud Run Cloud SQL BigQuery なにを考えて選んだか?結果どれくらいサーバーレスなのか? 選択肢のひとつとしてポケットに入れていただきたい

Slide 12

Slide 12 text

Zenn / Cloud Run

Slide 13

Slide 13 text

とは Zennは「知見を共有するエンジニアに対価を」 というコンセプトでつくられた 技術情報共有コミュニティです。

Slide 14

Slide 14 text

3種類の投稿形式で、その時々に合った粒度で知見を残すことができます ひとまず 雑にメモ したい あのテーマ で誰かと 議論したい 最近学んだ あの話を記事 にしよう 労力が かかった分 有料で販売 しよう あの話を まとめて 本にしよう

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

Webアプリフレームワーク + DB でシンプルに構築したい フレームワーク => Next.js と Ruby on Rails データベース 読み込みが多いワークロード ユーザーごとの投稿一覧を取得したり、新着順で投稿を取得したり Ruby on Rails の恩恵を受けられる => RDB(PostgreSQL)にきまり

Slide 17

Slide 17 text

デプロイ先どうするか Next.js や Rails を簡単にデプロイしたい Cloud Load Balancing App Engine Cloud SQL VMインスタンスではなくコンテナで運用したい ので Cloud Run へ移行した経緯あり https://zenn.dev/team_zenn/articles/migrate-appengine-to-cloudrun

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

Web3層構成

Slide 20

Slide 20 text

Web3層構成でサーバーレス!? 構成をシンプルに保ちつつも、ネットワークやインスタンスはあまり意識せずに済んでい る

Slide 21

Slide 21 text

ネットワーク Google Cloud のリソース群によりIAMによるアクセス制御が可能、ほとんど意識して いいない Serverless NEG Cloud SQL Auth Proxy Identity Aware Proxy 個々のリソースについてはぜひフリートークしましょう👍

Slide 22

Slide 22 text

インスタンス Cloud Run の力で意識せずに済んでいる 使用したリソースに対してのみ課金 RailsやNext.jsの恩恵を受けつつコンテナデプロイ ステートレス、エフェメラル、自動スケール

Slide 23

Slide 23 text

もちろん課題もある コールドスタート問題 非同期タスクの実行時間上限問題

Slide 24

Slide 24 text

変更デプロイ時のコールドスタート対策 リクエスト 現行リビジョン インスタンス1 現行リビジョン インスタンス2 現行リビジョン インスタンス1 現行リビジョン インスタンス2

Slide 25

Slide 25 text

変更デプロイ時のコールドスタート対策 リクエスト 現行リビジョン インスタンス1 現行リビジョン インスタンス2 現行リビジョン インスタンス1 現行リビジョン インスタンス2 gcloud run deploy backend-user-api --quiet --project=$PROJECT_ID --region=${_REGION} --image=$_ARTIFACT_REPOSITORY_IMAGE_TAG --service-account=$_CLOUD_RUN_SERVICE_ACCOUNT --add-cloudsql-instances=$_CLOUDSQL_INSTANCE_FULL_NAME --revision-suffix=${SHORT_SHA}-${_SHORT_BUILD_ID} --concurrency=1000 --cpu=1 --memory=4Gi --max-instances=150 --min-instances=2 --no-use-http2 --allow-unauthenticated --no-cpu-throttling --ingress=internal-and-cloud-load-balancing

Slide 26

Slide 26 text

変更デプロイ時のコールドスタート対策 現行リビジョン インスタンス1 現行リビジョン インスタンス2 新リビジョン インスタンス1 新リビジョン インスタンス2 現行リビジョン インスタンス1 現行リビジョン インスタンス2 新リビジョン インスタンス1 新リビジョン インスタンス2 コールド スタート gcloud run deploy backend-user-api --quiet --project=$PROJECT_ID --region=${_REGION} --image=$_ARTIFACT_REPOSITORY_IMAGE_TAG --service-account=$_CLOUD_RUN_SERVICE_ACCOUNT --add-cloudsql-instances=$_CLOUDSQL_INSTANCE_FULL_NAME --revision-suffix=${SHORT_SHA}-${_SHORT_BUILD_ID} --concurrency=1000 --cpu=1 --memory=4Gi --max-instances=150 --min-instances=2 --no-use-http2 --allow-unauthenticated --no-cpu-throttling --ingress=internal-and-cloud-load-balancing

Slide 27

Slide 27 text

変更デプロイ時のコールドスタート対策 リクエスト 現行リビジョン インスタンス1 現行リビジョン インスタンス2 現行リビジョン インスタンス1 現行リビジョン インスタンス2 gcloud run deploy backend-user-api --quiet --project=$PROJECT_ID --region=${_REGION} --image=$_ARTIFACT_REPOSITORY_IMAGE_TAG --service-account=$_CLOUD_RUN_SERVICE_ACCOUNT --add-cloudsql-instances=$_CLOUDSQL_INSTANCE_FULL_NAME --revision-suffix=${SHORT_SHA}-${_SHORT_BUILD_ID} --tag=latest --concurrency=1000 --cpu=1 --memory=4Gi --max-instances=150 --min-instances=2 --no-traffic --no-use-http2 --allow-unauthenticated --no-cpu-throttling --ingress=internal-and-cloud-load-balancing

Slide 28

Slide 28 text

変更デプロイ時のコールドスタート対策 リクエスト 現行リビジョン インスタンス1 現行リビジョン インスタンス2 現行リビジョン インスタンス1 現行リビジョン インスタンス2 gcloud run deploy backend-user-api --quiet --project=$PROJECT_ID --region=${_REGION} --image=$_ARTIFACT_REPOSITORY_IMAGE_TAG --service-account=$_CLOUD_RUN_SERVICE_ACCOUNT --add-cloudsql-instances=$_CLOUDSQL_INSTANCE_FULL_NAME --revision-suffix=${SHORT_SHA}-${_SHORT_BUILD_ID} --tag=latest --concurrency=1000 --cpu=1 --memory=4Gi --max-instances=150 --min-instances=2 --no-traffic --no-use-http2 --allow-unauthenticated --no-cpu-throttling --ingress=internal-and-cloud-load-balancing 新リビジョン インスタンス2 新リビジョン インスタンス1 latest latest

Slide 29

Slide 29 text

変更デプロイ時のコールドスタート対策 現行リビジョン インスタンス1 現行リビジョン インスタンス2 リクエスト 現行リビジョン インスタンス1 現行リビジョン インスタンス2 新リビジョン インスタンス2 新リビジョン インスタンス1 latest latest gcloud run services update-traffic backend-user-api --quiet --region=asia-northeast1 --to-revisions=latest=100

Slide 30

Slide 30 text

非同期タスクの実行時間対策(デフォルト10分) Markdown の一括変換 ⇒ 変換処理に破壊的変更を入れる場合などに、保存済みの記事を変換する

Slide 31

Slide 31 text

非同期タスクの実行時間対策(デフォルト10分) Markdown の一括変換 ⇒ 変換処理に破壊的変更を入れる場合などに、保存済みの記事を変換する 出典: https://en.wikipedia.org/wiki/Scheduling_(computing)#task_queue

Slide 32

Slide 32 text

ここまでのまとめ Zennは、サーバーレスの特性を意識しぎず、ビジネス・ワークロードに合ったアーキテク チャをシンプルに寄せて選択 Google Cloud の高抽象度なリソースのおかげで、サーバーレスの特性を享受してい る メリットのかわりに手間をかけているところもある どれくらいサーバーレスといえるのか?を最後にふりかえる

Slide 33

Slide 33 text

BigQuery

Slide 34

Slide 34 text

BigQuery: フルマネージドデータレイク Zennでの利用例をいくつか紹介します アクセスログ、BigQuery、Looker Studio アクセスログ、BigQuery、Cloud Armor Google Analytics4、BigQuery、Looker Studio 統計ダッシュボード

Slide 35

Slide 35 text

アクセスログ、BigQuery、Looker Studio Cloud Load Balancing Cloud Logging BigQuery Looker レイテンシ集計レポートを作成して潜在的なパフォーマンス問題がないか確認

Slide 36

Slide 36 text

アクセスログ、BigQuery、Cloud Armor Cloud Load Balancing Cloud Logging BigQuery 攻撃の疑いがあるとき、IPアドレスを特定してブロック Cloud Armor

Slide 37

Slide 37 text

Google Analytics4、BigQuery、Looker Studio BigQuery Looker PVなどのレポート Google Analytics4

Slide 38

Slide 38 text

アプリケーションとの統合例: 統計ダッシュボード ログインユーザーが表示できる 公開した記事の閲覧数などをみられる ログインユーザーの認証・認可 Google Analytics4 のイベントデータとCloud SQL のデータをどうにかJOINする必要がある 不特定多数のユーザーに呼ばれるため、クエリ課金 を回避したい

Slide 39

Slide 39 text

BigQuery BI Engine を使いました キャッシュ容量をあらかじめ購入し、キャッシュに入れ たいBigQueryのテーブルを指定する 1GBあたり約$36/月 キャッシュ内のデータに対するクエリには課金が発生し ない 統計ダッシュボードで利用するデータがすべてキャッ シュに収まれば…? BigQueryクライアントからみたときの使い方は全く変 わらない BigQuery BI Engine PV table, master table BigQuery Zenn User Ruby on Rails Cloud Run

Slide 40

Slide 40 text

いかにキャッシュ領域に統計データをおさめるか スケジュールクエリで、PVイベントとマスタ(記事) データで必要なものだけ事前に集計、テーブルを 用意しておく それらのテーブルをBI Engineの対象にする BigQuery BI Engine PV table, master table BigQuery Zenn User Ruby on Rails Cloud Run スケジュール クエリ master table PV table

Slide 41

Slide 41 text

BigQueryのまとめ アプリケーションとは独立して利用できるケースと、アプリケーションと統合して利用する ケースを示した BigQuery はフルマネージドサービスで、クエリを使った分だけ課金される しかしZennの統計ダッシュボードでは使った分だけ課金だと青天井になる恐れがあった BI Engineを使い、コミットメント料金とすることで解決した データ容量の問題はエンジニアリングでカバー

Slide 42

Slide 42 text

Serverless

Slide 43

Slide 43 text

特性をどれくらい満たせているか 使った分だけ課金 素早い市場投入 スケーラビリティ

Slide 44

Slide 44 text

使った分だけ課金 一部のリソースでは定常課金あり(Cloud Load Balancing、Cloud SQL、 BigQuery BI Engine など) Cloud Run もコールドスタートを防ぐためにゼロスケールはせず、最低2台イン スタンスが立ち上がるよう設定 => 常に一定以上のアクセスがあるためその分の固定料金と思えば気にならない => 大事なのは、使った分だけ課金というよりは、月当たりのトータル金額

Slide 45

Slide 45 text

市場投入 最初のデプロイは時間がかかる が、Zennの場合は繰り返し変更をデリバリーするタイプ 変更容易性という点では助かっている ⇒ 典型的なWeb3層構成 Ruby on Rails + PostgreSQL(Cloud SQL) ⇒ ローカルでのテストが充実

Slide 46

Slide 46 text

スケーラビリティ Cloud Run は満たせる Cloud SQL は満たせない…?

Slide 47

Slide 47 text

スケーラビリティ Cloud Run は満たせる Cloud SQL は満たせない…?でもちょっと待って!

Slide 48

Slide 48 text

スケーラビリティ スケールを考えるシーンはふたつ 1.スパイクアクセス => 特定の記事がバズったとき => 特定のレコードへのアクセスにはキャッシュが効く (DB、Rails) => Cloud Run さえスケールできていれば気にしすぎることはない 2.アクティブユーザーの増加 => Cloud SQL への負荷も予測できる => 手動での垂直スケール(メンテして性能強化)で対応

Slide 49

Slide 49 text

オンデマンド 課金特性 デプロイ特性 スケール特性 圧倒的初速 自動水平 エクストリームサーバーレス

Slide 50

Slide 50 text

オンデマンド コミットメント 課金特性 デプロイ特性 スケール特性 圧倒的初速 継続容易性 自動水平 手動垂直 エクストリームサーバーレス

Slide 51

Slide 51 text

オンデマンド コミットメント 課金特性 デプロイ特性 スケール特性 圧倒的初速 継続容易性 自動水平 手動垂直 Zenn

Slide 52

Slide 52 text

オンデマンド コミットメント 課金特性 デプロイ特性 スケール特性 圧倒的初速 継続容易性 自動水平 手動垂直 Zenn

Slide 53

Slide 53 text

オンデマンド コミットメント 課金特性 デプロイ特性 スケール特性 圧倒的初速 継続容易性 自動水平 手動垂直 Zenn

Slide 54

Slide 54 text

オンデマンド コミットメント 課金特性 デプロイ特性 スケール特性 圧倒的初速 継続容易性 自動水平 手動垂直 コスト効率、ビジネス効率が最大になるよう にサーバーレス特性を取り入れていく Zenn

Slide 55

Slide 55 text

まとめ サーバーレスの特性を備えた実行環境が選べるようになってきた 振り切った特性を最初に目指すよりは、まずビジネスに対するワークロードを考え、それ を満たせるシンプルなアーキテクチャを選択するほうが楽 その後、デリバリー速度、コスト効率が最大になるようにサーバーレス特性を取り入れて いく(場合によっては手間をかけるシーンも許容する) このようなアプリ構築も一つの手

Slide 56

Slide 56 text

No content