💡
Cloud Run Functions + Cloud SQLでError: connect ENOENT /cloudsql/の対処法
問題
{"address":"/cloudsql/project-id:xxxx", "code":"ENOENT", "errno":-2, "fatal":true, "level":"error", "syscall":"connect"}
ずっとENOENTが出る。
結論
- 新しいリビジョンの編集とデプロイ
- Cloud SQL接続→接続したいCloud SQLのインスタンスを選択
- デプロイ
サンプルコード
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"
},
}
どうやって気づいたか?
最初に関数をデプロイします。
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インスタンスへの接続設定をする必要がある。
参考
P.S.
結局これで2日溶かした。公式ドキュメントのリポジトリが動かないのも同じ原因だった…。
Discussion