HikariBlog
Webエンジニア向けブログ
インフラ

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

gce-mysql

GCPでDBを利用したかったのですが、Cloud SQLだとお高いのでGCEを利用することにしました。

開発環境や個人開発など、フルマネージドでないDBでも良い場合はありだと思います。

そこで今回はこちらの質問について解説していきます!

ポートを開放する

まずは準備として、MySQLのポートである3306ポートを開放するタグを追加しておきましょう。

GCPコンソールの「VPCネットワーク」の「ファイアウォール」から設定できます。

ファイアウォール

「ファイアウォールルールを作成」から新しいルールを作成します。

tcp:3306を許可するように設定し、他の値は任意の値を設定してください。

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ボタンがあります。

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使いましょう!

参考文献

https://blog.ojisan.io/gce-mysql/