2018年6月21日木曜日

RailsアプリをGoogle Container Engineで動かす

RailsアプリをGoogle Container Engineで動かす


背景

herokuでRailsアプリを動かしていましたが、いかんせん無料なので起動が遅かったり、デプロイ時にR10(60sでタイムアウトする)に引っかかったりと辛くなってきました。
herokuへの課金や移行先を考えるにあたり、折角なのでGoogle Container Engine (GKE)も試してみました。
その際ちょいちょい躓く所があったので、備忘録として手順を残しておきます。
なお、 とりあえず動かす ことにフォーカスしています。
参考にされる場合、productionとして必要なNginxやSSLなどの諸々は追加で設定してください。

前提

  • dockerコマンドはインストールされているものとします
  • 動くRailsアプリがあるとします
    • 無ければRails newしたものでも良いですが、DBとの通信を確認できた方が良いです
      • migrationファイルを適当に用意しましょう
    • MySQLで考えます
  • 無料枠がある(今まで使ったことがない)と考え、細かい設定は行いません
  • Webの画面で作れる所は頼ります
  • リージョンは東京です

Railsの設定

database.ymlは以下のような設定にします。
         production: <<: *default adapter: mysql2 encoding: utf8 database: <db-name> host: <%= ENV["RAILS_DB_HOST"] %> username: <%= ENV["RAILS_DB_USER"] %>
        
MySQLで、ホスト/ユーザー名は外部から取ってくる仕様です。
はアプリに合わせたDB名に変更してください。
後ほど使いますので覚えておくか、忘れたらGCPの画面で都度確認しましょう。。

手順

クレカを登録すると沢山課金されるんじゃ……と怯えてしまいますが、$300あれば基本大丈夫なので色々試せます。
ビバ無料枠。

GCPへの登録

では、Google Cloud Platform (GCP) の登録から始めましょう。
https://cloud.google.com/
手順に従ってゆけば登録できます。
  • 個人/法人を 指定
  • 名前、住所、クレカの入力
  • 完了 
$300が付与されます。
なお、試用期間中に仮に超えても、権限を付与しないと課金は発生しないと言われます。
親切設計。

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
        
ついでに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 件のコメント:

コメントを投稿