2025-10-20

Cloud RunでCloud SQL接続するときは接続待機が必要

Cloud Run JobsでCloud SQL接続 ( /cloudsql/{instance_connection_name} のUDSを使った接続)を使っている場合、アプリケーションコードからすぐに接続すると以下のような接続エラーが発生するときがある。

Can't reach database server at /cloudsql/{project}:{region}:{instance}:5432
Please make sure your database server is running at /cloudsql/{project}:{region}:{instance}:5432.

検証したところ立ち上がり時の接続のタイムラグがありそうだったので、DB接続待ちのコードを入れれば解消できる。例えば、Node.js / Prismaを使っている場合は、以下のようなコードをアプリケーションコードの事前処理に入れればOK。

async function waitForDB() {
  const retry = 10; // retry count
  const interval = 5000; // retry interval in milliseconds
  
  for (let i = 0; i < retry; i++) {
    try {
      logger.info(
        `Attempting to connect to DB (attempt ${i + 1}/${retries})...`,
      );
      await prismaClient.$queryRaw`SELECT 1`;
      logger.info("Successfully connected to the database!");
      return;
    } catch (error) {
      const errorMessage =
        error instanceof Error ? error.message : String(error);
      logger.error(`Failed to connect to DB: ${errorMessage}`);
      if (i < retries - 1) {
        logger.info(`Retrying in ${interval / 1000} seconds...`);
        await new Promise((resolve) => setTimeout(resolve, interval));
      } else {
        logger.error("Max retries reached. Could not connect to the database.");
        throw error; // 全ての試行が失敗したらエラーをスロー
      }
    }
  }
}

async function main() {
  await waitForDB();
  
  // アプリケーションコード ...
}