title-logo

Rails 4.2 を PostgreSQL を使って Elastic Beanstalk にセットアップする (2)

January 18, 2015

Rails 4.2 を PostgreSQL を使って Elastic Beanstalk にセットアップする (1) の続きです。

今回は DB の設定をしていきます。が、その前に SECRET_KEY_BASE 環境変数をセットします。

SECRET_KEY_BASE

Rails はデフォルトでセッションの情報を「すべて」クライアントの Cookie に格納するため、それを暗号化するための秘密鍵が必要です。当然これは秘密にする必要があるため、Rails 4.1 からは、production 環境ではそれを環境変数 SECRET_KEY_BASE に設定して、config/secrets.yml で読み込むようになっています。(確か、Rails 4.0 のチュートリアルでは、config/secrets.yml が無かったので、initializer で動的に生成していました。) したがって、環境変数 SECRET_KEY_BASE を設定しておかないとエラーになります。

Elastic Beanstalk での環境変数の設定は Web の管理コンソールから行います。

Configuration -> Software Configuration -> Environment Properties

ここに、SECRET_KEY_BASE を設定します。設定する値は、以下のコマンドを使うことでランダムな値を生成できるので、それを使います。

$ bundle exec rake secret
7fc70baba5799f79dc74762ec98def9b0b6be35825a4177c1732f2dae7c160bf87a1581a94608e36a0c24af5f1c2765cb50ea9c037372357e58c92d66d8e0cde

set-up-rails-4-2-on-elactic-beanstalk-with-postgresql-2-1.png

RDS のセットアップ

それでは DB を設定していきます。RDS で PostgreSQL を使います。RDS の設定を CLI から行うことはできないようなので、Web の管理コンソールから設定します。

Configuration -> Data Tier -> create a new RDS database

set-up-rails-4-2-on-elactic-beanstalk-with-postgresql-2-2.png

RDS の設定をします。DB Engine に postgres を指定し、任意の Master Username と Master Password を設定します。

set-up-rails-4-2-on-elactic-beanstalk-with-postgresql-2-3.png

RDS を設定すると、再度 environment のアップデートが実行されます。ここでも結構時間がかかるので、RDS のコンソールに行って、間違いなくインスタンスが作成されていることを確認しながらでものんびり待ちましょう。

アップデートが完了したら、Rails に RDS への接続情報を設定します。config/database.yml の production 設定を以下のように変更します。(RDS_DB_NAME などの環境変数は Elastic Beanstalk が自動的に設定してくれます。)

config/database.yml

production:
  <<: *default
  database: <%= ENV["RDS_DB_NAME"] %>
  username: <%= ENV["RDS_USERNAME"] %>
  password: <%= ENV["RDS_PASSWORD"] %>
  host: <%= ENV["RDS_HOSTNAME"] %>
  port: <%= ENV["RDS_PORT"] %>

アプリケーションのデプロイ

RDS の設定ができたので、アプリケーションをデプロイします。デプロイは eb deploy コマンドを使用します。

まずは変更をコミットします。

$ git commit -am"Configure database.yml for RDS"

コミットしたらデプロイしましょう。

$ eb deploy
INFO: Environment update is starting.
INFO: Deploying new version to instance(s).
INFO: Deleted log fragments for this environment.
INFO: New application version was deployed to running EC2 instances.
INFO: Environment update completed successfully.

アプリケーションの動作を確認する

デプロイが無事に完了したら、以下のコマンドでアプリケーションを開くことができます。

$ eb open

ただ、現時点ではルーティングなどが何も設定されていないので、先に簡単に確認用にアプリケーションを構成しておきます。

$ bin/rails generate scaffold user name:string email:string
$ bundle exec rake db:migrate

config/routes.rb

Rails.application.routes.draw do
  root "users#index"

  ...
end

変更をコミットして再度デプロイします。

$ git add -A
$ git commit -m"Add scaffold user"
$ eb deploy

デプロイが完了したらアプリケーションを開きます。

$ eb open

set-up-rails-4-2-on-elactic-beanstalk-with-postgresql-2-4.png

ちゃんと期待通りに動いているようです。

とりあえず Rails が動くところまで来ました。Heroku と比較すると不便に感じる点は多いですが思ったより簡単でした。オートスケールなどの AWS の機能を使うことを見越しているのであれば、はじめから Elastic Beanstalk を選択するのもよいかもしれません。

それと、今回最初に SSH ログインを無効にしましたが、CLI の機能が豊富ではないので SSH は必須と感じました。後から有効にしたいときには、eb ssh --setup を実行すれば OK です。

environment の削除

試し終ったので、environment を削除します。

$ eb terminate

これで、Elastic Beanstalk によって作成された EC2 や RDS のインスタンスなども自動で削除されます。ただ、前回も書いた通り、S3 バケットだけは自動では削除されませんので、S3 のコンソールから手動で削除してください。ただし、その際に、以下のエラーが発生しました。

You don't have permissions to delete this bucket. You can check your bucket's permissions within bucket properties.

この場合、削除したいバケットのプロパティを表示し、Permissions -> Edit bucket policy をクリックし、"Effect": "Deny" となっている箇所を "Effect": "Allow" に書き換える必要があります。

また、RDS で DB のスナップショットを取得する設定にしていた場合には、スナップショットも削除されませんので手動で削除してください。
今回は environment が 1 つだけなので、アプリケーションはこれで空になります。最後に、Elastic Beanstalk の Dashboard からアプリケーションを削除して完了です。