Elastic BeanstalkでRails newしたものをproductionで動かす

会社のほうでGCPを使っていたけど最近はAWSを使うようになったので、個人で作っているサービスもGCPで動かしてたのでAWSに移行しようと思った
後はせっかく移行するのでDockerでやってみようということでまずはそれをどう実現できるかさぐった

そこで出てきたのがElastic Beanstalk(以下EB)!!

aws.amazon.com

EBとはなんだということで公式のQ&Aからを引用してきました

AWS Elastic Beanstalk により、AWS クラウドのアプリケーションを迅速にデプロイし管理するのが開発者にとってより簡単になります。開発者は単にそのアプリケーションをアップロードするだけで、Elastic Beanstalk が自動的に容量のプロビジョニング、負荷分散、Auto-Scaling、およびアプリケーション状態モニタリングといったデプロイの詳細を処理します。 https://aws.amazon.com/jp/elasticbeanstalk/faqs/

アプリケーションしてそれをアップロードすればバージョン管理はしてくれるし、負荷分散とかモニタリングとか普段は自分で面倒みる部分が少なくなるみたいです
Ruby, PHP, Java, Python, Node.jsなど様々な言語に対応しているのですが、Dockerもサポートしてます!!!

このEBでDockerを動かすときは2つ選択肢があり、単一コンテナと複数コンテナがあります
単一コンテナがDokcerfile1つで動くもので、複数コンテナがdocker-composeで動かすアプリケーションのようなイメージです
今回はRails newしただけのアプリケーションを動かすので単一コンテナで動かしていきます

まずはローカルで動くものを作る

今回はRails + unicornを本番環境で動かすのでまずはそれをローカルで実現します
RailsのバージョンはRails 5.1.2, rubyは2.4.1を使用します

$ rails new sample
# viewを作成する
$ rails g controller sample index

viewは下記のようなものを用意

<h1>Sample#index</h1>
<p>RAILS_ENV is <%= ENV['RAILS_ENV'] %></p>

後は今回はunicornを使用するのでGemfileにgem 'unicorn'を追記する
後は# gem 'therubyracer', platforms: :rubyをコメントインする
これでRails側の準備は終了!!

Dockerfileの準備

Dockerfileは今回はRuby2.4.1のイメージをベースにした
unicorn_railsがデフォルトで8080ポートを使うのでEXPOSE 8080してる
最低限これで動く

FROM ruby:2.4.1

ENV RAILS_ENV production

ADD . /work

WORKDIR /work

RUN bundle install -j2 --without test development --no-cache --deployment
RUN bundle exec rake assets:precompile

EXPOSE 8080

CMD ["bundle", "exec", "unicorn_rails"]

後はこれをビルドしてdocker runするだけ

$ docker build -t hatappi/eb-rails-sample .
# Railsはproductionで動かす際にSECRET_KEY_BASEから値をうけとってるのでrunする際に指定する
$ docker run -it -e SECRET_KEY_BASE=hogehoge -p 8080:8080 hatappi/eb-rails-sample

f:id:hatappi1225:20170630092838p:plain

Elastic Beanstalkへのデプロイ準備

今回はEB CLIを使うので事前にインストールをしておく必要があります => こちら

後はさきほど作成したRailsプロジェクトにて下記を実行していきます

# まずリージョンとかアプリケーション名とかどのフォーマットを選択するなどを設定する
$ eb init
# 環境の設定を行います 今回環境名はrails-sample-prdにしてます
# 同時に初回デプロイもされる
$ eb create
# ただEB上ではSECRET_KEY_BASEが設定されてないので真っ白な画面が表示されるはず
# 環境変数SECRET_KEY_BASEを設定
$  eb setenv -e rails-sample-prd SECRET_KEY_BASE=hogehoge
# 再度デプロイ
$ eb deploy

確認

eb openで今回作成したアプリケーションのURLがrootで開くので後は /sample/indexとすれば無事下記の画面が見られるはず

f:id:hatappi1225:20170630100831p:plain

最後に

今回は最小限の設定で行いましたが、負荷分散をせずコストを押さえて単一インスタンスで行うなどEBにはまだまだ設定があるので、それはおいおいやっていきます