【GCP】GCEでMySQLサーバーを立ててみる!【Compute Engine】

GCPでDBを利用したかったのですが、Cloud SQLだとお高いのでGCEを利用することにしました。
開発環境や個人開発など、フルマネージドでないDBでも良い場合はありだと思います。
そこで今回はこちらの質問について解説していきます!
ポートを開放する
まずは準備として、MySQLのポートである3306ポートを開放するタグを追加しておきましょう。
GCPコンソールの「VPCネットワーク」の「ファイアウォール」から設定できます。

「ファイアウォールルールを作成」から新しいルールを作成します。
tcp:3306を許可するように設定し、他の値は任意の値を設定してください。

私は「mysql」という名前で保存しました。
インスタンスを建てる
次にMySQLを構築するインスタンスを作成します。
「Compute Engine」の「VMインスタンス」から作成できます。
以下のように設定します。(無料枠を利用する場合)
記載のない項目はデフォルト、もしくは任意の値を設定してください。
- 名前:任意
- リージョン:us-west1(オレゴン)
- ゾーン:us-west1-b
- マシン構成
- シリーズ:E2
- マシンタイプ:e2-micro
- ブートディスク
- OS:Container Optimized OS
- バージョン:最新
- ブートディスクの種類:標準永続ディスク
- サイズ(GB):10
- IDとAPIへのアクセス
- サービスアカウント:任意
- アクセススコープ:任意
- ネットワーキング
- ネットワークタグ:mysql(ポート開放時に作成したタグ)
メタデータにDB情報を追加する
MySQLを起動するときにユーザ名やパスワードが必要になりますが、その値をメタデータとして保存しておきます。
パスワードを直接ファイルに書き込むのは良くないですからね。
AWSで言うパラメータストアみたいなものです。
「Compute Engine」の「メタデータ」から設定できます。
編集から追加ができるのでDB名、ユーザ名、パスワード、rootパスワードを登録しておきます。
以下のキーにそれぞれ設定します。
- mysql_database
- mysql_user
- mysql_password
- mysql_root_password

作成したインスタンスに接続する
コンソールから簡単にSSH接続できるのでそちらを利用します。
インスタンス一覧の作成したインスタンスのところにSSHボタンがあります。

docker-composeを使えるようにする
SSHできたらまずはdocker-composeコマンドを使えるようにするために以下の2つのコマンドを実行します。
$ echo alias docker-compose="'"'docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$PWD:/rootfs/$PWD" \
-w="/rootfs/$PWD" \
docker/compose:1.26.2'"'" >> ~/.bashrc
$ source ~/.bashrc
環境変数を設定する
.envファイルを作成して、メタデータに登録した値を.envに設定していきます。
APIからメタデータの値を取得できます。
$ touch .env
$ MYSQL_PASSWORD=$(curl "http://metadata.google.internal/computeMetadata/v1/project/attributes/mysql_password" -H "Metadata-Flavor: Google")
$ echo MYSQL_PASSWORD=$MYSQL_PASSWORD | tee -a .env
$ MYSQL_ROOT_PASSWORD=$(curl "http://metadata.google.internal/computeMetadata/v1/project/attributes/mysql_root_password" -H "Metadata-Flavor: Google")
$ echo MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD | tee -a .env
$ MYSQL_DATABASE=$(curl "http://metadata.google.internal/computeMetadata/v1/project/attributes/mysql_database" -H "Metadata-Flavor: Google")
$ echo MYSQL_DATABASE=$MYSQL_DATABASE | tee -a .env
$ MYSQL_USER=$(curl "http://metadata.google.internal/computeMetadata/v1/project/attributes/mysql_user" -H "Metadata-Flavor: Google")
$ echo MYSQL_USER=$MYSQL_USER | tee -a .env
docker-compose.ymlを用意する
設定した.envファイルを利用してMySQLを起動するdocker-compose.ymlを作成します。
version: "3"
services:
db:
image: mysql:8
volumes:
- hoge:/var/lib/mysql
environment:
- MYSQL_DATABASE
- MYSQL_USER
- MYSQL_PASSWORD
- MYSQL_ROOT_PASSWORD
ports:
- "3306:3306"
volumes:
hoge:
起動してみる
ファイル構成はこんな感じになっていると思います。
.
├── docker-compose.yml
└── .env
あとはdocker-composeコマンドで起動!
$ docker-compose up -d
接続するときのhostはインスタンスの外部IPを指定します。
あとはメタデータに設定した情報で接続できるはずです。
あとがき
無料枠範囲内でDBを使えてはいますが、やっぱりレスポンスは遅めですね。
単純にスペックが低いのと、オレゴンに構築しているからですかね。
本番環境はCloud SQL使いましょう!