会社のほうでGCPを使っていたけど最近はAWSを使うようになったので、個人で作っているサービスもGCPで動かしてたのでAWSに移行しようと思った
後はせっかく移行するのでDockerでやってみようということでまずはそれをどう実現できるかさぐった
そこで出てきたのがElastic Beanstalk(以下EB)!!
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
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
とすれば無事下記の画面が見られるはず
最後に
今回は最小限の設定で行いましたが、負荷分散をせずコストを押さえて単一インスタンスで行うなどEBにはまだまだ設定があるので、それはおいおいやっていきます