記事

Cloud Run prisma Next.js Nest.js orval swaggerを積んだフルスタックアプリケーションを作りたい

#tech

Cloud Run
prisma
Next.js
orval
swagger

https://github.com/kinjo1130/fullstack-todo-app

  • ここに作った
  • 結論: かなりいい感じにできて最高!技術的に成長している感じがする
    • あとはdeploy周りとかができたらいいな
    • terraformを使って、インフラの整備

正直最初がGrapgQLを使っていたけど、あれはまだいらない感じかな

バックエンド側

  • APIを何個も作るのはしんどいので、一つでqueryでいい感じに取得できるようにしたい

フロントエンド側

  • ロジックはswaggerから生成したhookと型を使うようにしたい

作るものはTodoアプリでいい

まずはローカルで動くようにする

  • Nest.jsから作成する

GraphQLを入れるとかなり学習コストが跳ね上がる

  • 基本的にはなしでもいいかもしれない
  • メリット部分は理解できるけど、それに伴ってのライブラリが多くて、難しく感じる

Nest.jsとprismaでswaggerを生成できたらいいかもしれない

GraphQLにはスキーマファーストとコードファーストという考えがあるらしい

一回deployを考えずに、ローカルで動作するところまでやってみる

  • DBはDockerで作成したものを使うようにする

$ Module '"@prisma/client"' has no exported member 'PrismaClient'.

  • $ npx prisma generate

疑問点

  • prismaのschemaをDTOで二重で型を管理しないといけないのはどうにかならない?
    • swaggerのためにDTOで@ApiProperty()を書く必要がある

localではpostgresqlをDockerで構築しているので、本番で使うならちゃんと使えるやつを選ばないといけない

  • firestore
  • supabase

supabaseのtableがないときは、prismaのschemaでmigrationするとmodelのtableが発行される

terraformでいい感じにインフラを整えようとしたら、GCRにdockerで作られているはずのimageがないと怒られる

  • ╷
    │ Error: Error waiting to create Service: resource is in failed state "Ready:False", message: Revision 'nestjs-backend-00001-t7j' is not ready and cannot serve traffic. Image 'gcr.io/rakutabi-76a1a/nestjs-backend:latest' not found.
    │ 
    │   with google_cloud_run_service.backend,
    │   on main.tf line 23, in resource "google_cloud_run_service" "backend":
    │   23: resource "google_cloud_run_service" "backend" {
    │ 
    ╵
    ╷
    │ Error: Error waiting to create Service: resource is in failed state "Ready:False", message: Revision 'nextjs-frontend-00001-7c9' is not ready and cannot serve traffic. Image 'gcr.io/rakutabi-76a1a/nextjs-frontend:latest' not found.
    │ 
    │   with google_cloud_run_service.frontend,
    │   on main.tf line 52, in resource "google_cloud_run_service" "frontend":
    │   52: resource "google_cloud_run_service" "frontend" {
    │ 

localで作ったDockeのイメージをGCPにtagをつけて、pushする

$ docker tag XXXXXX gcr.io/<GCPのProject ID>/XXXXXX:latest
$ docker push gcr.io/<GCPのProject ID>/XXXXX:latest

インフラメモ

  • dockerで作ったイメージをGCPのどっかに保存しておかないといけない
  • GCR(Google Container Registry)
    • ここにおくのが良さそう

GCRにtag付けとpushをいい感じにterraformでできないのか??

悩み

  • backendのlocal開発環境と、本番環境でDBの扱いが変わるので、そこが難しい
    • localのDBはsupabase start || npx supabase startでlocalのDockerにDBを作成している
    • Cloud runにdeployするときは、

https://blog.ojisan.io/cloudrun-8080-error-reason/

  • │ Error: Error waiting to create Service: resource is in failed state "Ready:False", message: Revision 'nestjs-backend-00001-wvx' is not ready and cannot serve traffic. The user-provided container failed to start and listen on the port defined provided by the PORT=8080 environment variable. Logs for this revision might contain more information.

portが相手ないと言われるけど、そういうわけではないのはほとんど
$ Container called exit(1).

  • だいたいこの上にエラーが吐かれている
Cloud [email protected] {@type: type.googleapis.com/google.cloud.audit.AuditLog, authenticationInfo: {…}, authorizationInfo: […], methodName: google.cloud.run.v1.Services.CreateService, request: {…}, requestMetadata: {…}, resourceLocation: {…}, resourceName: namespaces/rakutabi-76a1a/services/nestjs-backend, response: {…},…
2024-10-06 20:21:03.282 JST
Environment variables loaded from .env
2024-10-06 20:21:03.283 JST
Prisma schema loaded from prisma/schema.prisma
2024-10-06 20:21:03.292 JST
Datasource "db": PostgreSQL database "postgres", schema "public" at "aws-0-ap-northeast-1.pooler.supabase.com:6543"
  • ここから進まない
  • 2024/10/8
    • prismaのmigrationができてないのが問題らしい
  • ちゃんといけた
  • フロントのenv周りもいい感じにCOPYして

参考資料
https://zenn.dev/waddy/books/graphql-nestjs-nextjs-bootcamp/viewer/nestjs
https://qiita.com/eno49conan/items/4596c1983ee5e3f9e324
https://zenn.dev/ring_belle/books/gcp-cloudrun-terraform/viewer/cloudrun-docker

© 2026 Shotaro Kinjo