263 Views
March 22, 25
スライド概要
AWS ECS / Lambda で Prisma を使って単一のDBを扱う tottoruby #54 @watti
schema.prisma ファイルに DB のスキーマを記述 prisma migrate で Migration を作成・適用 prisma generate でアプリで利用するClientとモデルを生成 生成された Client を使って DB にアクセス 2
schema.prisma 3
prisma migrate schema.prisma を元にMigrationを生成してDBに適用する Migrationの状態は _prisma_migrations テーブルに保存される 4
prisma generate schema.prisma を元にクライアントを生成する @prisma/client は上記 index.js を参照する 5
AWS ECS / Lambda で Prisma を使って単一のDBを扱う APIと非同期処理で同じDBにアクセスするようなケース。 6
schema 管理 / migration 実行 ECS Task側で行う コンテナ起動時に entrypioint で prisma migrate deploy 実行 Lambda 側からはECS Task側の schema.prisma を参照する Lambda のデプロイ前にクライアント生成してzipに含める 7
アプリケーションの構成・環境 実装・単体テストはホストで ローカルでの結合確認は docker-compose で諸々起動して実行 AWS環境の構築・デプロイは CDK で行う 8
Prisma の Schema を Lambda 側に共有する Lambda からは Symbolic Link で参照する --schema 指定だと ECS Task 側にクライアント生成された package.json の設定で指定しても同じ 9
docker-compose のコンテナには実態を持っていく Dockerfile で COPY できるように context を指定する 10
Dockerfile で クライアントを生成 npm install の postinstall で prisma generate が実行される 11
AWS Lambda Function で Prisma を動かす デプロイする zip に生成した Prisma Client を含める node_modules/.prisma/client/* 環境変数指定 DATABASE_URL PRISMA_QUERY_ENGINE_LIBRARY 12
AWS Lambda Function で Prisma 実行エラー Prisma Client が ARM Macで作成されているので怒られてる Lambda は Amazon Linux 2023 なのでそれ用の openssl が必要 13
対応 : 利用するopensslを指定する schema.prisma に binaryTargets を記載して npm install postinstall の prisma generate 時にダウンロードされる 環境変数 PRISMA_QUERY_ENGINE_LIBRARY にパスを指定 ARM Macだと libquery_engine-linux-arm64-openssl-3.0.x.so.node を使う Dockerコンテナはnpm install時に解決されるので問題にならない 14
Lambda(Prisma) - RDS の構成 RDS Proxyを使っていない Prisma が RDS Proxy と同等の機能を持っている Prismaもコネクションプールを持ってる Prisma Client をグローバル変数に設定しておけば使いまわせる (ウォームスタンバイ時) LambdaのスケールにRDS Proxyが追いつかないことがある PrismaのpoolSizeを適切に設定しておけば良い ので不要とのこと 15
RDS ProxyのPinning問題 「プロキシへの接続は、ピンニングと呼ばれる状態になることがあります。 接続がピンニングされると、セッションが終了するまで、後続の各トランザ クションは同じ基礎となるデータベース接続を使用します。他のクライアン ト接続も、セッションが終了するまでそのデータベース接続を再利用できま せん。Prisma クライアントの接続が切断されると、セッションは終了しま す。」 -AWS RDS プロキシドキュメント Lambda と RDS Proxy の接続が固定化されてしまい、 接続を切るまでそのプールが使えなくなる コネクションプールの利点がなくなるので Prisma単体で良い https://www.prisma.io/docs/orm/prisma-client/deployment/caveats-when-deploying-to-aws-platforms https://www.prisma.io/docs/orm/prisma-client/setup-and-configuration/databases-connections#aws-rds-proxy 16
Prisma v6.0.0 で yarn v1 workspaces のサポートが切れた yarn install で prisma client が生成されなくなった 原因 : v6.0.0 で yarn v1 の workspaces に関するコードが消えた yarn v1自体が相当古いので何も言えない リリースノートには何の言及もなかった 対応 : yarn install 後に prisma generate も叩く https://github.com/prisma/prisma/compare/5.22.0...6.0.0#diff-4bdba338d6f6593f728c0026a632829646c1b9c5406d1f9c15fdd6ef31ad7031 17
感想 Prisma の利用体験的はなかなか良い 実装書くことに集中できる感がある schema.prisma だけ共有すればどうとでもなる 開発中とかCI環境とか prisma db push で済ませられる AWS Lambda で Prisma を真面目に使うならチューニング必須 そのLambdaの特性に合わせた設定にする必要がある 公式にもそんなことが書いてある 18
おわり 19