Tech Racho エンジニアの「?」を「!」に。
  • 開発

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を使ってみた(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。