App Engine フレキシブル環境で動作する Ruby on Rails アプリの開発を始めます。作成したアプリはすべての Google プロダクトの基盤となる同じインフラストラクチャで動作するため、数人でも何百万人でも、すべてのユーザーに対応できるように確実にスケーリングできます。
このチュートリアルは、Rails ウェブ開発の知識があることを前提としています。ここでは、新しい Rails アプリを使用して Cloud SQL for MySQL を設定する方法について説明します。このチュートリアルは、Cloud SQL for MySQL を使用するように既存の Rails アプリでを構成するためのリファレンスとしても使用できます。
このチュートリアルには Ruby 2.3.4 以降が必要です。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud SQL Admin API.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud SQL Admin API.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
Cloud SQL for MySQL インスタンスを準備する
このチュートリアルで使用する Cloud SQL for MySQL インスタンスをセットアップします。
第 2 世代のインスタンスを作成します。 このチュートリアルでは、インスタンスの名前は
rails-cloudsql-instance
です。インスタンス内にデータベースを作成します。 このチュートリアルでは、本番環境のデータベースの名前は
cat_list_production
です。インスタンスの root ユーザー パスワードを設定します。
Rails 用のローカル環境のセットアップ
このチュートリアルのために、以下のようにローカル環境をセットアップします。
Rails とその依存関係のインストールの詳細については、公式の Rails スタートガイドをご覧ください。
前提条件を満たしたら、Cloud SQL for MySQL を使用して Rails アプリを作成し、デプロイできます。以下のセクションでは、Cloud SQL for MySQL の構成、接続、アプリのデプロイについて説明します。
猫をリストするための新しいアプリを作成する
rails new
コマンドを実行して新しい Rails アプリを作成します。このアプリは Cloud SQL for MySQL に猫のリストを保存します。rails new cat_sample_app
生成された Rails アプリのあるディレクトリに移動します。
cd cat_sample_app
アプリケーションをローカルで実行する
ローカルのパソコン上で新しい Rails アプリケーションを実行するには:
Bundler を使用して依存関係をインストールします。
bundle install
ローカル ウェブサーバーを起動します。
bundle exec bin/rails server
ウェブブラウザで http://localhost:3000/ にアクセスします。
「Yay! You're on Rails!メッセージがアプリからページに表示されます。
猫リストのスキャフォールディングを生成する
Cat
という名前のリソースのスキャフォールディングを生成します。これは、名前と年齢を含む猫のリストを作成するために使用されます。
スキャフォールディングを生成します。
bundle exec rails generate scaffold Cat name:string age:integer
このコマンドは、
Cat
リソースのモデル、コントローラ、ビューを生成します。invoke active_record create db/migrate/20170804210744_create_cats.rb create app/models/cat.rb invoke rspec create spec/models/cat_spec.rb invoke resource_route route resources :cats invoke scaffold_controller create app/controllers/cats_controller.rb invoke erb create app/views/cats create app/views/cats/index.html.erb create app/views/cats/edit.html.erb create app/views/cats/show.html.erb create app/views/cats/new.html.erb create app/views/cats/_form.html.erb invoke jbuilder create app/views/cats/index.json.jbuilder create app/views/cats/show.json.jbuilder create app/views/cats/_cat.json.jbuilder invoke assets invoke js create app/assets/javascripts/cats.js invoke scss create app/assets/stylesheets/cats.scss invoke scss create app/assets/stylesheets/scaffolds.scss
config/routes.rb
ファイルを開いて、生成された内容を確認します。ファイルに
root 'cats#index'
を追加します。ファイルを保存して閉じます。
前述の説明のとおりに Rails アプリをテストします。
App Engine での Cloud SQL for MySQL の使用
Cloud SQL for MySQL は、Google Cloud でリレーショナル MySQL データベースを設定、メンテナンス、運用、管理するためのフルマネージド データベース サービスです。つまり、Rails アプリで Cloud SQL を他のリレーショナル データベースと同じように使用できます。
Cloud SQL for MySQL をセットアップする
本番環境の Rails アプリで Cloud SQL の使用を開始するには:
mysql2
gemとappengine
gemをGemfile
ファイルに追加します。bundle add mysql2 bundle add appengine
Rails
Gemfile
に、次のgem
エントリが追加されます。Rails アプリを Cloud SQL に接続するように構成するため、
config/database.yml
ファイルを開きます。次のような SQLite 用のボイラープレート データベース設定が表示されます。App Engine 本番環境用の Cloud SQL インスタンス接続名を構成します。
インスタンス接続名を取得します。
gcloud sql instances describe rails-cloudsql-instance
connectionName
の横にある値をコピーします。
database.yml
本番環境のデータベース構成を次のように変更します。ここで
[YOUR_MYSQL_USERNAME]
は MySQL のユーザー名を表します。[YOUR_MYSQL_PASSWORD]
は MySQL のパスワードを表します。[YOUR_INSTANCE_CONNECTION_NAME]
は、前の手順でコピーしたインスタンス接続名を表します。
これで、App Engine フレキシブル環境にデプロイしたときに Rails アプリが Cloud SQL を使用するようセットアップされました。
App Engine フレキシブル環境へのアプリのデプロイ
App Engine フレキシブル環境では、app.yaml
というファイルを使用してアプリのデプロイ構成を記述します。このファイルが存在しない場合は、gcloud CLI によりデプロイ構成が自動的に推測されます。しかし、Rails の秘密鍵と Cloud SQL に必要な構成設定を提供するためにこのファイルを定義してください。
サンプルアプリケーションを App Engine にデプロイするように構成するには、Rails アプリケーションディレクトリのルートにapp.yaml
という名前の新しいファイルを作成し、次の行を追加します。
app.yaml
ファイルで Rails 秘密鍵を構成する
Rails アプリが production
環境にデプロイされたときにユーザー セッション データの保護に使用される秘密鍵を環境変数 SECRET_KEY_BASE
に設定します。この環境変数は、Rails アプリの config/secrets.yml
ファイルから読み込まれます。
新しい秘密鍵を生成します。
bundle exec bin/rails secret
生成された秘密鍵をコピーします。
前の手順で作成した
app.yaml
ファイルを開き、env_variables
セクションを追加します。env_variables
は、App Engine フレキシブル環境の環境変数を定義します。app.yaml
ファイルは次の例のようになります。[SECRET_KEY]
は実際の秘密鍵に置き換えてください。
app.yaml
ファイルで Cloud SQL インスタンスを構成します。
次に、app.yaml
構成ファイルに Cloud SQL インスタンス接続名を指定することで、指定した Cloud SQL インスタンスを使用するように App Engine フレキシブル環境を構成します。
app.yaml
ファイルを開き、beta_settings
という名前の新しいセクションを追加します。インスタンス接続名を値として、ネストされたパラメータ
cloud_sql_instances
を定義します。app.yaml
は次のようになります。
App Engine フレキシブル環境アプリを作成する
アプリを初めてデプロイする場合は、App Engine フレキシブル環境アプリを作成し、Rails アプリを実行するリージョンを選択する必要があります。
App Engine アプリを作成します。
gcloud app create
Ruby アプリの App Engine フレキシブル環境をサポートするリージョンを選択します。リージョンとゾーンの詳細については、こちらをご覧ください。
新しいバージョンをデプロイする
次に、現在のデフォルト バージョンからのトラフィックをリダイレクトせずに、app.yaml
ファイルに記述された新しいバージョンの Rails アプリをデプロイします。
Rails アセットをプリコンパイルします。
bundle exec bin/rails assets:precompile
アセットのコンパイルが完了したら、アプリの新しいバージョンをデプロイします。
gcloud app deploy --no-promote
デプロイメントが完了するまで数分かかることがあります。成功メッセージが表示されるのを待ちます。デプロイされたバージョンは、App Engine のバージョン リストで確認できます。
新しいバージョンをデプロイした後、この新しいバージョンにアクセスしようとすると、データベースの移行がまだ終わっていないため、次のエラー メッセージが表示されます。
appengine
gem に必要な権限を付与する
次に、appengine
gem を使用して本番環境データベースの移行を行うために、cloudbuild サービス アカウントにアクセス権を付与します。
使用可能なプロジェクトを一覧表示します。
gcloud projects list
出力結果からアプリのデプロイに使用するプロジェクトを探し、そのプロジェクト番号をコピーします。
データベースの移行を行うために、ロール
roles/editor
のプロジェクト IAM ポリシーに新しいメンバーを追加します。[YOUR-PROJECT-ID]
は実際の Google Cloud プロジェクト ID に置き換え、[PROJECT_NUMBER]
は前のステップでコピーしたプロジェクト番号に置き換えます。gcloud projects add-iam-policy-binding [YOUR-PROJECT-ID] \ --member=serviceAccount:[PROJECT_NUMBER]@cloudbuild.gserviceaccount.com \ --role=roles/editor
Rails データベースを移行する
Rails データベース移行は、SQL 構文を直接使わずにデータベースのスキーマを更新するために使用されます。次に、cat_list_production
データベースを移行します。
appengine
gem には、Rake タスク appengine:exec
が用意されており、本番の App Engine フレキシブル環境にデプロイされた最新のアプリに対してコマンドを実行します。
本番環境で Cloud SQL for MySQL
cat_list_production
データベースを移行します。bundle exec rake appengine:exec -- bundle exec rake db:migrate
次のような出力が表示されます。
---------- EXECUTE COMMAND ---------- bundle exec rake db:migrate Debuggee gcp:787021104993:8dae9032f8b02004 successfully registered == 20170804210744 CreateCats: migrating ======================================= -- create_table(:cats) -> 0.0219s == 20170804210744 CreateCats: migrated (0.0220s) ============================== ---------- CLEANUP ----------
データベースの移行を確認するため、次のアドレスにアクセスします。
[YOUR-VERSION]-dot-[YOUR-PROJECT-ID].appspot.com
デプロイメントが成功すると、次のような出力が表示されます。
トラフィックを新しいバージョンに移行する
最後に、次のコマンドを使用して、新しくデプロイしたバージョンにトラフィックを誘導します。
gcloud app services set-traffic default --splits [YOUR-VERSION]=1
これで、次のアドレスからアプリの新しいバージョンにアクセスできます。
https://[YOUR-PROJECT-ID].appspot.com
App Engine のログを見る
Rails アプリをデプロイした後、ログを見ることができます。アプリログを読むには、Google Cloud Console にあるログ エクスプローラを使用します。
詳細については、gcloud CLI を使用したログの読み取りをご覧ください。
リソースのクリーンアップ
チュートリアルが終了したら、作成したリソースをクリーンアップして、割り当ての使用を停止し、課金されないようにできます。次のセクションで、リソースを削除または無効にする方法を説明します。
プロジェクトの削除
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
App Engine のバージョンの削除
アプリのバージョンを削除するには:
- In the Google Cloud console, go to the Versions page for App Engine.
- Select the checkbox for the non-default app version that you want to delete.
- アプリのバージョンを削除するには、[ 削除] をクリックします。
Cloud SQL インスタンスの削除
Cloud SQL インスタンスを削除するには:
- In the Google Cloud console, go to the Instances page.
- Click the name of the SQL instance you that want to delete.
- To delete the instance, click Delete, and then follow the instructions.