RailsアプリをAWS Elastic Beanstalkにデプロイする手順(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

RailsアプリをAWS Elastic Beanstalkにデプロイする手順(翻訳)

前回の記事はElixirをElastic Beanstalkにデプロイする方法でしたが、今回は数あるフレームワークの中でもRailsを愛する会社であるSyndicodeより、RailsアプリをAWS Elastic Beanstalkにデプロイする方法のチュートリアルをお送りいたします。なお弊社ではRails開発者を絶賛募集中です。

Elastic Beanstalkについて簡単におさらいします。これはAWS(Amazon Web Services)上にアプリを設定する手順を自動化するクラウドデプロイメントサービスです。本チュートリアルではコマンドラインインターフェイス(CLI)を用いてAWS Elastic BeanstalkにRailsアプリをデプロイする方法をご紹介します。

1. Elastic BeanstalkのCLIをインストールする

Macの場合、HomeBrewでaws-elasticbeanstalkをインストールします。

brew install aws-elasticbeanstalk

Homebrewを使ったことがない場合やLinux環境の場合は、pip(Pythonのパッケージ管理ツール)でインストールします。

sudo pip install awsebcli

Windowsの場合は以下を実行します。

pip install awsebcli

2. Raisアプリをgit cloneする

ここではhttps://github.com/engineyard/todo.gitのサンプルアプリをgit cloneします。Elastic Beanstalk CLIで自分のRailsアプリを使いたい場合は、アプリをGitリポジトリに置く必要があります。

git clone https://github.com/engineyard/todo.git

3. IAMロールを作成する

AWSサイトの手順に従って、IAMロールを2つ作成します。必要なのはaws-elasticbeanstalk-ec2-roleaws-elasticbeanstalk-service-roleです。アプリや環境はElastic Beanstalk CLIで作成しますが、これらのIAMロールの作成だけはElastic Beanstalkコンソールで[Create New Application]をクリックして行います。この手順は一度だけ行う必要があります。以下を順に実行します。

  • Elastic Beanstalk consoleを開きます。
  • [Create New Application]を選択します。
  • ウィザードに従って[Permission]ページまで進みます。
  • [Next]をクリックしてIAM consoleを開きます。
  • [Allow]を選択してロールを作成します。

4. Elastic Beanstalk CLIのセットアップ

cd todo
eb init

AWS Access KeyとAWS Secret Access Keyが1つずつ必要です。ない場合は、IAM consoleでユーザーを1つ作成してcredentialをダウンロードします。リージョン、利用するアプリ([Create New Application])、プラットフォームのバージョンはデフォルト値で構いません。共有するToDoアプリには既にプラットフォームのバージョンが含まれています。独自のRailsアプリを使う場合は、Ruby 2.3 Pumaを必ず追加してください。

5. 環境を作成する

eb create todo_production

Elastic BeanstalkはSecurity Group、ELB、Auto Scalingグループを作成します。3分もすれば環境が整い、以下でアプリをチェックできるようになります。

eb open

環境の情報


Engine Yardのサンプルデプロイアプリより

以下にご注意ください。

  • Rubyは/opt/rubies/ruby-2.3.4の下に置かれます
  • Railsアプリは/var/app/currentの下に置かれます
  • ユーザー名はWebアプリ名が使われます

6. データベースを作成する

このToDoアプリの設定は、実際のアプリで使うには少々正しくない点があります。ToDoアプリのconfig/database.ymlではSQLite3データベースを使っているため、データベースを設定していなくても動いてしまいます。todo_production環境がEC2インスタンスを1つ持っているだけなので、さしあたってこれで十分です。しかしAuto ScalingグループでEC2インスタンスがもうひとつ作成されると、新しいインスタンスは独自のSQLite3データベースを持ちます。これは期待する動作ではないでしょう。データベースを1つにまとめるには、config/database.ymlを削除します。DATABASE_URLを使うので、このファイルは不要になります。

git rm config/database.yml
git commit -m 'Remove database.yml'

RDS consoleでRDSインスタンスを1つ作成します。MySQLまたはPostgreSQLを使えます。このToDoアプリのGemfileにはmysql2 gemとpg gemが両方入っているので、どちらもサポートされています。オプションのデータベース名フィールドには「todo」と入力します。論理データベースは、RDSインスタンスの作成後に作成されます。セキュリティのため、[Publicly Accessible]はNoに設定します。RDSインスタンスの準備が整ったら、Detailsアイコンをクリックして[Security Group]をクリックします。rds-launch-wizard-2 (sg-041b107e)のような文字列が表示されます。

[Security Group]ページで、[Inbound]、[Edit]の順にクリックし、PostgreSQL用のルールを追加します。sourceでCustomを選択してElastic Beanstalk環境のSecurity Groupを入力します。sgと入力するとSecurity Groupのリストが表示されます。

正しいSecurity Groupが見つからない場合は、グループ名にElastic Beanstalk環境idが使われています。環境idを取得するには、eb statusと入力します。私の場合、環境idがe-kq7hjkf7dtで、Security Group名がawseb-e-kq7hjkf7dt-stack-AWSEBSecurityGroup-44MI138FQVGとなっています。AWSEBLoadBalancerSecurityGroupを含む名前は選択しないでください。


Engine Yardのキャプチャ画像より

これでElastic Beanstalkによって作成されたEC2インスタンスがRDSインスタンスにアクセスできるようになるはずです。このElastic Beanstalk環境に紐付けられるRDSインスタンスを作成することもできますが、この環境をterminateするとRDSインスタンスもterminateしてしまうためおすすめできません。

7. DATABASE_URLを設定する

RDS credentialを使ってDATABASE_URL環境変数を設定します。形式はdb_type://username:password@hostname:port/db_nameです。たとえば、PostgreSQLインスタンスを作成した場合は次のcredentialを使います。

user: engineyard
password: mysecretpassword
hostname: eypostgres.cjb9zibjzcpd.us-west-2.rds.amazonaws.com
port: 5432
db name: todo

続いて以下を実行します。

eb setenv DATABASE_URL=postgres://engineyard:mysecretpassword@eypostgres.cjb9zibjzcpd.us-west-2.rds.amazonaws.com:5432/todo

次に、アプリをdatabase.ymlなしでデプロイしてページを開きます。

eb deploy
eb open

以上で、単独のRDSインスタンスを用いるElastic Beanstalk上でRailsアプリが動きました。

8. Secret Key Base

この環境変数を使わない場合は、SECRET_KEY_BASEを設定するか、encrypted Rails secretsを使う場合はRAILS_MASTER_KEYを設定します。bundle exec rake secretでsecret key baseを新しく生成します。

eb setenv SECRET_KEY_BASE=cccae61c0c117c787745b596655caa50062dc3fc739505df02e209d9e737a2f39ab484d20e63d5937e1c58901e81109523807f66be421728851fecc2262ed5a8

9. SSH

eb initを実行すると、public keyを追加できます。新しいkeyペアを作成することもできます。eb initを既に実行した場合は、--interactiveオプションを付けて再度実行することもできます。eb sshを実行して、自分の環境のEC2インスタンスに接続します。

10. 以上でおしまいです

AWS Elastic BeanstalkにRailsアプリをデプロイする簡単な方法をご紹介いたしました。サポートされるRubyバージョンやAppサーバーに制約があるため、一部については制御できないことがあります。Sidekiqなどのバックグランドワーカーについては改良が必要です。現時点では、.ebextensionsにファイルをひとつ作成し、SidekiqワーカーをRailsアプリと同じインスタンスで実行する必要があります。中規模アプリでは、Sidekiq専用のインスタンスを用意すべきです。

もっと詳しく知りたい方は、ぜひweekly newsletterをご購読ください。

関連記事

無料で使えるAWSアカウント用セキュリティ監査ツールの紹介(翻訳)

Rails 5.2を待たずに今すぐActiveStorageを使ってみた(翻訳)

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ