最初に
本記事はGoogle App EngineのRubyチュートリアルに関する投稿、GAEがRuby対応したのでRubyチュートリアルをやってみた〜Hello World app〜の続きになります。「Before you begin」が終了していない方はそちらからご覧下さい。
終了している方も、プロジェクトのロケーションが「europe-west」以外になっていることをもう一度確認下さい。
BOOKSHELF APP
本記事では「Using Structured Data」を実施します。ここまで実施できれば、DBを使用するwebアプリを作成できるようになります。
実施したMacのOS、バージョンは以下の通りです。
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.10.5
BuildVersion: 14F1605
Using Structured Data with Ruby
- 以下の画面からDBを選ぶ
MySQLとCloud Datastoreはマネージドですが、PostgreSQLは違うので注意です。ここでは一番上のGoogle Cloud SQL(MySQL)を選択します。
Using Cloud SQL with Ruby
Before you begin
- 先ほどのHello World appで上3つは終了しているので、「Enable APIs for your project」と「Create a service account for your project」を実施しましょう。
Enable APIs for your project
- 「Enable APIs」をクリックする
- ドロップダウンからプロジェクトを選択し続行ボタンを押す
- 以下に遷移したことを確認し続行ボタンを押す
* 「Enable APIs for your project.」にチェックをつける
Create a service account for your project.
- 「Create service account key page in the Google Cloud Platform Console」をクリック
- プロジェクトを選択し続行を押す
- サービスアカウントを作成を押す
- 任意の名前を記入し「新しい秘密鍵の提供」をチェックし「JSON」を選択し作成ボタンを押下する
秘密鍵は注意して保管しましょう。
- 元の画面に戻り「Create a service account for your project.」をチェックする
Create and configure a Cloud SQL instance
プロジェクトの選択
- 毎回おなじみプロジェクトの選択をする
インスタンスの作成
- 以下のように設定する
- 名前は任意。
- 地域はCompute Engineインスタンスのロケーションと揃える
- オプションを設定する
今回はデフォルト値で進めます。
オプションで指定できる要素は以下の通りです。- データベースのバージョン
MySQL5.5と5.6が選択できます。 - 料金プラン
時間単位課金の従量制とパッケージ(インスタンスが存在する日数に応じた月単位の課金)を選べます。 - 希望する場所
ロケーションを選択できます。指定場所に応じて以下のようにオプションが変化します。- App Engineアプリに準拠(デフォルト)
値: App Engine アプリケーションID - Compute Engine ゾーン
値(us-centralの場合):- us-central-a
- us-central-b
- us-central-c
- us-central-f
- 指定しない
値:なし
- App Engineアプリに準拠(デフォルト)
- バックアップとバイナリログ
日時バックアップを有効にするとバイナリログオプションを選択できる- 日時バックアップ
指定した時間(1時間ごと)から4時間以内にバックアップジョブが起動します。
- 日時バックアップ
- アクティベーションポリシー
インスタンスの起動状態に関する設定をします- オンデマンド(デフォルト)
アクティブでない状態が続くとシャットダウンする - 常にオン
シャットダウンされることはない - 常にオフ
インスタンス作成後に選べるオプション
- オンデマンド(デフォルト)
- ファイルシステムレプリケーション
- 同期
- 非同期
- IPv4アドレス
チェックするとIPv4アドレスをインスタンスに割り当てる - 承認済みネットワーク
承認するIPアドレスを設定する - 承認済みの App Engine アプリケーション
承認するアプリを設定する。デフォルトで現在環境設定中のアプリが設定されているので、連携するアプリがなければ追記不要。 - MySQLフラグ
slow_query_logなど様々な設定ができる。詳細は右を参照して下さいConfiguring MySQL Flags
- データベースのバージョン
アクセス制限
- 作成し数十秒でインスタンスが立ち上がるので確認し、インスタンスをクリックする
- アクセス制御をクリックする
めっちゃ画面が崩れてますね・・・
IPv4アドレスの付与
- IPアドレスをクリックしIPv4アドレスをリクエストをクリックする
アクセス可能なネットワークの設定
- 承認ボタンをクリックし以下のように記入し設定を保存する
注意! デモの用途なので0.0.0.0/0を指定していますが、実際に運用する場合はこの設定は避けること(ドキュメントより引用)。アクセスを許可するインスタンスのIPアドレスは、「Compute Engine」 → 「VMインスタンス」のページで「外部IP」の箇所に書いてある。
ユーザーの作成
- ユーザーをクリックし「ユーザーアカウントを作成」ボタンを押下する
Download and run the app
基本的にチュートリアル通りに進めれば良いので、注意点のみ記載します。
Configure settings
- database.yml
database.ymlにはDBインスタンス作成時に付与したIPv4アドレス、ユーザー名、パスワードを指定すること - bundle install
$ bundle install
時に以下のメッセージが出たら、パスワードを入力してsudo権限で処理を続けること。
中断し$ bundle install --path vendor/bundle
を実行すると、ローカルでの確認は問題ないがデプロイ時に
ERROR: (gcloud.preview.app.deploy) Error Response: [13] Timed out when starting VMs. It's possible that the application code is unhealthy. (0/1 ready, 1 still deploying).
となりデプロイに失敗する(エラーの詳細についてはハマりどころ・注意点で記載する)。
$ bundle install
Fetching gem metadata from https://rubygems.org/...........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Using rake 10.4.2
Using i18n 0.7.0
Using json 1.8.3
Your user account isn't allowed to install to the system Rubygems.
You can cancel this installation and run:
bundle install --path vendor/bundle
to install the gems into ./vendor/bundle/, or you can enter your password
and install the bundled gems to Rubygems using sudo.
Password:
ハマりどころ・注意点
- bundle install
bundle install --path vendor/bundle
としてしまったのが一番大きなハマりどころでした。。ローカルでは問題なく動いていたのデバッグもできませんでした。「メニューバー」 → 「ログ」でログを確認してもエラーメッセージが出ておらず(自分が見つけられなかっただけかもしれいです・・・)、色々調べていたら「VMインスタンス」→ 「インスタンス詳細画面」→ 「シリアル コンソール出力」でシリアルコンソール出力を確認することができることを発見し、そこにエラー出力が出ていて原因が判明しました。ちなみに、その際のエラー出力は以下です。
/app/vendor/bundle/ruby/2.2.0/gems/nokogiri-1.6.6.2/lib/nokogiri.rb:29:in `require': cannot load such file -- nokogiri/nokogiri (LoadError)
- rake db:migrate
develop環境でもリモートのMySQLサーバを見ていて、かつDBインスタンスは0.0.0.0/0
を許可しているのでローカルでrake db:migrateを実行すればDBインスタンスのデータベース/ユーザーが作成される。
最後に
ログにエラーが出ない場合、「VMインスタンス」→ 「インスタンス詳細画面」→ 「シリアル コンソール出力」でシリアルコンソール出力を確認しましょう!