はじめに
GCPにはCloudSQLというMySQLまたはPostgreSQLのPaaSが提供されており、以下に該当しない場合は利用が推奨されています。
- DBサーバに対して特定のOS要件がある
- DBの構成ファイルに対して特定の要件が必要である
- DBのバックアップに関して特定の要件がある
VMを用意し、自分が用意したDBサーバとの接続であればDBの知識のみで対応可能ですがPaaSになればプラットフォームを提供するサービスについて新たに学ぶ必要が出てきます。
本記事ではGoogleCloudPlatformにてCloudSQLというPaaSを利用した際にクライアントとなる仮想マシンからSSL通信にてDB接続するあたりを解説します。
DBサーバを用意する
メニュー画面におけるSQL > Create a Cloud SQL instanceにてDBインスタンスを生成できます。
DBはMySQLかPostgreSQLから選択します。他にもディスクをHDDかSDDにするか、バックアップの設定、そしてrootユーザのパスワードを設定します。作成するとGUI上でIPアドレスが確認できるので、こちらをメモしておきます。
DBサーバと接続するために仮想マシンを用意します。
$ gcloud beta compute instances create test-client ... Created ...test-client. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS test-client us-central1-a n1-standard-1 X.X.X.X Y.Y.Y.Y RUNNING
仮想マシン側はクライアントなのでmysql-clientをインストールします。
$ apt-get install mysql-client
あとはDBインスタンスのIPアドレスを指定してrootユーザで接続すればDB接続が可能です。
$ mysql --host=ZZ.ZZ.ZZ.ZZ -u root -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is XX ... MySQL [(none)]>
ちなみにパスワードを間違えると以下のようにエラーとなります。
client:~$ mysql --host=$IP_ADDRESS_SQL -u root -p Enter password: ERROR 1045 (28000): Access denied for user 'root'@'ZZ.ZZ.ZZ.ZZ' (using password: YES)
ここから、SSLでの接続する方式に切り替えます。
SSL通信に切り替える
こちらはInstance Detail > CONNECTIONS > SSL>にある「Allow Only SSL connectionsの箇所を押下するのみです。
そうすると以下の3ファイルがダウンロードできます。
- server-ca.pem
- client-cert.pem
- client-key.pem
試しにサーバ証明書の中身を見てみました。
$ openssl x509 -text -noout -in server-ca.pem ... Issuer: dnQualifier=XXX, CN=Google Cloud SQL Server CA, O=Google, Inc, C=US ...
認証局(Certification Authority)証明書にあたるものですね。
補足 SSL証明書関連
あとはVM側に配置し、接続オプションを以下のように指定して接続します。
$ mysql -u root -p -h ZZ.ZZ.ZZ.ZZ --ssl-ca=server-ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is X ... MySQL [(none)]>
試しに初めの接続方法で接続しにいくと
$ mysql --host=ZZ.ZZ.ZZ.ZZ -u root -p Enter password: ERROR 1045 (28000): Access denied for user 'root'@'ZZ.ZZ.ZZ.ZZ' (using password: YES)
パスワード誤りのようなエラーコードですが、こちらはSSLによるエラーです。
一部の引数を不足させると
$ mysql -u root -p -h ZZ.ZZ.ZZ.ZZ --ssl-ca=server-ca.pem --ssl-cert=client-cert.pem Enter password: SSL error: Unable to get private key from 'client-cert.pem' ERROR 2026 (HY000): SSL connection error: Unable to get private key
それらしいエラーが出ます。
終わりに
サーバ間の接続を秘匿にする要件は、クラウド上でのやりとりにおいて特に重要です。
該当の作業を行う際の、参考になれば幸いです。