概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: How to deploy a Rails app on AWS Elastic Beanstalk
- 原文公開日: 2017/11/13
- 著者: Iryna Korkishko
- サイト: Syndicode — Rails/Android/iOS/デザインを手がける開発会社です
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-roleとaws-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
環境の情報
以下にご注意ください。
- 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を含む名前は選択しないでください。
これで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をご購読ください。