急に知人から「任意のホームページをスクレイピングして、取得した要素をGoogle Cloud Pratform(GCP)のCloud SQL(MySQL)に保存するみたいな機能を作ってくれ!」と頼まれたので、 Node.jsで実装してみました。
今回お話しするのはローカル環境からCloud SQLに接続して,Node.jsでCloud SQLのデータが参照できる所までです。

実装する内容と順序

説明はGCPでプロジェクトの作成の作成は既に完了していることが前提となります。


話の構成としては大きく分けて、

  1. ローカル環境からCloud SQLに接続する準備
  2. Node.jsでCloud SQLのデータベースを覗く
の2つになります。
ではローカル環境からCloud SQLに接続してみましょう!

ローカル環境からCloud SQLに接続する

先ずはターミナルから操作するので、ターミナルを開いて順にコマンドを入力していってください。

Google Cloudにログイン

ターミナルからGoogle Cloudにログインします。

$ gcloud auth application-default login

Cloud SQLのサービスを有効化する

GCPのサービスをプロジェクトで初めて使う時は最初に「このサービス使いますよ〜」みたいな宣言(有効化)をしなければいけません。今回はCloud SQLを有効化します。

$ gcloud services enable sqladmin


Cloud SQL Proxyのインストール

Cloud SQL Proxyとは簡単に言うと、色々設定無しにローカルからCloud SQLに接続できる魔法のようなものです。 それぞれのOSの種類に合わせてインストールしてください。 ここではMac OS 64bit用のものをインストールします。

▼Mac OS 64bit用

$ curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
※Mac OS 64bit以外の方はこちらを参照してください。

権限を付与します。
$ chmod +x cloud_sql_proxy


Cloud SQL インスタンスの作成

下のページからCloud SQLのインスタンスを作成してください。
Cloud SQL for MySQL のクイックスタート 作成の際に操作したいテーブルも併せて作成してください。

ローカル環境からCloud SQLに接続

先ほど作成したインスタンスを[YOUR_INSTANCE_NAME]の所に入れて以下のコマンドをRunしてください。

$ gcloud sql instances describe [YOUR_INSTANCE_NAME]
Runすると以下のようなインスタンスの情報が表示されるので、connectionNameのをコピーしてください。
[CONNECTIONNAME]は[PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME]のような形式になっています。
ckendType: SECOND_GEN
connectionName: [CONNECTIONNAME]
databaseVersion: MYSQL_5_6
.
.
.

最後にコピーしたconnectionNameを[YOUR_INSTANCE_CONNECTION_NAME]に入れて以下のコマンドをRunして数秒待つと接続できます。

$ ./cloud_sql_proxy -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:3306
2020/02/13 23:37:00 Rlimits for file descriptors set to {&{000000000000000000}}
2020/02/13 23:37:03 Listening on 127.0.0.1:3306 for [YOUR_INSTANCE_CONNECTION_NAME]

注意接続を切るとNode.jsからデータベースを参照できなくなるので、ターミナルは一旦この状態のままにしてください。



これでローカルからCloud SQLへの接続は完了です。

Node.jsでCloud SQLのデータベースを参照

ローカルからCloud SQLにアクセスができるようになったので、Node.jsからデータベースをのぞいてみます。

完成したコード

コードの全体をお見せします。

const mysql = require('mysql');
const connection = mysql.createConnection({
  host: '127.0.0.1',
  user: '[ Your user name ]',
  password: '[ Your user password ]',
  database: '[ Your database name ]',
  port: 3306
});
connection.connect();
connection.query(`SELECT * From [ your table name ] LIMIT 10;`, (err, rows, fields) => {
  if (err) throw err;
  console.log(rows);
});
connection.end();

上記のコードの[ ]内の部分を自分のものに置き換えて使用してください。 やっていることを言語化すると以下のようになります。

  1. Cloud SQLに接続
  2. 任意のテーブルからすべてのデータを10行取得
  3. 接続を切る

ちなみに先ほど接続したCloud SQLを切ってしまっていた場合、以下のようなエラーが表示されます。

Error: connect ECONNREFUSED 127.0.0.1:3306



MySQLのモジュールのインストール

Node.jsでMySQLを使えるようにパッケージをインストールしてください。

$ npm install mysql

まとめ

ローカル環境からCloud SQLに接続するまでが中々手こずりましたが、なんとかNode.jsでMySQLのデータを参照することができました。

Node.jsのスクレイピングに関しては
Node.jsとjQuery!スクレイピングしてhtml要素を取ってみた
に記載しています。
ここまで読んでくれてありがとうございました!
質問等ありましたらSNSから気軽に連絡ください。
またね✋