メニュー
AWS Elastic Beanstalk
開発者ガイド (API Version 2010-12-01)

Rails アプリケーションの Elastic Beanstalk へのデプロイ

Elastic Beanstalk コマンドラインインターフェイス(EB CLI)と Git を使用して、Rails アプリケーションを Elastic Beanstalk にデプロイできます。 このウォークスルーでは、その方法を説明します。また、開発環境やアプリケーションがまだない場合に、Rails インストールを最初からセットアップする方法についても説明します。

ソフトウェアのバージョン

ここで紹介する多くのテクノロジは、現在も開発が進められています。最良の結果を得るには、各ツールは可能な限り同じバージョンを使用してください。このチュートリアルを作成する際に使用したバージョンは次のとおりです。

Ubuntu 14.04
RVM 1.26.3
Ruby 2.1.5p273
Rails 4.1.8
Python 2.7.6
プラットフォーム Ruby 2.1(Puma)を実行する 64 ビット Amazon Linux 2015.09 v2.0.6

このチュートリアルで使用されているの表記規則については、『全般的なリファレンス』の「ドキュメントの表記規則」を参照してください。

Rails 開発環境のセットアップ

Rails 開発環境を最初からセットアップする場合は、このセクションをお読みください。開発環境に Rails、Git、および作業用アプリケーションが設定されている場合は、このセクションをスキップできます

Ubuntu EC2 インスタンスの取得

次の手順は、Ubuntu 14.04 が実行されている Amazon EC2 インスタンスを使用して開発およびテストされています。AWS マネジメントコンソール を使用した EC2 インスタンスの設定手順や EC2 インスタンスへの接続手順については、『Linux 用 Amazon EC2 ユーザーガイド』の「はじめに」セクションを参照してください。

AWS マネジメントコンソール へのアクセス権がない場合、またはコマンドラインを使用する場合は、『AWS CLI ユーザーガイド』を参照し、AWS CLI のインストール手順や AWS CLI を使用したセキュリティグループの設定手順を確認して、キーペアの作成とインスタンスの起動を行います。インスタンスを起動するときは、EB CLI で使用する認証情報と同じものを使ってください。

Rails のインストール

RVM(Ruby の一般的なバージョンマネージャ)には、数個のコマンドを使用して RVM、Ruby、Rails をインストールするためのオプションが用意されています。

~$ gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
~$ curl -ssl https://get.rvm.io | bash -s stable --rails
~$ source /home/ubuntu/.rvm/scripts/rvm

nodejs をインストールして、Rails サーバーがローカルで実行できるようにします。

~$ sudo apt-get install nodejs

注記

他のオペレーティングシステムでの Rails のインストールについては、http://installrails.com/ を参照してください。

新しい Rails プロジェクトの作成

アプリケーションの名前と共に rails new を使用して、新しい Rails プロジェクトを作成します。

~$ rails new rails-beanstalk

Rails によって、指定した名前を持つディレクトリが作成され、サンプルプログラムをローカルで実行する際に必要となるすべてのファイルが生成されます。その後で Bundler が実行され、プロジェクトの Gemfile で定義されている依存関係(Gem)がすべてインストールされます。

プロジェクトのローカルでの実行

デフォルトのプロジェクトをローカルで実行して、Rails インストールをテストします。

$ cd rails-beanstalk
rails-beanstalk $ rails server -d
=> Booting WEBrick
=> Rails 4.2.0 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
rails-beanstalk $ curl http://localhost:3000
<!DOCTYPE html>
<html>
  <head>
    <title>Ruby on Rails: Welcome aboard</title>
...

注記

Elastic Beanstalk は Rails アセットをデフォルトでプリコンパイルします。Ruby 2.1 コンテナタイプについては、次の点に注意してください。

  • nginx ウェブサーバーは、/public および /public/assets フォルダからアセットを提供するように事前設定されています。

  • Puma アプリケーションの場合、 が正しく動作するように、gem "puma"Gemfilebundle exec に追加する必要があります。

EB CLI のインストール

このセクションでは、EB CLI、数個の依存関係、および Git をインストールします。

注記

EB CLI を使用するときには、Git または別のリビジョン管理ツールの使用をお勧めしますが、必須ではありません。このチュートリアルで Git を使用するステップをすべて省略してもかまいません。

Git、Python 開発ライブラリ、pip のインストール

このチュートリアルでは、リビジョンの管理に Git を使用し、EB CLI のインストールの管理に Pip を使用します。Ubuntu の開発環境では、次の一連のコマンドを使用して、Git、Python 開発ライブラリ、pip のすべてをインストールできます。

~$ sudo apt-get install git
~$ sudo apt-get install python-dev
~$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
~$ sudo python get-pip.py

Windows ユーザー

Python 3.4 をインストールします。これには pip が含まれます。

EB CLI のインストール

pip では、1 つのコマンドを使用して EB CLI をインストールできます。

Linux, macOS, or Unix

~$ sudo pip install awsebcli

Windows

> pip install awsebcli

Git リポジトリのセットアップ

Rails プロジェクトがローカルの Git リポジトリにすでに存在する場合は、「EB CLI の設定」に進んでください。

最初に、リポジトリを開始します。Rails プロジェクトディレクトリで、「git init」と入力します。

~/rails-beanstalk$ git init
Initialized empty Git repository in /home/ubuntu/rails-beanstalk/.git/

次に、プロジェクトのすべてのファイルをステージング領域に追加し、変更をコミットします。

~/rails-beanstalk$ git add .
~/rails-beanstalk$ git commit -m "default rails project"
 56 files changed, 896 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 Gemfile
...

EB CLI の設定

Git リポジトリを設定し、必要なすべてのツールをインストールすると、EB CLI プロジェクトを簡単に設定できます。プロジェクトディレクトリで eb init を実行し、表示される手順に従うだけです。

~/rails-beanstalk$ eb init
Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
...

このチュートリアルでは次の値を使用しますが、お客様の要件に適した値を自由に使用してもかまいません。アクセスキーがない場合は、「AWS 全般リファレンス」の「セキュリティ認証情報の入手方法」を参照してください。

サービス対象 Enter キー(デフォルトを維持します)
AWS アクセスキー ID お客様のアクセスキー
AWS シークレットアクセスキー お客様のシークレットキー
アプリケーション名 Enter キー(デフォルトを維持します)
Ruby を使用しますか? y キー(はい)
プラットフォームのバージョン Ruby 2.1(Puma)
SSH をセットアップしますか? n キー(いいえ)

デプロイの環境を設定するだけでなく、eb init は Git の一部の拡張機能をセットアップしたり、エントリをプロジェクトディレクトリの .gitignore ファイルに追加したりすることができます。次の手順に進む前に、変更を .gitignore にコミットしてください。

~/rails-beanstalk$ git commit -am "updated .gitignore"

サービスロールとインスタンスプロファイルの作成

新しいプラットフォームバージョンでは、ロールとインスタンスプロファイルが必要です。これらのロールで、Elastic Beanstalk は環境リソースをモニタリングと、環境のインスタンスによるログファイルの Amazon S3 へのアップロードを許可します。詳細については、「サービスロール、インスタンスプロファイル、ユーザーポリシー」を参照してください。

サービスロールおよびインスタンスプロファイルがまだない場合は、それらを作成している Elastic Beanstalk マネジメントコンソールを使用します。

サービスロールとインスタンスプロファイルを作成するには

  1. Elastic Beanstalk コンソールを開きます。

  2. [Create New Application] を選択します。

  3. [Permissions] ページに達するまでウィザードを進みます。

  4. [Next] を選択して IAM コンソールを開きます。

  5. [Allow] を選択してロールを作成します。

Gemfile の更新

Elastic Beanstalk へアプリケーションをデプロイする前に、Rails によって生成されるデフォルトの Gemfile ファイルで簡単な変更を行う必要があります。gem のリストに Puma を追加して、正しくインストールされていることを確認します。

~/rails-beanstalk/Gemfile

source 'https://rubygems.org'
gem 'puma'
gem 'rails', '4.1.8'
gem 'sqlite3'
...

git commit で変更をコミットします。

~/rails-beanstalk$ git commit -am "Add Puma to Gemfile"

プロジェクトのデプロイ

次に、Elastic Beanstalk 環境を作成し、eb create を使用してそこにアプリケーションをデプロイします。

~/rails-beanstalk$ eb create rails-beanstalk-env
Creating application version archive "app-150219_215138".
Uploading rails-beanstalk/app-150219_215138.zip to S3. This may take a while.
Upload Complete.
Environment details for: rails-beanstalk-env
  Application name: rails-beanstalk
  Region: us-west-2
  Deployed Version: app-150219_215138
  Environment ID: e-pi3immkys7
  Platform: 64bit Amazon Linux 2015.09 v2.0.6 running Ruby 2.1 (Puma)
  Tier: WebServer-Standard
  CNAME: UNKNOWN
  Updated: 2015-02-19 21:51:40.686000+00:00
Printing Status:
INFO: createEnvironment is starting.
...

注記

「service role required」エラーメッセージが表示された場合は、eb create をインタラクティブに (環境名を指定せずに) 実行してください。EB CLI によってロールが作成されます。

1 つのコマンドを使用するだけで、EB CLI では、アプリケーションを AWS で実行する際に必要となるすべてリソースをセットアップします。次のようなリソースがあります。

  • 環境データを保存する Amazon S3 バケット

  • トラフィックをウェブサーバーに分散するロードバランサー

  • 着信ウェブトラフィックを許可するセキュリティグループ

  • 負荷の変化に応じてサーバーの数を調整する Auto Scalingグループ

  • 負荷が低くなった場合または高くなった場合に Auto Scaling グループに通知する Amazon CloudWatch アラーム

  • アプリケーションをホストする Amazon EC2 インスタンス

処理が完了すると、EB CLI はアプリケーションサーバーのパブリック DNS 名を出力します。デフォルトのブラウザでウェブサイトを開くには、eb open を使用します。Ubuntu 環境の場合、デフォルトのブラウザは W3M と呼ばれるテキストベースブラウザとなります。

$ eb open
A really lowlevel plumbing error occured. Please contact your local Maytag(tm) repair man.

これは、何らかの異常が発生していることを示す Puma のメッセージです。このようなエラーが発生した場合は、eb logs コマンドを使用してログを調べてください。

rails-beanstalk $ eb logs
INFO: requestEnvironmentInfo is starting.
INFO: [Instance: i-8cdc6480] Successfully finished tailing 5 log(s)
================ i-8cdc6480 =================
-------------------------------------
/var/log/eb-version-deployment.log
-------------------------------------
...

対象となるエラーは、ウェブコンテナのログ(/var/log/puma/puma.log)に記録されています。

...
-------------------------------------
/var/log/puma/puma.log
-------------------------------------
=== puma startup: 2014-12-15 18:37:51 +0000 ===
=== puma startup: 2014-12-15 18:37:51 +0000 ===
[1982] + Gemfile in context: /var/app/current/Gemfile
[1979] - Worker 0 (pid: 1982) booted, phase: 0
2014-12-15 18:41:42 +0000: Rack app error: #<RuntimeError: Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`>
/opt/rubies/ruby-2.1.4/lib/ruby/gems/2.1.0/gems/railties-4.1.8/lib/rails/application.rb:462:in `validate_secret_key_config!'
/opt/rubies/ruby-2.1.4/lib/ruby/gems/2.1.0/gems/railties-4.1.8/lib/rails/application.rb:195:in `env_config'
...

アプリケーションを使用できるようにするには、環境変数をいくつか設定する必要があります。まず、プロジェクトの secrets.yml フォルダーにある config で参照される SECRET_KEY_BASE を設定します。

この変数はキーを作成するために使用されます。また変数名が示すように、シークレットにする必要があります。そのため、この変数は、他のユーザーが参照できるようなソース管理では保存しないようにする必要があります。この変数は eb setenv を使用して任意の値に設定します。

rails-beanstalk $ eb setenv SECRET_KEY_BASE=23098520lkjsdlkjfsdf
INFO: Environment update is starting.
INFO: Updating environment rails-beanstalk-env's configuration settings.
INFO: Successfully deployed new configuration to environment.
INFO: Environment update completed successfully.

設定の更新や新しいコードのデプロイを行うたびに、EB CLI によってウェブサーバーが自動的に再起動されます。サイトをもう一度読み込んでみます。

$ eb open
The page you were looking for doesn't exist (404)

404 エラーが発生したため、状況があまり改善されていないことが考えられますが、ウェブコンテナが動作しており、探しているページへのルートを検索できなかったことは確認できます。

以前に表示されていた先頭ページにはどのような問題が発生したのでしょうか。この場合、重要となる環境変数は RACK_ENV です。ここでは、この変数は production に設定されており、デバッグ機能や "Welcome to Rails" ページが表示されなくなっています。

eb printenv コマンドを使用して、すべての環境変数の現在の値を表示します。

rails-beanstalk $ eb printenv
 Environment Variables:
     AWS_SECRET_KEY = None
     RAILS_SKIP_ASSET_COMPILATION = false
     SECRET_KEY_BASE = 23098520lkjsdlkjfsdf
     RACK_ENV = production
     PARAM5 = None
     PARAM4 = None
     PARAM3 = None
     PARAM2 = None
     PARAM1 = None
     BUNDLE_WITHOUT = test:development
     RAILS_SKIP_MIGRATIONS = false
     AWS_ACCESS_KEY_ID = None

この問題を修正するための適切な方法は、コンテンツとルートをプロジェクトに追加することです。ただし、もうしばらくプロジェクトの動作を調べた後で、RACK_ENV を development に設定します。

rails-beanstalk $ eb setenv RACK_ENV=development

次回サイトを読み込むときは、正常に読み込まれます。

$ eb open
Ruby on Rails: Welcome aboard
...

これでアプリケーションが動作すること確認できたので、RACK_ENV を production に戻し、そのコンテンツの追加について考慮することができます。

rails-beanstalk $ eb setenv RACK_ENV=production

アプリケーションの更新

次に、本稼働モードで表示された 404 エラーを回避するために、先頭ページにコンテンツを追加します。

最初に、rails generate を使用して、コントローラー、ルート、および先頭ページのビューを作成します。

$ rails generate controller WelcomePage welcome
      create  app/controllers/welcome_page_controller.rb
       route  get 'welcome_page/welcome'
      invoke  erb
      create    app/views/welcome_page
      create    app/views/welcome_page/welcome.html.erb
...

この操作によって、rails-beanstalk-env-kpvmmmqpbr.elasticbeanstalk.com/welcome_page/welcome にあるページにアクセスするために必要なすべてのデータが用意されます。ただし、変更を発行する前に、ビューのコンテンツを変更し、このページがサイトの最上位レベルに表示されるようにルートを追加します。

任意のテキストエディタを使用して app/views/welcome_page/welcome.html.erb の内容を編集します。Nano と Vim はよく使用されるコマンドラインエディタです。この例では、cat を使用して既存のファイルのコンテンツを上書きします。

rails-beanstalk $ cat > app/views/welcome_page/welcome.html.erb
> <h1>Welcome!</h1>
> <p>This is the front page of my first Rails application on Elastic Beanstalk.</p>
Ctrl+D

最後に、次のルートを config/routes.rb に追加します。

Rails.application.routes.draw do
  get 'welcome_page/welcome'
  root 'welcome_page#welcome'
end

これにより、Rails は、リクエストをウェブサイトのルートに送り、先頭ページのコントローラーの welcome メソッドにルーティングできるようになります。このメソッドでは、先頭ページのビュー(welcome.html.erb)のコンテンツを表示します。これで、eb deploy を使用して、変更のコミットと環境の更新を行う準備ができました。

rails-beanstalk $ git add .
rails-beanstalk $ git commit -m "welcome page controller, view and route"
rails-beanstalk $ eb deploy
INFO: Environment update is starting.
INFO: Deploying new version to instance(s).
INFO: New application version was deployed to running EC2 instances.
INFO: Environment update completed successfully.

更新プロセスは高速に処理されます。コマンドラインで Curl を使用してフロントページを読むか、eb open と入力してウェブブラウザでサイトを開き、結果を確認してください。

$ eb open
Welcome

This is the front page of my first Rails application on Elastic Beanstalk.

これで、Rails サイトで作業を続けることができます。プッシュする新しいコミットがある場合は必ず、eb deploy を使用して環境を更新します。

クリーンアップ

アプリケーションを実行したくない場合は、環境を終了し、アプリケーションを削除してクリーンアップできます。

環境を終了するには terminate コマンドを、アプリケーションを削除するには delete コマンドを使用します。

環境を終了するには、アプリケーションを削除できます。

  • ローカルリポジトリを作成したディレクトリから、eb terminate を実行します。

    $ eb terminate

    このプロセスには数分かかることがあります。環境が正常に終了すると、Elastic Beanstalk にメッセージが表示されます。

引き続きサイトを開発する場合は、リソースを節約するために環境を終了しても問題ありません。eb create を使用することで、Beanstalk 環境をいつでも再作成できます。