LoginSignup
8
9

More than 5 years have passed since last update.

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

Posted at

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を使うような感覚で進められた。

参考

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9