💡

Cloud Run Functions + Cloud SQLでError: connect ENOENT /cloudsql/の対処法

2024/12/05に公開

問題

{"address":"/cloudsql/project-id:xxxx", "code":"ENOENT", "errno":-2, "fatal":true, "level":"error", "syscall":"connect"}

ずっとENOENTが出る。

結論

  1. 新しいリビジョンの編集とデプロイ
  2. Cloud SQL接続→接続したいCloud SQLのインスタンスを選択
  3. デプロイ

サンプルコード

const functions = require('@google-cloud/functions-framework');
const mysql = require('mysql');

const connectionName = 'リージョン接続名';
const dbUser = 'user名';
const dbPassword = 'password';
const dbName = 'dbの名前';

// Promise化したデータベース操作を作成
function queryDatabase() {
  return new Promise((resolve, reject) => {
    const connection = mysql.createConnection({
      socketPath: `/cloudsql/${connectionName}`,
      user: dbUser,
      password: dbPassword,
      database: dbName
    });

    connection.connect((err) => {
      if (err) {
        connection.end();
        reject(err);
        return;
      }

      connection.query('SELECT * FROM users', (err, results) => {
        connection.end();
        if (err) {
          reject(err);
        } else {
          resolve(results);
        }
      });
    });
  });
}

// メインのハンドラー関数
functions.http('helloHttp', async (req, res) => {
  try {
    const results = await queryDatabase();
    res.status(200).send(JSON.stringify(results));
  } catch (error) {
    console.error('Database error:', error);
    res.status(500).send({
      error: 'Database operation failed',
      details: error.message
    });
  }
});
package.json
{
  "name": "cloud-function-mysql",
  "version": "1.0.0",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^3.0.0",
    "mysql": "^2.18.1"
  },
}

どうやって気づいたか?


https://cloud.google.com/sql/docs/mysql/connect-functions?hl=ja#configure

最初に関数をデプロイします。
Google Cloud コンソールで Cloud Functions の関数を初めて作成したときには、基盤となる Cloud Run サービスがまだ作成されていません。Cloud SQL 接続は、(Cloud Function をデプロイすることで)そのサービスが作成されるまで構成できません。
Google Cloud コンソールの [関数の詳細] ページの右上にある [Powered by Cloud Run] で、リンクをクリックして、基になる Cloud Run サービスにアクセスします。
Cloud Run の [サービスの詳細] ページで、[新しいリビジョンの編集とデプロイ] タブを選択します。
標準手順(構成が変更された場合)に従って、Cloud SQL 接続に新しい構成を設定します。
これによって新しい Cloud Run リビジョンが作成されます。明示的に変更しない限り、以降のリビジョンはこの Cloud SQL 接続を自動的に受信します。

→つまり、新しいリビジョンの編集とデプロイからcloud sqlインスタンスへの接続設定をする必要がある。

参考

https://zenn.dev/tbsten/articles/169b9239a707e8
https://zenn.dev/naonao70/articles/c322f7d63aa32d
https://cloud.google.com/sql/docs/mysql/connect-instance-cloud-functions?hl=ja
https://qiita.com/_takeshi_24/items/c425d65916598b0242fb
https://blog.g-gen.co.jp/entry/from-cloudrun-to-cloud-sql-with-auth-proxy
https://qiita.com/ryu-yama/items/f635a7608469bf019de7
https://qiita.com/RjChiba/items/616168161c56ac52f7a2
https://zenn.dev/google_cloud_jp/articles/cloudrun-vpc
https://zenn.dev/naonao70/articles/cf12356254b249
https://zenn.dev/xbit/articles/669eb165726a3d
https://zenn.dev/hosaka313/scraps/e43fde2fb5f0df

P.S.

結局これで2日溶かした。公式ドキュメントのリポジトリが動かないのも同じ原因だった…。

Discussion