はじめに
Google Cloud Platform (GCP) には魅力的な無料枠があり、操作も比較的簡単そうだったのでGCP上に構築したNode.js+MySQLのスタックを接続してみました。
今回はGCPのApp EngineにNode.jsのアプリを構築し、Cloud SQL第二世代にMySQLを構築させました。
https://cloud.google.com/sql/docs/mysql/connect-app-engine?hl=ja
接続についてはこのリファレンスを読みましたがNode.jsが載っていなかったので書き残します。
料金について
App Engineは規模が小さい場合基本的に無料ですが、Cloud SQLの運用は課金されました。
無料枠について:https://cloud.google.com/free/?hl=ja
Cloud SQL料金について:https://cloud.google.com/sql/pricing?hl=ja
Instanceの接続名の確認
Instanceの接続名はCloud SQLの接続に必要な項目です。project_id:region:instance_id
の形式の文字列です。
GCPの「インスタンスの詳細」画面の中の「このインスタンスに接続」というボックスの中に表示されています。
これをコピーして、環境変数として保存しておきます。
# プロジェクト名:hoge、インスタンス名:hoge-db、地域:東京 の場合
INSTANCE_CONNECTION_NAME="hoge:asia-northeast1:hoge-db"
MySQL関係の項目の確認
Node.jsからMySQLにアクセスするにはもちろんデータベース情報が必要なので、これも一緒に環境変数として保存しておきます。
# ...
DB_USER="hogehoge"
DB_PASSWORD="fugafuga"
DB_DATABASE="piyopiyo"
Node.js側の設定
Node.jsからMySQLに接続するモジュールは色々ありますが、mysql
というクライエントを使いました。
App Engineのスタンダード環境からCloud SQLのDatabaseに接続するときには、普通にTCPでは接続できないため、Unix Domain Socketという方法で接続します。
環境変数はdotenv
というパッケージを使って取り込みました。
require('dotenv').config();
const mysql = require('mysql');
const connection = mysql.createConnection({
socketPath: `/cloudsql/${process.env.INSTANCE_CONNECTION_NAME}`,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE
});
App Engineスタンダード環境の場合、/cloudsql/<インスタンス接続名>
のソケットが自動的に提供されるようなのでこのほかに何も設定する必要はありません。
接続プール
パフォーマンスを上げるためにプールを使う場合も、同じように接続できます。
const pool = mysql.createPool({
user: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_NAME,
socketPath: `/cloudsql/${process.env.INSTANCE_CONNECTION_NAME}`
});
接続数上限
プールを使用する場合、接続数の上限も設定できます。
const pool = mysql.createPool({
// ...
connectionLimit: 5
});
TCPとの併用
開発環境ではローカルのMySQLにTCPで接続してほしかったので、NODE_ENV
の環境変数に合わせて接続方法を変えるようにしました。
const pool = process.env.NODE_ENV === 'production'
? mysql.createPool({
user: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_NAME,
socketPath: `/cloudsql/${process.env.INSTANCE_CONNECTION_NAME}`
}) : mysql.createPool({
user: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_NAME,
host: 'localhost'
});
完成
gcloud app deploy
を実行してアクセスすると、データベースに接続できているはずです。
App EngineとCloud SQLのインスタンスが別々のプロジェクトの下に作られている場合、IAMを変更する必要があります。
App EngineのサービスアカウントにCloud SQL Admin
Cloud SQL Editor
Cloud SQL Client
の役割のいずれかを与えると動くそうです。
感想
GCPは比較的安価でNode.js、MySQLの環境構築をすることができるので魅力的です。リファレンスにNode.jsがなかったので少し手こずりましたが、無事接続できました。
最初の記事なので、少し間違えていたらすみませんv_v。