Chapter 16

AWS ECR(バックエンド編)

hibriiiiidge
hibriiiiidge
2020.10.19に更新

それではバックエンドの image の作成、ECR への push を行っていきます。
まずは本番環境の DB の設定から行います。
先の章で RDS の設定をしたかと思うのですが、RDS への接続設定を database.yml に追加します。

...
 production:
   <<: *default
   database: app_production
-  username: app
-  password: <%= ENV['APP_DATABASE_PASSWORD'] %>
+  url: <%= ENV['DATABASE_URL'] %>
...

次に、 Rails コンテナに Nginx を install する記述や Nginx 設定ファイルを作成していきます。
最終的な Dockerfile は以下のようになります。

FROM ruby:2.6.6

ENV LANG C.UTF-8
ENV TZ Asia/Tokyo

RUN mkdir /app
WORKDIR /app

ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock

RUN apt-get update -qq && \
  apt-get install -y build-essential \
  libpq-dev \
  sudo \
  nginx && \
  gem install bundler:2.0.1

RUN bundle install

ADD . /app
RUN mkdir -p tmp/sockets
RUN mkdir tmp/pids

# nginx
RUN groupadd nginx
RUN useradd -g nginx nginx
ADD nginx/nginx.conf /etc/nginx/nginx.conf

EXPOSE 80

RUN chmod +x /app/entrypoint.sh

CMD ["/app/entrypoint.sh"]

nginx.confzenn-app/backend/nginx/ 配下に作成します。

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log error;
pid /var/log/nginx.pid;

events {
  worker_connections 1024;
}

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

  access_log  /var/log/nginx/access.log  main;

  sendfile        on;
  keepalive_timeout  65;
  include /etc/nginx/conf.d/*.conf;

  upstream app {
    server unix:///app/tmp/sockets/puma.sock;
  }

  server {
    listen 80;
    server_name backend.hibriiiiidge.com;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    root /app/public;

    location / {
      proxy_pass http://app;
    }

    client_max_body_size 100m;
    keepalive_timeout 5;
  }
}

次に、 puma.rb に以下の記述を追加します。

...
app_root = File.expand_path('..', __dir__)
bind "unix://#{app_root}/tmp/sockets/puma.sock"

次に、Dockerfile の CMD で実行される entrypoint.sh を作成します。
この entrypoint.sh で、 Nginx の起動、 Rails のセットアップ、 puma の起動を行います。

#!/bin/bash

sudo service nginx start
cd /app
bin/setup
bundle exec pumactl start

次に、 cors.rb を以下のように修正して、本番環境で CORS で弾かれないようにします。
この辺りも環境変数をうまく利用して書いた方が良いと思います。(今回はやりませんが...)

# cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
   allow do
-    origins ['http://localhost:3000']
+    origins ['http://hibriiiiidge.com', 'http://localhost:3000']

     resource '*', headers: :any, methods: %i[get post put patch delete options head]
   end
end

最後に、バックエンドにおけるロードバランサーのヘルスチェックをするためのルーティングとコントローラーを設定します。
今回は api/v1/health_check に GET アクションでリクエストされた時に、ステータスコード 200 が返るように設定します。

namespace :api do
  namespace :v1 do
    resources :tasks, only: :index
+   get :health_check, to: 'health_check#index'
  end
end
module Api
  module V1
    class HealthCheckController < ApplicationController
      def index
        head 200
      end
    end
  end
end

以上で、バックエンドの image を作成するための準備は完了しました。
次に、フロントエンドの時と同様に、AWS ECR にリポジトリを作成し、build して push します。
リポジトリ名を zenn-app-backend とした時のコマンドは以下です。

$ docker build -t zenn-app-backend .
$ docker tag zenn-app-backend:latest xxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/zenn-app-backend:latest
$ docker push xxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/zenn-app-backend:latest

以下のようにリポジトリに image が登録されれば OK です。