前提・実現したいこと
Google App Engineのstandard環境からnode.jsにてCloud SQLに接続したい
※接続方法はUNIXドメインソケットです。
発生している問題・エラーメッセージ
エラーメッセージ Error: connect ENOENT /cloudsql/<cloud sqlのインスタンス接続名>
以下のURLの内容を元に、実装しているのですが、npm startした時にみてみると上記のエラーメッセージが表示されてしまいます
app.yamlで環境変数を設定もし、yamlファイルの名称も「app.standard.yaml」などで試してもだめでした。
https://cloud.google.com/sql/docs/mysql/connect-app-engine-standard#node.js
https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/main/cloud-sql/mysql/mysql/server.js
該当のソースコード
ソースコード 'use strict'; const express = require('express'); const mysql = require('promise-mysql'); const fs = require('fs'); const app = express(); app.set('view engine', 'pug'); app.enable('trust proxy'); app.use(express.urlencoded({extended: false})); app.use(express.json()); app.use((req, res, next) => { res.set('Content-Type', 'text/html'); next(); }); const winston = require('winston'); const {LoggingWinston} = require('@google-cloud/logging-winston'); const loggingWinston = new LoggingWinston(); const logger = winston.createLogger({ level: 'info', transports: [new winston.transports.Console(), loggingWinston], }); // [START cloud_sql_mysql_mysql_create_socket] const createUnixSocketPool = async config => { const dbSocketPath = process.env.DB_SOCKET_PATH || '/cloudsql'; // Establish a connection to the database return mysql.createPool({ user: process.env.DB_USER, // e.g. 'my-db-user' password: process.env.DB_PASS, // e.g. 'my-db-password' database: process.env.DB_NAME, // e.g. 'my-database' // If connecting via unix domain socket, specify the path socketPath: `${dbSocketPath}/${process.env.INSTANCE_CONNECTION_NAME}`, // Specify additional properties here. ...config, }); }; // [END cloud_sql_mysql_mysql_create_socket] const createPool = async () => { const config = { connectionLimit: 10, connectTimeout: 10000, // 10 seconds acquireTimeout: 10000, // 10 seconds waitForConnections: true, // Default: true queueLimit: 0, // Default: 0 }; return createUnixSocketPool(config); }; const createPoolAndEnsureSchema = async () => await createPool() .then(pool => { return pool; }) .catch(err => { logger.error(err); throw err; }); let pool; app.use(async (req, res, next) => { if (pool) { return next(); } try { pool = await createPoolAndEnsureSchema(); next(); } catch (err) { logger.error(err); return next(err); } } ); // Serve the index page, showing vote tallies. app.get('/', async (req, res) => { pool = pool || (await createPoolAndEnsureSchema()); try { const recentVotesQuery = pool.query( 'SELECT * FROM table_names;', (error, results) => { res.render('top.ejs', {table_names: results}); } ); } catch (err) { logger.error(err); res .status(500) .send( 'Unable to load page. Please check the application logs for more details.' ) .end(); } }); const PORT = process.env.PORT || 8080; const server = app.listen(PORT, () => { console.log(`App listening on port ${PORT}`); console.log('Press Ctrl+C to quit.'); }); process.on('unhandledRejection', err => { console.error(err); throw err; }); module.exports = server;
試したこと
・環境変数(yamlファイル内)の文字がきちんとあっているかの確認
・SQへcloud shellからアクセスをしてテーブルの中身は確認済み
補足情報(FW/ツールのバージョンなど)
connect ENOENTになる原因がググってもあまり出てこずで困っております。。。
あなたの回答
tips
プレビュー