$30 off During Our Annual Pro Sale. View Details »

ZennにみるCloudRunとBigQueryによるアプリケーション構築 / zenn-cl...

Yusuke Wada
September 23, 2023

ZennにみるCloudRunとBigQueryによるアプリケーション構築 / zenn-cloudrun-bigquery-serverless

Zennは、クラスメソッドが展開する技術者向けの知識共有プラットフォームです。Cloud Runを中心としたGoogle Cloudのソリューションをメインで使用しており、スケーラブルなWebアプリケーションとなっています。

このセッションでは、「サーバーレスとはなにか」という部分から改めてディスカッションし、アプリケーションをスケーラブルに、ビジネスに集中するという目的に対してZennがどうアプローチしているかを解説します。

また、Google Cloud を利用するモチベーションのひとつにBigQueryの存在があると思います。Zennでも統計機能に利用しており、アプリケーションとどのように統合しているか紹介、それがどの程度 Google Cloud を使う理由になるか議論します。

サーバーレスアプリケーションを組むときに、みなさまの選択肢をひとつ増やし、結果的によりニーズに合致したアーキテクチャを選定できる手助けとなることを期待しています。

Yusuke Wada

September 23, 2023
Tweet

More Decks by Yusuke Wada

Other Decks in Programming

Transcript

  1. クラメソ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全般 福岡県北九州市出身です!
  2. Webアプリフレームワーク + DB でシンプルに構築したい フレームワーク => Next.js と Ruby on

    Rails データベース 読み込みが多いワークロード ユーザーごとの投稿一覧を取得したり、新着順で投稿を取得したり Ruby on Rails の恩恵を受けられる => RDB(PostgreSQL)にきまり
  3. デプロイ先どうするか Next.js や Rails を簡単にデプロイしたい Cloud Load Balancing App Engine

    Cloud SQL VMインスタンスではなくコンテナで運用したい ので Cloud Run へ移行した経緯あり https://zenn.dev/team_zenn/articles/migrate-appengine-to-cloudrun
  4. 変更デプロイ時のコールドスタート対策 リクエスト 現行リビジョン インスタンス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
  5. 変更デプロイ時のコールドスタート対策 現行リビジョン インスタンス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
  6. 変更デプロイ時のコールドスタート対策 リクエスト 現行リビジョン インスタンス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
  7. 変更デプロイ時のコールドスタート対策 リクエスト 現行リビジョン インスタンス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
  8. 変更デプロイ時のコールドスタート対策 現行リビジョン インスタンス1 現行リビジョン インスタンス2 リクエスト 現行リビジョン インスタンス1 現行リビジョン インスタンス2

    新リビジョン インスタンス2 新リビジョン インスタンス1 latest latest gcloud run services update-traffic backend-user-api --quiet --region=asia-northeast1 --to-revisions=latest=100
  9. 使った分だけ課金 一部のリソースでは定常課金あり(Cloud Load Balancing、Cloud SQL、 BigQuery BI Engine など) Cloud

    Run もコールドスタートを防ぐためにゼロスケールはせず、最低2台イン スタンスが立ち上がるよう設定 => 常に一定以上のアクセスがあるためその分の固定料金と思えば気にならない => 大事なのは、使った分だけ課金というよりは、月当たりのトータル金額
  10. スケーラビリティ スケールを考えるシーンはふたつ 1.スパイクアクセス => 特定の記事がバズったとき => 特定のレコードへのアクセスにはキャッシュが効く (DB、Rails) => Cloud

    Run さえスケールできていれば気にしすぎることはない 2.アクティブユーザーの増加 => Cloud SQL への負荷も予測できる => 手動での垂直スケール(メンテして性能強化)で対応