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を設定する。

f:id:loosefingers:20160812232901p:plain

インスタンスを作成

f:id:loosefingers:20160812234518p:plain

第1世代を選択する

f:id:loosefingers:20160812233019p:plain

場所の設定

f:id:loosefingers:20160812233233p:plain

インスタンスが作成される、しばらく時間がかかる。

f:id:loosefingers:20160812234951p:plain

rootパスワードの変更は

アクセス制限  >  ユーザー から実行できる。

f:id:loosefingers:20160813001706p:plain

timezoneの設定も管理画面からできる。MySQLフラグを追加 f:id:loosefingers:20160816125129p:plain

DB設定初期はパスワードが設定されていないので以下で接続できる。

mysql --host=<ip> --user=root 

ユーザーのパスワードを設定した場合

mysql --host=<ip> --user=root --password

databaseを作成する。

CREATE DATABASE db_name;

ひとまず、DBの設定がここまでで完了する。

アプリの作成

Goを選択します。

f:id:loosefingers:20160813013624p:plain

サンプルコードが表示されます。

f:id:loosefingers:20160813013902p:plain

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を設定する。

gist.github.com

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.

stackoverflow.com

課題、

マイグレーションはどう行うのがいいのだろろうか?

The cloudsql package

The cloudsql package  |  Go  |  Google Cloud Platform