ECS + ALB でダウンタイムなしでデプロイ

Docker

ローカル環境(Mac)には、Docker for Macをインストールして起動しておく。

$ vim Dockerfile
FROM ruby:2.3.1

ENV APP_ROOT /usr/src/testapp

WORKDIR $APP_ROOT

RUN apt-get update && \
    apt-get install -y nodejs \
                       --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*

COPY Gemfile $APP_ROOT
COPY Gemfile.lock $APP_ROOT

RUN \
  echo 'gem: --no-document' >> ~/.gemrc && \
  cp ~/.gemrc /etc/gemrc && \
  chmod uog+r /etc/gemrc && \
  bundle config --global jobs 4 && \
  bundle install && \
  rm -rf ~/.gem

COPY . $APP_ROOT

EXPOSE  3000
CMD ["rails", "server", "-b", "0.0.0.0"]
$ docker build -t ecs-sample/sample .
$ docker run -p 80:3000 ecs-sample/sample

http://localhost へアクセス

ECR

$ aws ecr get-login --region us-west-2 --profile test
11370* docker login -u AWS -p <発行されるパスワード> -e none https://745403317212.dkr.ecr.us-west-2.amazonaws.com

表示される -e none は除いて入力。

$ docker login -u AWS -p <発行されるパスワード> https://745403317212.dkr.ecr.us-west-2.amazonaws.com
$ docker tag ecs-sample/sample:latest 745403317212.dkr.ecr.us-west-2.amazonaws.com/ecs-test:latest
$ docker push 745403317212.dkr.ecr.us-west-2.amazonaws.com/ecs-test:latest

ECS

  • ダウンタイム0のデプロイのために、動的ポートマッピングを設定する。
  • 動的ポートマッピングのために、ホストポートを0にする。コンテナポートはアプリケーションのポートに合わせる(Railsでは3000)
  • 最小ヘルス率を50へ変更。
  • awslogs-groupで指定したCW Groupの値のものを作成してからでないと、ログドライバー: awslogs を設定すると、起動時に以下のエラー。
CannotStartContainerError: API error (500): failed to initialize logging driver: ResourceNotFoundException: The specified log group does not exist. status code: 400, request id: 2115d231-14be-11e8-883b-63cc061f87a4 

http://ecs-first-run-alb-1371717613.us-west-2.elb.amazonaws.com/ ALBのエンドポイントでアクセスできるようになる。

Rails

$ vim Gemfile

以下はコメントアウト

# gem 'coffee-rails', '~> 4.2'
$ rbenv exec bundle exec rails generate controller sample
$ vim app/controllers/sample_controller.rb
$ vim app/views/sample/index.html.erb
$ vim config/routes.rb

具体的な編集内容は以下の通り。

require 'socket'

class SampleController < ApplicationController
  def index
    @host = Socket.gethostname
  end
end
<h1>Host : <%= @host %></h1>

Rails.application.routes.draw do ~ end 内に以下を追加。

root 'sample#index'

RSpec

$ vim Gemfile

group :development, :test do ~ end内に以下を追加。

gem 'rspec-rails', '~> 3.7.2'
$ rbenv exec bundle install
$ rbenv exec bundle exec rails generate rspec:install
$ vim .rspec

以下を末尾に追記

--format documentation
$ rbenv exec bundle exec rspec
$ vim config/application.rb

以下を末尾に追加

Rails.application.config.generators do |g|
  g.test_framework :rspec,
    fixtures: true,
    view_specs: false,
    helper_specs: false,
    routing_specs: false,
    controller_specs: true,
    request_specs: false
  g.fixture_replacement :factory_girl, dir: "spec/factories"
end

$ vim spec/controllers/sample_controller_spec.rb

RSpec.describe SampleController, type: :controller do
  describe SampleController do
    context "rspec test" do
      it "test top page 200" do
        get :index
        expect(response).to have_http_status 200
      end$
    end$
  end$
end

Docker Compose

$ vim docker-compose.yaml
version: '3'
services:
  web:
    build: .
    ports:
      - "80:3000"
    command: bundle exec rails server
    volumes:
      - .:/usr/src/testapp
$ docker-compose build
$ docker-compose up

Docker Composeを利用することで、Railsのコードを編集してもビルドし直さないと変更が反映されない事象は解消。

My Twitter & RSS

Leave a Reply

Your email address will not be published. Required fields are marked *