【Prisma】Cloud BuildでMigrateしてみた

こんにちは、フリーランスエンジニアの太田雅昭です。

Cloud BuildでMigrate

いくつか方法を試してみたのですが、どうもうまくいかなかったため、次善策を採用しました。試したのは以下です。

  • Cloud Build内でMigrateを実行
  • Cloud FunctionsでMigrate
  • Cloud RunでMigrate

Cloud Build内でMigrate => うまくいかなかった

本来はCloud Build内で完結できるのが理想かと思います。色々調べると、exe-wrapperを使えばいいとは分かりました。これは、Cloud SQLへの接続を簡単にしてくれるもののようです。ただしdockerを使う必要があるため、少し面倒です。それを踏まえて以下のようにしてみました。Dockerコンテナ内に、必要なprisma実行環境と、migrationファイルがある状態です。

# _SQL_INSTANCE:  Cloud SQL instance name

steps:
    # Build the container image
    - name: 'gcr.io/cloud-builders/docker'
      args:
          [
              'build',
              '-t',
              'asia-northeast1-docker.pkg.dev/$PROJECT_ID/default-docker/prisma-migrate:$COMMIT_SHA',
              '-f',
              'Dockerfile.prisma',
              '.',
          ]
    # Push the container image to Container Registry
    - name: 'gcr.io/cloud-builders/docker'
      args:
          [
              'push',
              'asia-northeast1-docker.pkg.dev/$PROJECT_ID/default-docker/prisma-migrate:$COMMIT_SHA',
          ]
    # Migrate
    - name: "gcr.io/google-appengine/exec-wrapper"
      entrypoint: "bash"
      args:
      - -c
      - |
        /buildstep/execute.sh \
          -i asia-northeast1-docker.pkg.dev/$PROJECT_ID/default-docker/prisma-migrate:$COMMIT_SHA \
          -s $_SQL_INSTANCE \
          -e DATABASE_URL=$$DATABASE_URL \
          -- npx prisma migrate deploy
      secretEnv: ['DATABASE_URL']
availableSecrets:
  secretManager:
  - versionName: projects/$PROJECT_ID/secrets/DATABASE_URL/versions/latest
    env: 'DATABASE_URL'
options:
    logging: CLOUD_LOGGING_ONLY

ところが上記コードでは、データベースに接続できないといったエラーが出てしまいます。どうやっても無理でした。。。

Cloud FunctionsでMigrate => 見送り

Cloud Functionsだと、Cloud Buildと連携させるには少し面倒なようです。他のパッケージがCloud Buildで扱っているため、統一したい。そのため、これは却下しました。。。

Cloud RunでMigrate

最後に、次善策でCloud Runで実行することにしました。ちょっと不適切な感じもしますが、ひとまずこれでよしとします。

Dockerfile

FROM node:20.11-alpine3.18 as base

ENV NODE_ENV=production

WORKDIR /app

RUN apk add --no-cache python3 make g++ && \
    ln -sf python3 /usr/bin/python

RUN yarn global add prisma


COPY /packages/api/prisma /app/prisma

# エラーを出さないように、migrateした後に形だけリッスンする
CMD npx prisma migrate deploy && \
    echo "Prisma migration completed, starting dummy server..." && \
    npx http-server -p $PORT

上記Dockerfileを、Cloud Runで読み込むだけです。Cloud Runでは、VPCネットワークの設定、およびCloud SQL接続設定も済ませます。これで、無事Migrateできました。トリガーも自動生成されるので、便利ですね。なおトリガーはいつも手動設定にしていますが、これは個人の好みかと思います。

余談

クラフトボスが好きなんですよ。コンビニに売ってるのですが、よく買っています。ただ、クラフト。。。?