🥺

Prisma Migrate の小ネタ

2024/12/09に公開

この記事は Magic Moment Advent Calendar 2024 6 日目の記事です。

前回に引き続き @nagomiso です。

ラーメンは二郎系が好きだったのですが最近は家系とちゃん系にもハマっています 🍜 デロ麺が好きなので家系はふつうかヤワメを頼みます。ちゃん系はデフォルトで加水率高めの麺なのでよきです。

はじめに

この記事は超小ネタです。気軽な気持ちでご笑覧ください。

2024 年は何故か Prisma の Migrate に触れる機会が何度かあったのでそのときの話を記事にします[1]。技術要素弱めで教訓めいた記事になります。

今回遭遇した困りごと

進まぬ Migrate Job

prisma migrate deploy を実行する Cloud Run Job を定義して CD ワークフロー上で実行するようにしたのですがその Job が進まず Timeout してしまうという事象に遭遇しました。

当初自分は調査に関わっていなかったのですが調査の中で「Cloud Run Job 上で実行されているコンテナイメージに問題があるのではないか」という話が挙がりました。そこでたまたま手持ちのタスクが落ち着いていたかつ普段から Dockerfile を書く機会の多い Docker おじさんだった自分が調査に乗り出してみたのでした。

デバッグログを見てみる

Job のログを見ていると prisma migrate deploy 実行がどこかで止まっていることはすぐにわかりました。しかし何故止まっているのか・どこで止まっているのかがわからなかったので DEBUG="prisma*" をコンテナへ渡す環境変数に設定してデバッグログを出力するようにしてみました。

Outbound の通信が発生していることが判明する

デバッグログを見ていると ↓ で実装されているデバッグログが出力されている事に気がつきました。

https://github.com/prisma/prisma/blob/7a5c9657e39a2dcdc828ec9b2b3623ecaaaac30c/packages/engines/src/index.ts#L41
https://github.com/prisma/prisma/blob/8a42483e9dfef4a402501c0fb2f9f85a95c894bc/packages/fetch-engine/src/download.ts#L169

ログのメッセージや実装を読んでみるとどうやら Prisma は足りないバイナリファイルを Migrate 実行時にダウンロードしようとするようです。

https://github.com/prisma/prisma/blob/7a5c9657e39a2dcdc828ec9b2b3623ecaaaac30c/packages/cli/src/CLI.ts#L65
https://github.com/prisma/prisma/blob/7a5c9657e39a2dcdc828ec9b2b3623ecaaaac30c/packages/engines/src/index.ts#L28-L49

つまり prisma migrate deploy を実行するときに思わぬ Outbound 通信が発生していたわけです。加えてこのダウンロード時のデバッグログが出力されて以降 Job の進行が停止することも判明しました。

こうした状況証拠から私は「この事象はコンテナイメージではなくネットワーク起因で問題が生じているのではないか」という考えに至りました。そして Migrate を実行する Cloud Run Job のネットワーク設定を見直したところ無事 Job が完了するようになりました。Timeout の原因はやはりバイナリダウンロード時の外部通信だったようです。

当初 Migration Job 実行で外部に通信する(そして動的にバイナリをダウンロードする)ことを想定していなかったのですが原因を決めつけてはいけないという教訓ですね。

ダウンロードが走らないようにする

色々調べてみた結果イメージビルド時にあらかじめ OpenSSL をインストールしておけば Job 実行時に Prisma によるダウンロードが実行されなくなるとわかりました。無駄な通信はしない方が良いのでネットワークの設定は元に戻し OpenSSL をインストールしたイメージ作ってそれを使用することにして本件は解決したのでした[2]

おわりに

今回の事象によって Node.js 用 ORM として有名な Prisma はコマンド実行時に外部通信をする可能性があり, その点を考慮してネットワークの設定や実行イメージの作り方に気をつけるべしという技術的知見を得ました。

また技術的な知見を得ただけではなく

  • よく分からない事象に遭遇したらまずデバッグログを出力してみる
  • 変な前提・決めつけを持たずにログから事実ベースで原因を探る

という IT 系開発者として極めて基本的な事項の重要性を改めて感じることになりました。

以上, 技術要素薄めな超小ネタ記事でした。お付き合いいただきありがとうございます 🙇‍♂

次回のアドベントカレンダーは doi さん の 「LLMの要約結果を評価する」 です。お楽しみに!

脚注
  1. 普段は Python と Go を書いている人なので Prisma に触れる機会がこんなに訪れるとは思いもしてみませんでした 😇 ↩︎

  2. ちなみに前回の記事で紹介した LiteLLM も Migration Job 実行で Job が進まずに止まってしまう事象に遭遇しましたがこちらも似たような現象が原因で必要なバイナリをイメージに含めることで解決しました。LiteLLM は Python 製ですが Prisma Client 使っているんですよね……。 ↩︎

Discussion