Cloud Run prisma Next.js Nest.js orval swaggerを積んだフルスタックアプリケーションを作りたい
public.icon
ここに作った
結論: かなりいい感じにできて最高!技術的に成長している感じがする
あとはdeploy周りとかができたらいいな
正直最初がGrapgQLを使っていたけど、あれはまだいらない感じかなkinjyo.icon
バックエンド側
APIを何個も作るのはしんどいので、一つでqueryでいい感じに取得できるようにしたい
フロントエンド側
ロジックはswaggerから生成したhookと型を使うようにしたい
作るものはTodoアプリでいい
まずはローカルで動くようにする
Nest.jsから作成する
基本的にはなしでもいいかもしれない
メリット部分は理解できるけど、それに伴ってのライブラリが多くて、難しく感じる
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がないと怒られる
code:main.tf
╷
│ 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でできないのか??
シェルスクリプトでtagを生成してbuild&pushに使ってるinoue2002.icon*2
それしかないのかーーーkinjyo.icon
せっかくならterraformで完結させたかったけど、まぁしかたない
あざす!kinjyo.icon
悩み
backendのlocal開発環境と、本番環境でDBの扱いが変わるので、そこが難しい
localのDBはsupabase start || npx supabase startでlocalのDockerにDBを作成している
Cloud runにdeployするときは、
code:shell
│ 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).
だいたいこの上にエラーが吐かれている
code:err
Cloud RunCreateServicenestjs-backendabcshotaro616@gmail.com {@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して
参考資料