Posted at

ElasticBeanstalkを使ってRailsをデプロイする

More than 1 year has passed since last update.


ElasticBeanstalkを使ってRailsをデプロイする


  • OS: macOS High Sierra

  • Version: 10.13.5


1. AWSのアカウントを作る

// TODO


2. ローカル環境の設定


  • AWS系

$ brew update

$ brew install awscli
$ brew install aws-elasticbeanstalk


  • Docker系

$ brew install docker

$ brew cask install docker
$ open -a docker // dockerの起動

$ sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.21.2, build 1719ceb


3. Railsプロジェクトの作成

$ mkdir eb-sample

$ cd eb-sample
$ touch Dockerfile
$ touch docker-compose.yml
$ touch Gemfile

Dockerfile

FROM ruby:2.5

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

docker-compose.yml

version: '3'

services:
db:
image: postgres
volumes:
- ./tmp/db:/var/lib/postgresql/data
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db

Gemfile

source 'https://rubygems.org'

gem 'rails', '5.2.0'


  • Railsプロジェクトの作成

  • 権限設定

  • ビルド

$ docker-compose run web rails new . --force --database=postgresql

$ sudo chown -R $USER:$USER .
$ docker-compose build

DB設定を変更(config/database.yml)

default: &default

adapter: postgresql
encoding: unicode
host: db
username: postgres
password:
pool: 5

development:
<<: *default
database: myapp_development

test:
<<: *default
database: myapp_test

$ docker-compose run web rake db:create

$ docker-compose up
$ open localhost:3000

$ git add .

$ git commit -m "add rails setting"


4. ElasticBeanstalkへのデプロイ

$ aws configure --profile [AWSアカウント(`~/.aws/config`に登録済み)]

$ eb init eb-sample --platform docker --keyname aws-eb 

$ eb create eb-sample-dev

INFO: Successfully built aws_beanstalk/staging-app
ERROR: No EXPOSE directive found in Dockerfile, abort deployment
ERROR: [Instance: i-0849603a39b46935b] Command failed on instance. Return code: 1 Output: No EXPOSE directive found in Dockerfile, abort deployment.

ここまででRailsプロジェクトの作成が完了、ただこのままでは以下の問題があるためエラーが発生する


  • Dockerコンテナの公開ポートが指定されてない

  • DB連携がされていない

  • マイグレーションのような初期処理が実行されてない

ここからはこれらの問題を解消する。


Dockerコンテナの公開ポートが指定されてない

Dockerfileに以下を追記

...

EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]

$ git add .

$ git commit -m "add docker expose port"
$ eb deploy
INFO: New application version was deployed to running EC2 instances.
INFO: Environment update completed successfully.

$ eb open // デプロイしたプロジェクトのURLを開く


DB連携がされていない

ElasticBeanstalkのコンソール画面を開き

設定 > データベース(変更) をクリック


  • エンジン: postgres

  • ユーザー名: postgres

  • パスワード: XXXX(好きなパスワード)

を設定(初期設定にしばらくかかるので待機)

次に config/database.yml を更新

default: &default

adapter: postgresql
encoding: unicode
host: <%= ENV.fetch("RDS_HOSTNAME") { "db" } %>
username: <%= ENV.fetch("RDS_USERNAME") { "postgres" } %>
password: <%= ENV.fetch("RDS_PASSWORD") { "" } %>
port: <%= ENV.fetch("RDS_PORT") { "5432" } %>
pool: 5

development:
<<: *default
database: <%= ENV['RDS_DB_NAME'] { "myapp_development" } %>

test:
<<: *default
database: myapp_test

production:
<<: *default
database: <%= ENV['RDS_DB_NAME'] %>

$ git add .

$ git commit -m "update database setting for eb"
$ eb deploy
$ eb open

開いたページで Yay! You’re on Rails! が表示されていれば成功。


マイグレーションのような初期処理が実行されてない

ここまででRailsのトップ画面の表示には成功した。

ただこのままではDBへのアクセスが必要なページは表示できない

試しにTodoモデルを追加して確認してみる

$ docker-compose run web rails g scaffold todo title:string completed:boolean

$ docker-compose run web rake db:migrate
$ docker-compose up -d
$ http://localhost:3000/todos

$ git add .

$ git commit -m "add todo model"
$ eb deploy

INFO: Environment update completed successfully.

eb open で開いてみると、、、

ActiveRecord::PendingMigrationError と表示されている.

ここからはこのエラーの解消を行う.

dockerfile を変更

...

ADD start.sh /myapp/bin/start.sh
RUN chmod +x /myapp/bin/start.sh
EXPOSE 3000
CMD ["bin/start.sh"]

start.sh ファイルを追加

#!/bin/bash

bundle exec rake db:migrate
bundle exec rake assets:precompile
bundle exec rails server

このようにする事でDockerの起動時にマイグレーション処理などを実行する事ができる

$ git add .

$ git commit -m "update dockerfile"
$ eb deploy
$ eb open

開いたページでエラーがなく /todos を開ければ成功


まとめ

以上の処理でElasticBeanstalkを使いRailsプロジェクトをデプロイする事ができた。

この他に実際にサービスをリリースするにはドメインの割当や、TLSの設定、可用性の検証などが必要になるがElasticBeanstalkを使う事でAWSでのデプロイ作業を効率化でき、VPCやEC2のような具体的なサービス構成を意識する事なくHerokuを使うような感覚で進められた。


参考