All Your Bugs Are Belong To Ass

Google Cloud SQL を雑にMySQLの代用品として利用してみた

※このエントリは、MySQL Casual Advent Calendar 2014 の2日目として書かれたものです。12/2(火)現在、まだいくつか枠が残っておりますので、興味のある方はぜひ参加してみてはいかがでしょうか。

※このエントリに掲載されているGoogle Cloud SQLは課金が必須なサービスです。本文中でも多少触れますが、クレジットカードなしでは試すこともできませんので、ご注意ください。

Google Cloud SQL とは?

最近クラウド分野に力を入れてきているGoogleですが、かなり前にGoogle Cloud SQL(以下Cloud SQL)をリリースしています。今思い出したかのようにリリース時の記事を検索してみたのですが、@ITによると、2011年11月にサービス提供をしているらしいので、すでに3年経過していることになります(ちなみに正式公開は米国時間の2014年2月11日)。

もはや「安定したサービス」と言えるのではないでしょうか。

なぜMySQL Casualの話題にCloud SQL?

Cloud SQLについてあまりご存知ない方にとって見れば、「そもそもMySQLとどう関係があるの?」という疑問が頭を過ることでしょう。ご安心を。大いに関係ありまくりです。

Google Cloud SQLは、そもそもMySQLが基盤となっているサービスです。どういう事かイマイチ想像がつかないかもしれませんが、気にせず読み進めていただけると、きっと納得していただけるはずです。

手始めにプロジェクトを作ろう

Cloud SQLを利用するには、Google Developers ConsoleからGoogle Cloud Platform(以下GCP)にプロジェクトを作る必要があります。

もしすでにGCPにプロジェクトを持っている場合は、それを流用しても構いませんし、別途新規作成してもいいでしょう。

ただし、Cloud SQLはGoogleの提供するストレージにデータを貯めこむシステムでして、このストレージが有料となります。予め課金を有効にしておきましょう。完全無料(クレジットカードなし)では利用不可能ですので、もし何らかの理由で決済手段がない方は諦めるしかありません。

Google Cloud SDK をインストールしよう

GCPでは、管理ツール郡をGoogle Cloud SDKとして配布しています。これを利用することで、コマンドラインからCloud SQLをはじめとしたクラウドリソースの操作・参照が可能となります。

Google Cloud SDKはLinux, Mac OS X, Windowsで動作します。上記リンク先より手順を確認し、ダウンロード及びインストールをしておきましょう。

無事にインストールが完了したら、gcloud コマンドが利用可能となっているはずです。

Google Cloud SDKでアカウント認証をしよう

gcloud コマンドが利用可能となっていることが確認出来たら、Google Cloud SDKでアカウント認証をしましょう。

$ gcloud auth login

このようにするとブラウザが開き、認証ページへと移動しますので、認証を行いましょう。もし認証ページが開かない場合は、ターミナルにURLが表示されているはずですので、手動でそのURLにアクセスして、認証を行ってください。なお、認証済みアカウントの確認は

$ gcloud auth list

で可能です。

Cloud SQL インスタンスを作ろう

今度はいよいよCloud SQLインスタンスの作成に入っていきます。と言っても、実はさほど手順は多くなく、以下のようなコマンドを実行するだけです。

$ gcloud sql instances create \
    [今作るインスタンス名(好きな名前でok)] \
    --project [さっき作ったプロジェクトのID] \
    --tier D0 \
    --assign-ip

オプションはそれぞれ以下のような意味を持っています。

  • project : インスタンス作成先のプロジェクトID(必須)
  • tier : インスタンスのタイプ。D0は128MBのRAM。--tierを指定しないとD1となる。参考: Pricing
  • assign-ip: グローバルIPの割り当てを行うオプション。これをつけないとGoogle App Engineからしかアクセスできない。

より詳細なオプションについては、こちらのドキュメントを参照してください。

実行以下のような表示となれば、無事にCloudSQLインスタンスの作成に成功したことになります。

Creating Cloud SQL instance...done.
Created [https://www.googleapis.com/sql/v1beta3/projects/oreore-project-xxx/instances/db00x].
NAME   REGION      TIER  ADDRESS         STATUS
db00x  us-central  D0    xxx.xxx.xxx.xx  RUNNABLE

アクセスコントロールリスト(ACL)を調整しよう

新しく出来上がったCloud SQLインスタンスでは、もう既にMySQLが稼働しています。が、そこへアクセスするためのネットワーク経路が確保されていません。

Cloud SQLでは基本的に外部ネットワークからのアクセスを遮断しているため、最低でもMySQLクライアントのアクセス元となるIPを許可する必要があります。

Google Developers Consoleからプロジェクトを1つ選択し、「ストレージ」>「Cloud SQL」というふうにメニューを選択すると、以下のようなCloud SQLのインスタンス一覧画面がでてきます。

Cloud SQL インスタンス一覧画面

インスタンスを選択したら、「アクセス制御」タブをクリックしてください。すると、以下のような画面になります。

アクセス制御

ここで「承認済みネットワーク」の右にある「新しく追加」というリンクをクリックし、MySQLクライアントのアクセス元となるIPを登録することで、ネットワーク経路が確保されます。

なお、この画面にあるIPアドレスは、MySQLクライアントで接続するときに必要ですので、忘れないようにしましょう。

MySQLのrootパスワードを設定しよう

前述の承認済みネットワーク追加画面で、もうひとつ大事なのが「rootパスワードの設定」という項目です。

これはMySQLのrootパスワードのことを指しており、実運用上必須の設定項目ですので、これも設定しておきます。

MySQLクライアントで接続してみよう

ここまでできれば、とりあえず接続して中身を確認することができます。以下のようなコマンドで実際に接続してみましょう。

$ mysql -u root -p -h [Cloud SQL インスタンスのIPアドレス]

接続できたら、あとは普段利用しているMySQLと同様に自由に探索してみましょう!!

きっと「Cloud SQLはMySQLそのままじゃん」って思うに違いないですよ!

Webアプリで試してみた

実は前回のHachioji.pmにて、「Cloud SQLとDockerをつかってyancha(webチャット)を立ち上げる」という内容のLTを行いました。その時使ったDocker imageがこちら

折角ですので、このDocker imageを使って、実際にyanchaを起動してみましょう。ちなみにyanchaはバックエンドDBとしてsqliteまたはMySQLが利用可能でして、ytnobody/docker-yanchaでは環境変数MYSQL_HOSTを指定するとMySQLを使用するようになります。

Cloud SQLを利用したdocker-yanchaの起動コマンドは、以下のようなものです。

$ sudo docker run \
    --rm \
    -p 3000:3000 \
    -e MYSQL_HOST=[あなたのCloud SQLインスタンスのIP] \
    -e MYSQL_DBNAME=yancha \
    -e MYSQL_USER=root \
    -e MYSQL_PASSWORD=[設定したパスワード] \
    -it ytnobody/docker-yancha

きちんと起動できたら、以下のような表示となります。

Running Yancha on Docker - Yancha Cloud ...

ここまで出来たら、あとは http://localhost:3000/ にアクセスすれば、実際にwebチャットとして稼働していることが確認できると思います。

(以下の画像は稼働時の参考です。

yancha 稼働イメージ

まとめ

実運用にはもう少しちゃんとした設定(SSL周りとか)が必要ではあるのですが、小規模かつ軽薄なアプリケーションなら、比較的簡単にCloud SQLでwebアプリケーションを稼働させることが可能です。

個人的な感想としては、速度面では微妙だと思うのですが(とにかく速度!!!という感じの用途には全く向かない)、運用上の手間がほぼかからないのと、リクエストの少ないwebアプリケーションであれば比較的安価にMySQLを稼働させておけるという面で、選択の一つとしては悪くないと思いました。

Created at
by
ytnobody
Last modified at
2014-12-02 03:01
by
ytnobody