Go製サーバーをGoogleApp Engineに設置してみる&Google Cloud SQLの設定
GoのEchoで作ったサーバーをGoogleApp Engineに設置してみる。その時の作業ログ。
まずDBの作成
webサーバーをと思ったがまずはDBを作成する。
Google Cloud SQLとは?
Google Cloud SQL は、使いやすいフルマネージドの MySQL データベースです。Google Cloud SQL を使うと、パッチやアップデート、バックアップや複製の設定など、単調であるけれども必要で、時に時間のかかるタスクを Google に任せることができるようになります。MySQL のほぼすべての機能を持ち、あとで示すように追加機能や非サポート機能がいくつかあります。Google Cloud SQL は使いやすく、ほとんど全てのアプリケーションからアクセスできます。ソフトウェアのインストールやメンテナンスも不要です。
との事、AWSのRDSよりも安価に使えそうという事で今回選んだ、
比較記事はここを参考にさせていただいた。 qiita.com
Cloud SQL 第 2 世代(ベータ)は、分単位の従量課金制、自動の継続利用割引、予算にあったインスタンスを用意しています。利用していない>間は料金は発生せず、事前の申し込みなしで継続利用には割引が自動で適用されます。
料金は分単位の課金制となる、ここは実際に使ってみないと細かい部分までわかっていない。
Google Cloud SQLを設定する。
インスタンスを作成
第1世代を選択する
場所の設定
インスタンスが作成される、しばらく時間がかかる。
rootパスワードの変更は
アクセス制限 > ユーザー から実行できる。
timezoneの設定も管理画面からできる。MySQLフラグを追加
DB設定初期はパスワードが設定されていないので以下で接続できる。
mysql --host=<ip> --user=root
ユーザーのパスワードを設定した場合
mysql --host=<ip> --user=root --password
databaseを作成する。
CREATE DATABASE db_name;
ひとまず、DBの設定がここまでで完了する。
アプリの作成
Goを選択します。
サンプルコードが表示されます。
Google App Engine SDK for Go
まず、Google App Engine SDK for Goをダウンロードする。
Download the Google App Engine SDK | App Engine Documentation | Google Cloud Platform
pathを通す
$ cp -R go_appengine ~/go_appengine/ $ export PATH=~/go_appengine:$PATH
Python 2.7がインストールされている事が必要らしい。
以下のコマンドで確認してみる。なければインストールが必要。
$ /usr/bin/env python -V $ Python 2.7.10
バージョン確認
$ goapp version $ go version go1.6.2 (appengine-1.9.40) darwin/amd64
ファイル構成
application: ********
の部分にプロジェクトIDを設定する。
Serveコマンド
ローカル環境でサービスを立ち上げる
goapp serve ./hello
Deployコマンド
本番環境にDeploy
goapp deploy ./hello/
Deployに失敗する場合
deploy最中に処理が落ちたりする場合に、以下のエラーが発生する事があります。
That user can undo the transaction with "appcfg rollback".
その時は、rollbackで解決
appcfg.py rollback ./app/
Error
突然、CloudSqlに接続できない現象が発生した。 原因としてはよくわかっていないのだが、Deployし直す事で解消した。
Cloud SQL connection error 2
stackoverflowにあった、どうも大量のコネクションが発生している事が原因らしい、ソースからdbへの接続方法が変更して対応。
I ran into similar issues using Go on App Engine with Cloud SQL that seemed to ?be related to the creating too many connections to the cloudsql instance. I changed my code to create a single connection to the db during init which I reused throughout the program and seems to work, similar to what is recommended here.
課題、
マイグレーションはどう行うのがいいのだろろうか?