問題
以下の、Prisma 公式の Serverless を使った Lambda へのデプロイ方法の記事を参考にデプロイを試した。
ここで、TSプロジェクトとしてデプロイするため serverless-plugin-typescript
を使用している。
しかし、serverless deploy
時に以下のエラーが発生。
Error EPERM: operation not permitted
対処
先ほどの公式記事で、デプロイ時に容量削減のため node_module から余計なモジュールをはじくための設定をする項がある。
これは、serverless.yml
に以下の項目を追加することで実現している。
package:
patterns:
- '!node_modules/.prisma/client/libquery_engine-*'
- 'node_modules/.prisma/client/libquery_engine-rhel-*'
- '!node_modules/prisma/libquery_engine-*'
- '!node_modules/@prisma/engines/**'
しかし、実はこの設定が原因でエラーになっているようだ。これは serverless-plugin-typescript
の問題らしい。1
理由はわかっていないが、この上の二つをコメントアウトすることで機能した。
package:
patterns:
# - '!node_modules/.prisma/client/libquery_engine-*'
# - 'node_modules/.prisma/client/libquery_engine-rhel-*'
- '!node_modules/prisma/libquery_engine-*'
- '!node_modules/@prisma/engines/**'
ただし、容量は大きくなってしまう...
容量もちゃんと削減したい
Lambda の 50MB 制約もあって、容量削減は結構大事だったりする。
↑の issue でこの問題について精力的にディスカッションされているのでコメントしたところ、容量削減もできる方法をコメントで頂いた。
まだ試せていないが、うまくいくのであればこちらをお勧めする。
方法
まず serverless.yml に以下の項目を追加する。
package:
individually: true
そして、Prisma を使用しているすべての関数において除外パターンを設定する。
functions:
function-name:
# ...
package:
patterns:
- "!node_modules/.prisma/client/libquery_engine-*"
- "node_modules/.prisma/client/libquery_engine-rhel-*"
- "!node_modules/prisma/libquery_engine-*"
- "!node_modules/@prisma/engines/**"