AWS ECS / Lambda で Prisma を使って単一のDBを扱う

263 Views

March 22, 25

スライド概要

profile-image

主にWeb特にBackendを主としています。 最近はアジャイル開発の伴走支援をしています。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

AWS ECS / Lambda で Prisma を使って単一のDBを扱う tottoruby #54 @watti

2.

schema.prisma ファイルに DB のスキーマを記述 prisma migrate で Migration を作成・適用 prisma generate でアプリで利用するClientとモデルを生成 生成された Client を使って DB にアクセス 2

3.

schema.prisma 3

4.

prisma migrate schema.prisma を元にMigrationを生成してDBに適用する Migrationの状態は _prisma_migrations テーブルに保存される 4

5.

prisma generate schema.prisma を元にクライアントを生成する @prisma/client は上記 index.js を参照する 5

6.

AWS ECS / Lambda で Prisma を使って単一のDBを扱う APIと非同期処理で同じDBにアクセスするようなケース。 6

7.

schema 管理 / migration 実行 ECS Task側で行う コンテナ起動時に entrypioint で prisma migrate deploy 実行 Lambda 側からはECS Task側の schema.prisma を参照する Lambda のデプロイ前にクライアント生成してzipに含める 7

8.

アプリケーションの構成・環境 実装・単体テストはホストで ローカルでの結合確認は docker-compose で諸々起動して実行 AWS環境の構築・デプロイは CDK で行う 8

9.

Prisma の Schema を Lambda 側に共有する Lambda からは Symbolic Link で参照する --schema 指定だと ECS Task 側にクライアント生成された package.json の設定で指定しても同じ 9

10.

docker-compose のコンテナには実態を持っていく Dockerfile で COPY できるように context を指定する 10

11.

Dockerfile で クライアントを生成 npm install の postinstall で prisma generate が実行される 11

12.

AWS Lambda Function で Prisma を動かす デプロイする zip に生成した Prisma Client を含める node_modules/.prisma/client/* 環境変数指定 DATABASE_URL PRISMA_QUERY_ENGINE_LIBRARY 12

13.

AWS Lambda Function で Prisma 実行エラー Prisma Client が ARM Macで作成されているので怒られてる Lambda は Amazon Linux 2023 なのでそれ用の openssl が必要 13

14.

対応 : 利用する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

15.

Lambda(Prisma) - RDS の構成 RDS Proxyを使っていない Prisma が RDS Proxy と同等の機能を持っている Prismaもコネクションプールを持ってる Prisma Client をグローバル変数に設定しておけば使いまわせる (ウォームスタンバイ時) LambdaのスケールにRDS Proxyが追いつかないことがある PrismaのpoolSizeを適切に設定しておけば良い ので不要とのこと 15

16.

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

17.

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

18.

感想 Prisma の利用体験的はなかなか良い 実装書くことに集中できる感がある schema.prisma だけ共有すればどうとでもなる 開発中とかCI環境とか prisma db push で済ませられる AWS Lambda で Prisma を真面目に使うならチューニング必須 そのLambdaの特性に合わせた設定にする必要がある 公式にもそんなことが書いてある 18

19.

おわり 19