2021

1

12

Docker環境でGoogle Cloud SQLに接続してやんよ!!!

タグ: | |

Pocket
LINEで送る
Facebook にシェア
reddit にシェア
LinkedIn にシェア

Dockerのキャッチアップがてら色々と試してみたくてローカルのDocker環境とデプロイ先のデータベースを統一させたいのでGoogle Cloud SQLを使います。

とはいえ現実的に開発環境と本番環境のDBを同じにするメリットもないのでDocker環境内にWordpressを作り、そのDBをローカルでもサーバー上でも共有できるようにすることを目的とします。

GCP側の準備

①ローカルマシンにGoogle Cloud SDKをインストール

まずは自分のPCからgcloudコマンドを使えるようにするためにSDKをインストール。Winの場合はこちらから、Macの場合はこちらから。

ダウンロードした圧縮ファイルをMacで解凍&新規プロジェクト作成までは以下の手順。

# ターミナルでダウンロードフォルダをHOMEディレクトリで解凍
tar -xzvf Downloads/ダウンロードしたファイル -C $HOME

$HOME/google-cloud-sdk/install.sh
--> 1. SDKにフィードバック許可するか?
--> 2. パスを通してコマンドを有効化するか?
--> 3. 設定ファイルの場所(そのままエンター)

# パス設定を更新
% source ~/.zshrc

# インストールを確認
$ gcloud version
--> Google Cloud SDK 327.0.0

# componentsをupdate
$ gcloud components update

# Googleアカウントでログイン
$ gcloud auth login アカウント名

# 対象アカウントのプロジェクト一覧
$ gcloud projects list

# 新規プロジェクト作成
gcloud projects create <PROJECT NAME ID>

# 作成したプロジェクトを作業対象に設定
% gcloud config set project <PROJECT NAME ID>

②Cloud SQLインスタンスを作成

事前準備

  • プロジェクトアカウントのクレジット決済を有効にする
  • Compute Engine APIを有効にしておく

コンパネからでも作成できますがとりあえずコマンドから作成します

# CloudSQLインスタンス名「wordpress」を作成
$ gcloud sql instances create wordpress \
    --activation-policy=ALWAYS \
    --tier=db-f1-micro \
    --region=asia-northeast1

# 「wordpress」インスタンスに[wp-db]テーブルを作成
$ gcloud sql databases create wp-db --instance wordpress

# CloudSQLユーザー情報設定
$ gcloud sql users set-password root --host=% --instance wordpress --password=<SQL PASSWORD>
  • activation-policy はインスタンス接続のデフォ設定で
    ALWAYS(常に起動)、再起動させない場合はNEVERに設定
  • tier はマシンタイプのスペックによって料金が変わるので詳細はここを参照
  • region は後から変更できないので「asia-northeast1(東京)」に設定

最初のコマンドからインスタンの作成が完了するまで5〜10分ほどかかります。
インスタンスが作成されたらwordpress用のテーブル、wp-db とrootユーザー情報を設定します

③SQLプロキシの設定

Docker環境からCloud SQLに接続するためにプロキシを導入しますが
その前にwebアプリからCloud SQLの使用を許可するためのサービスアカウントを作成します。

サービスアカウントキーの作成

  • 左メニュー「IAMと管理」-> 「サービスアカウント」を選択
  • 上部の「サービスアカウントの作成」をクリック
  • サービスアカウント名前は「cloudsql
  • ロールは「Cloud SQL 編集者」または「Cloud SQL 管理者」を選択
  • 一覧ページに戻るとメールが発行されているので操作メニューから「鍵を管理」をクリック
  • 鍵を追加」-> 「新しい鍵を作成」でJSONファイルをダウンロード
  • コマンド操作しやすい様に「key.json」に名前を変更して作業ディレクトリ直下に保管

プロキシのインストールと接続設定

# cloud_sql_proxyインストール
$ curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64

# cloud_sql_proxyファイルに実行権限を付与
$ chmod +x cloud_sql_proxy

# 作成したインスタンスの情報が不明な場合は下記コマンドでconnectionNameを参照
$ gcloud sql instances describe <INSTANCE_NAME>

# 作業環境からプロキシを実行
./cloud_sql_proxy \
-instances=<PROJECT_ID>:asia-northeast1:wordpress=tcp:13306 \
-credential_file=作業ディレクトリのパス/key.json

# プロキシ実行できたらローカルからCloud SQLに接続確認
$ mysql --socket :/cloudsql/<PROJECT_ID>:asia-northeast1:wp-db -u root -p

プロキシのコマンドを実行するとSequel Proなどの外部MySQLクライアントツールからCloudSQLに接続が可能になります。
その場合は自身のマシンからの接続になるのでホストは127.0.0.1になります

後述のDockerからの接続と競合しないように起動コマンドのポートは13306にしてあります

GCPのCloud Shellから操作する場合

# CloudShellから接続
$ gcloud sql connect wordpress --user=root --quiet

# 設定情報を確認
$ gcloud sql instances describe wordpress

DockerからローカルにWordpress環境を作成

さて、ようやく本題ですが実際はファイル起動するだけなんでやることはほぼ無いです。Docker Desktopのダウンロードはこちらから

作業フォルダ内にwordpressフォルダを作成してその中に公式イメージからwordpressのファイルを入れます

docker-compose.yml
version: '3' 

services:
  wordpress:
    image: wordpress:latest # 最新公式イメージを利用
    container_name: wordpress
    volumes:
        - ./wordpress/:/var/www/html/ # マウントするディレクトリを指定
    ports:
      - "8000:80" # ポート番号の設定
    restart: always
    env_file: .env # 環境変数の定義に.envを利用
    depends_on:
      - cloud-sql-proxy # cloudsqlプロキシのボリュームをマウント

  cloud-sql-proxy:
    container_name: cloudsql-proxy
    image: gcr.io/cloudsql-docker/gce-proxy:1.19.1
    volumes:
      - ./key.json:/config/key.json
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Tokyo
    restart: always
    command:
      ["/cloud_sql_proxy",
      "-instances=<PROJECT_ID>:asia-northeast1:wp-db=tcp:0.0.0.0:3306",
      "-credential_file=/config/key.json"]

volumes:
  wordpress:
DBの接続情報の.envファイル
MYSQL_RANDOM_ROOT_PASSWORD=yes
MYSQL_DATABASE=wp-db
MYSQL_USER=root
MYSQL_PASSWORD=パスワード
MYSQL_ROOT_PASSWORD=パスワード

WORDPRESS_DB_HOST=cloud-sql-proxy
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=root
WORDPRESS_DB_PASSWORD=パスワード
WORDPRESS_TABLE_PREFIX: "wp_"

composeの設定に慣れてなかったんで、wordpressのDBホストを127.0.0.1だったりCloud SQLのIPにしてもうまく接続できず結構苦戦しましたが、結果的には cloud-sql-proxy のコンテナオブジェクト名をそのまま引き継ぐことで上手くいきました。

Dockerを起動

# 「docker-compose.yml」をもとに作成と起動
$ docker-compose up -d

# コンテナを一時停止
$ docker-compose stop
# コンテナの作成&起動
$ docker-compose up

# この環境を削除
$ docker-compose down

# composeごとのログ確認
$ docker-compose logs wordpress

Docker Desktopを利用してる場合、一番上のコマンド以外はUIで実行できるので不要ですがメモとして。

これでlocalhost:8000にアクセスでwordpressの初期設定ページが表示されるのでアカウントユーザーを作成します。

WordPress側の追加

最初記事の更新ができずに焦ったのですがWordPressのパーマリンク設定で利用しているmod_rewriteの記述がある.htacessが作成されてなかったので自前でファイルを作成。

.htacessの追加

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

ローカル環境でwordpressを操作するとうい事もあまりないですが、アクセスする環境ごとでサイトURLが異なるため、wp-config.phpの接続情報を2パターンに修正します

wp-config.phpの修正

if (@$_SERVER["SERVER_NAME"] === 'localhost') {
    define('DB_NAME', 'wp-db');
    define('DB_USER', 'root');
    define('DB_PASSWORD', 'パスワード');
    define('DB_HOST', 'cloud-sql-proxy');
    define('DB_CHARSET', 'utf8');
    define('DB_COLLATE', '');
    // ローカル起動時のサイトURL設定
    define('WP_HOME','http://localhost:8000');
    define('WP_SITEURL','http://localhost:8000');
    define('WP_DEBUG', true);
} else {
    define('DB_NAME', 'wp-db');
    define('DB_USER', 'root');
    define('DB_PASSWORD', 'パスワード');
    define('DB_HOST', ':/cloudsql/<PROJECT_ID>:asia-northeast1:wordpress');
    define('DB_CHARSET', 'utf8');
    define('DB_COLLATE', '');
    // 本番環境起動時のサイトURL設定
    define('WP_HOME','本番環境のドメイン');
    define('WP_SITEURL','本番環境のドメイン');
    define('WP_DEBUG', false);
}

今後はこの辺もちゃんとDockerfileで自動生成させないといけないですね

Pocket
LINEで送る
Facebook にシェア
reddit にシェア
LinkedIn にシェア

トップへ