#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でできないのか??
- 参考になれば:https://github.com/inoue2002/hausra-service-template/blob/main/terraform/build.sh
- シェルスクリプトでtagを生成してbuild&pushに使ってる
- それしかないのかーーー
- せっかくならterraformで完結させたかったけど、まぁしかたない
- あざす!
悩み
- backendのlocal開発環境と、本番環境でDBの扱いが変わるので、そこが難しい
- localのDBは
supabase start||npx supabase startでlocalのDockerにDBを作成している - Cloud runにdeployするときは、
- localのDBは
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