RailsアプリをGoogle Container Engineで動かす
背景
herokuでRailsアプリを動かしていましたが、いかんせん無料なので起動が遅かったり、デプロイ時にR10(60sでタイムアウトする)に引っかかったりと辛くなってきました。herokuへの課金や移行先を考えるにあたり、折角なのでGoogle Container Engine (GKE)も試してみました。
その際ちょいちょい躓く所があったので、備忘録として手順を残しておきます。
なお、 とりあえず動かす ことにフォーカスしています。
参考にされる場合、productionとして必要なNginxやSSLなどの諸々は追加で設定してください。
前提
- dockerコマンドはインストールされているものとします
-
動くRailsアプリがあるとします
-
無ければRails newしたものでも良いですが、DBとの通信を確認できた方が良いです
- migrationファイルを適当に用意しましょう
- MySQLで考えます
-
無ければRails newしたものでも良いですが、DBとの通信を確認できた方が良いです
- 無料枠がある(今まで使ったことがない)と考え、細かい設定は行いません
- Webの画面で作れる所は頼ります
- リージョンは東京です
Railsの設定
database.ymlは以下のような設定にします。production: <<: *default adapter: mysql2 encoding: utf8 database: <db-name> host: <%= ENV["RAILS_DB_HOST"] %> username: <%= ENV["RAILS_DB_USER"] %>
はアプリに合わせたDB名に変更してください。
後ほど使いますので覚えておくか、忘れたらGCPの画面で都度確認しましょう。。
手順
クレカを登録すると沢山課金されるんじゃ……と怯えてしまいますが、$300あれば基本大丈夫なので色々試せます。ビバ無料枠。
GCPへの登録
では、Google Cloud Platform (GCP) の登録から始めましょう。https://cloud.google.com/
手順に従ってゆけば登録できます。
- 個人/法人を 指定
- 名前、住所、クレカの入力
- 完了
なお、試用期間中に仮に超えても、権限を付与しないと課金は発生しないと言われます。
親切設計。
Projectを作る
大きな括りであるProjectを作ります。
create project
を選び、好きなProject nameを付けます。
そして、 隠れているオプション を開き、リージョンを設定します。
自分の場合だと
us-central
がデフォルトで選択されており、変更し忘れるところでした。
asia-northeast1
に変更して作成します。
作成完了するとDashboard上でステータスが確認できます。
ProjectのIDは後ほど使うので場所を覚えておきます。
Clusterを作る
ここでGKEの設定を少しだけはさみます。左のメニューから "Container Engine" を選んで有効化します。
初回に数分ほど時間がかかるので、Twitterを眺めて待ちましょう。
初期起動が終わったら、クラスタを作成します。
nameはわかりやすい名前をつけ、Zoneは
asia-northeast1-a
にします。
また、 Cloud SQLのPermissionをEnable にします。
他はとりあえずそのままで進めます。
クラスタ名は後ほど使うので、覚えておきます。
Google Cloud SDKを入れる
手元から操作をするために、Google Cloud SDKというものが必要です。後々使いますので、この段階でインストールします。
https://cloud.google.com/sdk/docs/
↑を見て、プラットフォームにあったインストールを行います。
基本的にYを入力していれば終わります。
インストールが終わったらアップデートを行います。
$ gcloud components update$ gcloud components install kubectl
ここで認証、デフォルト値の設定を行います。
プロジェクトやクラスタを毎回指定するのは手間ですので、デフォルトとして与えます。
$ gcloud init$ gcloud config set container/cluster <クラスタ名>$ gcloud container clusters get-credentials <クラスタ名>
"Do you want to configure Google Compute Engine"でYを押し、"asia-northeast1-a"を探して選びます。
個別に設定をしたい場合は、↓の中程にある(オプショナル)の箇所を参照してください。
https://cloud.google.com/container-engine/docs/before-you-begin#optional_set_gcloud_defaults
$ gcloud config set project <プロジェクト名>$ gcloud config set compute/zone asia-northeast1-a$ gcloud config set container/cluster <クラスタ名>$ gcloud container clusters get-credentials <クラスタ名>
さらに、↓を参考に、デフォルトの認証情報も設定しておきます。
https://developers.google.com/identity/protocols/application-default-credentials
左のメニューから "API Manager" → "Credentials" を選び、上部"Create Credentials" / "Service account key"を選びます。
"Compute Engine default service account" / "JSON"を選択し、作成します。
するとJSONファイルがダウンロードされるので、ローカルの安全な場所に置きます。
.ssh
の中などがいいかもしれません。
置いた場所を環境変数
GOOGLE_APPLICATION_CREDENTIALS
に設定し、↓を実行しておきます。
$ gcloud auth application-default login
DBを作る
アプリに先立って、DBを先に立てておきます。左のメニュー → "STORAGE" → "SQL" でCloud SQL (MySQL) インスタンスを作ることが出来ます。
Cloud SQLには世代が2つありますが、速くて安い第二世代を選びましょう。
Instance IDはサービスを表すわかりやすい名前を付けます。
↓の記事を見ると、第一世代との性能差が結構あるようです。
シビアなサービスを作って色々と比較してみたいものです。
http://qiita.com/pakotan/items/1db981611ead66ce2c8b
Regionは
asia-northeast1
、Zoneは
asia-northeast1-a
を選びましょう。
Zoneは3つありますが、とりあえず分かりやすさのためaにします。
他、ハードウェアはデフォルトのままにしておきます。
設定を変えた際の各種スループットがグラフで出てとてもわかりやすく、いじってみると楽しいです。
今回はすぐにプロダクション、というわけではないので諸々設定していませんが、設定を眺めて「こんなことができるのかー」と調べておくのが良さそうです。
createボタンを押すとIPが割り振られて出来上がりです。
出来上がったら、"Instance details"から "Access Control" / "Users" を選び、rootのパスワードを変更しておきましょう。
手元のクライアントからつなぐ
出来上がったDBに早速つないでみたいですが、IPよりProxyを通してつなぐ方式が推奨されています。この方法ですと、特定IPを許可する必要もなく安全です。
https://cloud.google.com/sql/docs/mysql-connect-proxy
↑の記事に従い、cloud_sql_proxyをダウンロードします。
サービスアカウントは先程作ったものが使われますので、ここでは作らなくてもよいです。
例では
/cloudsql
というディレクトリを作っていましたが、ルートに作るのが嫌だったのでホーム以下の適当なフォルダに作りました
(なお、Dockerを使ってProxyを立てる方法もありました)。
指定したフォルダにソケットが出来上がるので、それを指定してアクセスします。
コマンドラインでなくても、MySQL Workbenchなどが使えます。
先ほど変更したrootパスワードを使ってrootとしてログインします。
アプリ用DB、DBユーザーの作成
Railsからアクセスするため、アプリ用のユーザーを作ります。アプリ-DB間の通信もSQL Proxyを使うのが良いとされているので、それに特化したユーザーにします。
https://cloud.google.com/sql/docs/sql-proxy
の中程「プロキシ用の特別な MySQL ユーザー アカウントの作成について」に書かれています。
ではrootでアクセスをした状態で作業をします。
<hoge-xxx>
はアプリに合わせてください。
CREATE DATABASE <hoge-dbname>;CREATE USER '<hoge-name>'@'cloudsqlproxy~%';GRANT ALL PRIVILEGES ON <hoge-dbname>.* TO '<hoge-name>'@'cloudsqlproxy~%';
無料の JSフォーマッタブラウザプログラムを使用して、クライアントサイドのスクリプトを書式設定してコードを最適化します!
0 件のコメント:
コメントを投稿