Rails 5 での Cloud SQL for PostgreSQL の使用

App Engine フレキシブル環境で動作する Ruby on Rails アプリの開発を始めます。作成したアプリはすべての Google プロダクトの基盤となる同じインフラストラクチャで動作するため、数人でも何百万人でも、すべてのユーザーに対応できるように確実にスケーリングできます。

このチュートリアルは、Rails ウェブ開発の知識があることを前提としています。新しい Rails アプリを使用してCloud SQL for PostgreSQLを設定する方法について説明します。このチュートリアルは、Cloud SQL for PostgreSQL を使用するように既存の Rails アプリを構成するためのリファレンスとしても使用できます。

このチュートリアルには Ruby 2.3.4 以降が必要です。

準備

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Cloud SQL Admin API を有効にします。

    API を有効にする

  5. Cloud SDK をインストールして初期化します。

Cloud SQL for PostgreSQL インスタンスを準備する

このチュートリアル用に、Cloud SQL for PostgreSQL インスタンスを設定します。

  1. PostgreSQL インスタンスを作成します。 このチュートリアルでは、インスタンスの名前は rails-cloudsql-instance です。

  2. インスタンス内にデータベースを作成します。 このチュートリアルでは、本番環境のデータベースの名前は cat_list_production です。

  3. インスタンスの postgres ユーザー パスワードを設定します。

Rails 用のローカル環境のセットアップ

このチュートリアルのために、以下のようにローカル環境をセットアップします。

  1. Ruby バージョン 2.3.4 以降をインストールします。

  2. Rails 5 gem をインストールします。

  3. Bundler gem をインストールします。

Rails とその依存関係のインストールの詳細については、公式の Rails スタートガイドをご覧ください。

事前準備が完了したら、Cloud SQL for PostgreSQL を使用して Rails アプリを作成し、デプロイします。以降のセクションでは、アプリの構成、Cloud SQL for PostgreSQL への接続、デプロイについて説明します。

猫をリストするための新しいアプリを作成する

  1. rails new コマンドを実行して新しい Rails アプリを作成します。このアプリは Cloud SQL for PostgreSQL に猫のリストを保存します。

    rails new cat_sample_app
    
  2. 生成された Rails アプリのあるディレクトリに移動します。

    cd cat_sample_app
    

アプリをローカルで実行する

ローカルのパソコン上で新しい Rails アプリを実行するには:

  1. Bundler を使用して依存関係をインストールします。

    bundle install
    
  2. ローカル ウェブサーバーを起動します。

    bundle exec bin/rails server
    
  3. ブラウザで http://localhost:3000/ にアクセスします。

Yay! You're on Rails!メッセージがアプリからページに表示されます。

実行中の新しい Rails アプリのスクリーンショット

猫リストのスキャフォールディングを生成する

Catという名前のリソースのスキャフォールディングを生成します。これは、名前と年齢を含む猫のリストを作成するために使用されます。

  1. スキャフォールディングを生成します。

    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
    
  2. ファイルconfig/routes.rbを開き、生成された次のコンテンツを確認します。

    Rails.application.routes.draw do
      resources :cats
      get 'cats/index'
      # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
    
    end
  3. ファイルにroot 'cats#index'を追加します。

    Rails.application.routes.draw do
      resources :cats
      get 'cats/index'
    
      # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
      root 'cats#index'
    end
  4. ファイルを保存して閉じます。

  5. 前述の説明のとおりに Rails アプリをテストします。

App Engine での Cloud SQL for PostgreSQL の使用

Cloud SQL for PostgreSQL は、Google Cloud でリレーショナル PostgreSQL データベースを設定、維持、管理、管理するためのフルマネージドデータベースサービスです。つまり、Rails アプリで Cloud SQL を他のリレーショナル データベースと同じように使用できます。

Cloud SQL for PostgreSQL をセットアップする

本番環境の Rails アプリで Cloud SQL の使用を開始するには:

  1. pggemとappenginegemをGemfileファイルに追加します。

    bundle add pg
    bundle add appengine
    

    Rails Gemfileには、次のgemエントリが追加されています。

    # Added at 2017-08-23 15:24:52 -0700 by franknatividad:
    gem "pg", "~> 0.21.0"
    
    # Added at 2017-08-07 11:54:12 -0700 by USER:
    gem "appengine", "~> 0.4.1"
  2. Rails アプリを Cloud SQL に接続するように構成するには、config/database.ymlファイルを開きます。次のような SQLite 用のボイラープレート データベース設定が表示されます。

    # SQLite version 3.x
    #   gem install sqlite3
    #
    #   Ensure the SQLite 3 gem is defined in your Gemfile
    #   gem 'sqlite3'
    #
    default: &default
      adapter: sqlite3
      pool: 5
      timeout: 5000
    
    development:
      <<: *default
      database: db/development.sqlite3
    
    # Warning: The database defined as "test" will be erased and
    # re-generated from your development database when you run "rake".
    # Do not set this db to the same as development or production.
    test:
      <<: *default
      database: db/test.sqlite3
    
    production:
      <<: *default
      database: db/production.sqlite3
  3. App Engine 本番環境用の Cloud SQL インスタンス接続名を構成します。

    1. インスタンス接続名を取得します。

      gcloud sql instances describe rails-cloudsql-instance
      
    2. connectionName の横の値をコピーします。

  4. database.yml本番環境のデータベース構成を次のように変更します。

    production:
      adapter: postgresql
      encoding: unicode
      pool: 5
      timeout: 5000
      username: "[YOUR_POSTGRES_USERNAME]"
      password: "[YOUR_POSTGRES_PASSWORD]"
      database: "cat_list_production"
      host:   "/cloudsql/[YOUR_INSTANCE_CONNECTION_NAME]"

    ここで

    • [YOUR_POSTGRES_USERNAME] は PostgreSQL のユーザー名を表します。
    • [YOUR_POSTGRES_PASSWORD] は PostgreSQL のパスワードを表します。
    • [YOUR_INSTANCE_CONNECTION_NAME] は、前の手順でコピーしたインスタンス接続名を表します。

これで、App Engine フレキシブル環境へのデプロイ時に Cloud SQL を使用するように Rails アプリが設定されました。

App Engine フレキシブル環境へのアプリのデプロイ

App Engine フレキシブル環境では、app.yaml というファイルを使用してアプリのデプロイメント構成を記述します。このファイルが存在しない場合は、デプロイメント構成が自動的に推測されます。 しかし、Rails の秘密鍵と Cloud SQL に必要な構成設定を提供するためにこのファイルを定義してください。

App Engine にデプロイメントするサンプルアプリを構成するには、Rails アプリ ディレクトリのルートに app.yaml という名前の新しいファイルを作成し、次を追加します。

entrypoint: bundle exec rackup --port $PORT
env: flex
runtime: ruby

app.yamlファイルで Rails 秘密鍵を構成する

Rails アプリが production 環境にデプロイされたときにユーザー セッション データの保護に使用される秘密鍵を環境変数 SECRET_KEY_BASE に設定します。この環境変数は、Rails アプリの config/secrets.yml ファイルから読み込まれます。

  1. 新しい秘密鍵を生成します。

    bundle exec bin/rails secret
    
  2. 生成された秘密鍵をコピーします。

  3. 前の手順で作成したapp.yamlファイルを開き、env_variablesセクションを追加します。env_variables は、App Engine フレキシブル環境の環境変数を定義します。app.yaml ファイルは次の例のようになります。[SECRET_KEY] は実際の秘密鍵に置き換えてください。

    entrypoint: bundle exec rackup --port $PORT
    env: flex
    runtime: ruby
    
    env_variables:
      SECRET_KEY_BASE: [SECRET_KEY]

app.yamlファイルで Cloud SQL インスタンスを構成する

次に、app.yaml 構成ファイルに Cloud SQL インスタンス接続名を指定することによって、指定した Cloud SQL インスタンスを使用するように App Engine フレキシブル環境を構成します。

  1. app.yamlファイルを開き、beta_settingsという名前の新しいセクションを追加します。

  2. インスタンス接続名を値として、ネストされたパラメータcloud_sql_instancesを定義します。

    app.yaml は次のようになります。

    entrypoint: bundle exec rackup --port $PORT
    env: flex
    runtime: ruby
    
    env_variables:
      SECRET_KEY_BASE: [SECRET_KEY]
    
    beta_settings:
      cloud_sql_instances: [YOUR_INSTANCE_CONNECTION_NAME]

App Engine フレキシブル環境アプリを作成する

アプリを初めてデプロイする場合は、App Engine フレキシブル環境アプリを作成し、Rails アプリを実行するリージョンを選択する必要があります。

  1. App Engine アプリを作成します。

    gcloud app create
    
  2. Ruby アプリの App Engine フレキシブル環境をサポートするリージョンを選択します。リージョンとゾーンの詳細については、こちらをご覧ください。

新しいバージョンをデプロイする

次に、現在のデフォルトの提供バージョンからのトラフィックをリダイレクトせずに、app.yamlファイルに記述された新しいバージョンの Rails アプリをデプロイします。

  1. Rails アセットをプリコンパイルします。

    bundle exec bin/rails assets:precompile
    
  2. アセットのコンパイルが完了したら、アプリの新しいバージョンをデプロイします。

    gcloud app deploy --no-promote
    

    デプロイメントが完了するまで数分かかることがあります。成功メッセージが表示されるのを待ちます。デプロイされたバージョンは、App Engine のバージョン リストで確認できます。

新しいバージョンをデプロイした後、この新しいバージョンにアクセスしようとすると、データベースの移行がまだ終わっていないため、次のエラー メッセージが表示されます。

新しい Rails アプリのエラー メッセージのスクリーンショット

appengine gem に必要な権限を付与する

次に、appengine gem で本番環境データベースの移行を実行するために、Cloudbuild サービス アカウントにアクセス権を付与します。

  1. 使用可能なプロジェクトを一覧表示します。

    gcloud projects list
    
  2. 出力結果からアプリのデプロイに使用するプロジェクトを探し、そのプロジェクト番号をコピーします。

  3. データベースの移行を実行するために、役割 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 フレキシブル環境でデプロイされた最新バージョンのアプリに対してコマンドを実行します。

  1. 本番環境で Cloud SQL for PostgreSQL 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 ----------
    
  2. データベースの移行を確認するため、ブラウザに次の URL を入力します。

    https://VERSION_ID-dot-PROJECT_ID.REGION_ID.r.appspot.com

    以下を置き換えます。

    • VERSION_ID: 以前にデプロイしたアプリの新しいバージョンです。バージョンのリストを取得するには、gcloud app versions list を使用します。最後の default サービス バージョン項目が最新のデプロイメントです。
    • PROJECT_ID: Google Cloud プロジェクト ID
    • REGION_ID: App Engine がアプリに割り当てるコード

デプロイメントが成功すると、次のような出力が表示されます。

実行中の新しい Rails アプリのスクリーンショット

トラフィックを新しいバージョンに移行する

最後に、次のコマンドを使用して、新しくデプロイしたバージョンにトラフィックを誘導します。

gcloud app services set-traffic default --splits [YOUR-VERSION]=1

このアプリの新しいバージョンには、次の URL からアクセスできます。

https://PROJECT_ID.REGION_ID.r.appspot.com

App Engine のログを見る

Rails アプリをデプロイした後、ログを見ることができます。アプリのログは、Google Cloud Console のログビューアを使用して確認できます。

詳しくは、Cloud SDK を使用したログの読み取りをご覧ください。

リソースのクリーンアップ

「Rails 5 で Cloud SQL for PostgreSQL を使用する」チュートリアルが終了したら、Google Cloud で作成したリソースをクリーンアップして、割り当てを取らず、今後料金が発生しないようにします。次のセクションで、リソースを削除または無効にする方法を説明します。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

App Engine のバージョンの削除

アプリのバージョンを削除するには:

  1. Cloud Console で、App Engine の [バージョン] ページに移動します。

    [バージョン] ページに移動

  2. デフォルト以外で削除するアプリのバージョンのチェックボックスをオンにします。
  3. [削除] をクリックして、アプリのバージョンを削除します。

Cloud SQL インスタンスの削除

Cloud SQL インスタンスを削除するには:

  1. Cloud Console で、[SQL インスタンス] ページに移動します。

    [SQL インスタンス] ページに移動

  2. 削除する SQL インスタンスの名前をクリックします。
  3. [削除] をクリックしてインスタンスを削除します。

次のステップ