GCP上に立ち上げたGoogleCloudSQLにローカルから接続したいとき、プロキシを利用して接続する方法があります。
GCPの公式ドキュメントにはご丁寧にDockerを用いた接続する方法も書かれています。(プロキシが同梱してあるイメージも配布している)
https://cloud.google.com/sql/docs/mysql/connect-docker?hl=ja

とても便利ですが、僕は開発環境でdocker-composeを使用しているので、docker-composeの設定がほしいと思ったので、そのサンプルを今回は紹介したいと思います。
というかただのYAMLなので、簡単にできます。サンプルはRailsでやってます。

なお、この開発環境は、

・ Ruby 2.4.1
・ Ruby on Rails 5.1.3
・ Docker 17.06-ce
・ docker-compose 1.14.0
・ MySQL 5.7
・ CloudSQL 第二世代

※ CloudSQL 第二世代は分単位での従量課金制となっております。念のためご注意ください。

を想定しています。

CloudSQLの準備

これの事前にやっておく必要があるのは、
- Cloud SQLのインスタンスを立ち上げる
- Cloud SQL Administration APIを有効にしておく
- サービスアカウントページからKEY_FILEをダウンロードしておく(JSON)

docker及びDBへの接続先設定

用意しておくRails用Dockerfileはこちら

Dockerfile
FROM debian:stretch
ENV LANG C.UTF-8 
RUN apt-get update -y && apt-get dist-upgrade -y
RUN apt-get install -y \
      sudo build-essential wget curl \
      libssl-dev \
      default-libmysqlclient-dev \
      mysql-client \
      libcurl4-openssl-dev \
      libssl-dev \
      libyaml-dev \
      zlib1g-dev

# Set environment
ENV app     rails_app
ENV deploy  /var/www/$app
ENV RUBY_VERSION 2.4.1
ENV RUBY_FILE    ruby-$RUBY_VERSION

# Build Ruby
RUN wget http://ftp.ruby-lang.org/pub/ruby/2.4/$RUBY_FILE.tar.gz; \
    tar -zxvf $RUBY_FILE.tar.gz; \
    cd $RUBY_FILE; \
    ./configure && make && make install; \
    cd .. ; \ 
    rm -rf $RUBY_FILE $RUBY_FILE.tar.gz;

# Working Directory
RUN mkdir -p $deploy
WORKDIR $deploy

# Ruby on Rails 5
RUN gem install bundler -v 1.15.4
ADD Gemfile $deploy/
ADD Gemfile.lock $deploy/
RUN bundle install
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
docker-compose.yml
web:
  build: .
  command:
    [ "bash", "-c", "rm -f tmp/pids/server.pid; ./bin/rails server -b 0.0.0.0" ]
  ports:
    - "3000:3000"
  environment:
    DB_HOST: "db"
  volumes:
    - ".:/var/www/rails_app"
  links:
    - "db"

db:
  image: "gcr.io/cloudsql-docker/gce-proxy:1.09"
  command:
    ["/cloud_sql_proxy",
     "-instances=[CLOUDSQL_INSTANCE_NAME]=tcp:0.0.0.0:3306",
     "-credential_file=/config/[KEY_FILE]"]
  volumes:
    - "[PATH_TO_KEY_FILE]:/config/[KEY_FILE]"
  ports:
    - "3306:3306"

webからdbへのコンテナがリンクされているのですが、これがホスト名となるので、config/database.yml も書き換えてあげましょう。
環境変数にDBのホスト名を指定してるので、それを使用してます。

database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: username
  password: password
  host: <%= ENV['DB_HOST'] || 'localhost' %>

development:
  <<: *default
  database: rails_app_development

test:
  <<: *default
  database: rails_app_test

production:
  <<: *default
  database: rails_app_production
  username: username
  password: password

最後に

Google CloudSQLの第二世代は、インスタンスの稼動時間(分単位)で金額が発生します。なので、開発用のDBで使う場合、24時間開発してるとは限らないので、開発で使わない時間は止めておくといいかもしれません。
(ただGCPには継続利用割引というものがあり、継続して使うと自動的に割引されるという機能があるので、正確に試算してみてからどのように利用するかを決めるのをお勧めします。)

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.