ECSでrailsアプリケーション(開発環境)を動かしてみる。


最近、テストサイトを社内向けに公開する機会があり、ElasticBeanstalkを使おうと思ったのですが、意外とGemfileのPrivateなリポジトリのアクセスに手間取り(結局、途中で諦め)、こんな時間がかかるならはやりのDockerを使ってRailsを公開してみようと思い立ったのが今回です。

(現在稼働中のものを元に書いたので少し抜けがあるかもしれません。)

今回紹介すること

  • 今回使ったDockerfile
    • rails
    • nginx
  • ECSの設定

注意

今回は、あくまでも社内限定のため 開発環境 のためいろいろとガバガバな部分があると思います。ECSでrailsを動かすことを目標としてます。

また、今回Dockerを触ったのが始めてたので少し設定ファイルに間違いがあるかもしれません。

rails環境に使ったDockerfileの設定

## amazonlinuxのイメージを落としてくる。
FROM amazonlinux:latest
MAINTAINER RyujiKawazoe

## システムの更新
RUN yum -y update

## rubyに必要なもの
RUN echo "install ruby environment"
RUN yum install -y git vim sudo tar wget
RUN yum install -y gcc make gcc-c++ zlib-devel httpd-devel openssl-devel curl-devel sqlite-devel

## rbenvを使わずに、ruby2.3を落とす。
RUN echo "install ruby2.3"
RUN cd /root/ && wget http://cache.ruby-lang.org/pub/ruby/ruby-2.3.3.tar.gz
RUN cd /root/ && tar zxvf ruby-2.3.3.tar.gz
RUN cd /root/ruby-2.3.3 && ./configure && make && make install
RUN gem install bundler --no-ri --no-rdoc -V
RUN gem install rb-readline --no-ri --no-rdoc -V

##pip インストール準備。
RUN curl -kL https://bootstrap.pypa.io/get-pip.py | python
RUN pip install awscli

## aws 連携準備
RUN yum install -y expect

## ssh認証をコピーする(秘密鍵を元に公開鍵を作る。codecommitの認証のため、ssh/configファイルを作成する
## ssh/configには、codecommit連携の他にssh接続先確認をoffにする宣言もしておく。
RUN mkdir -p /root/.ssh
ADD [CodeCommitとの認証が取れている秘密鍵] /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa
RUN ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
RUN chmod 644 ~/.ssh/id_rsa.pub
ADD [codecommitとのssh認証をかけるための設定が描かれているconfigファイル] /root/.ssh/config

## railsプロジェクトのダウンロード
RUN mkdir /app
## キャッシュされたら困るので。(少しここは、改善したほうがいい?)
ADD dummyfile /data/
RUN git clone ssh://git-codecommit.us-east-1.amazonaws.com/v1/hogehogehoge /app/project
RUN cd /app/project && git pull origin master
RUN cd /app/project && bundle install

## rails アプリケーションの起動
EXPOSE 3000
WORKDIR /app/project
ENTRYPOINT ["puma"]

ところどころに不必要なものもあるかもしれないが、やっていることは以下

  1. amazonlinuxイメージを持ってくる
  2. ruby(rails)を動かすパッケージを入れる
  3. codecommitにソースがあるので(プロジェクト本体、Gemfileに記載されているライブラリ)、codecommitに内部からアクセスするための設定を入れる
  4. gemたちを落としてきて、pumaを起動する。

これで、ECS上で起動させる rails を動かすDockerイメージができました。

お次は、nginxの設定ファイルです。

nginx環境に使ったDockerfileの設定

  • Dockerfile
FROM nginx:latest
COPY nginx.conf /etc/nginx/nginx.conf
  • nginx.conf
http {
    upstream puma {
      server app:3000;
    }

    server {
        listen       80;

        location / {
            proxy_pass http://puma;
        }
    }
}

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

app:3000 とか何だ?と思う方がいるかもしれませんが、コンテナどうしのリンクとかいうやつです。

以下の記事を参考にさせていただきました。

ECSの設定について

大まかな流れとしては以下です。

  1. 今回作った2つのDockerイメージをプッシュするリポジトリを作る。
  2. タスク定義を行う

Dockerイメージをプッシュするリポジトリを作る

ここですね。特に難しいことはないので、詳しい手順は書きません。

今回2つDockerイメージを作ったので、2つ用意してください。

ECSのタスク定義

設定 内容
タスク定義名 適当
タスクロール もしかしたら、他のサービスと連携する可能性があるかもしれないので、専用のIAMRoleを作っておきました。
ネットワークモード host or bridge接続があったのですが、bridge接続でいいのかな? https://www.agilegroup.co.jp/technote/docker-network-in-bridge.html

そして、今回作ったDockerイメージを登録。

まずはrailsを動かすコンテナの設定

設定 内容
コンテナ名 puma あとで、nginxのコンテナとリンクするために、分かりやすい名前で
イメージ 先ほど作ったrailsイメージリポジトリののURIを
メモリ制限 300MBおすすめとか書いてあるので、とりあえず300MBで
CPUユニット数 1でいいか(適当)

上の設定以外は特に、内容はデフォルトのままです。
Dockerのリンク機能を使うため、ポートマッピングはしてません。

続いてnginxコンテナのイメージを追加します。

設定 内容
コンテナ名 nginx
イメージ 先ほど作ったnginxイメージリポジトリののURIを
メモリ制限 300MBおすすめとか書いてあるので、とりあえず300MBで
CPUユニット数 1でいいか(適当)
ポートマッピング ホスト80, コンテナ80
リンク puma:app

nginxコンテナのポートマッピング設定

nginxコンテナのリンク設定

ここがコンテナ間でのリンクとなります。
pumaに関しては、railsコンテナで指定した名前appに関してはnginx.confの設定で使った名前を使っています。

クラスターの作成

これですね。
必要に応じてVPC、IAM、セキュリティーグループの設定を行ってください。

ただ、EC2に割り当てるIAMには「AmazonEC2ContainerServiceforEC2Role」ポリシーが必要です。

サービスの設定

設定 内容
タスク定義 先ほど作ったタスクを設定してください
クラスター 先ほど作ったクラスターを設定してください
サービス名 適当
タスクの数 1
最小ヘルス率 1
最大ヘルス率 100

正直なところ、最小ヘルス率最大ヘルス率に関しては適当すぎます。

詳しい設定の仕方に関しては、以下の記事が参考になるかもしれません。

これでサービスを登録すれば、railsアプリケーションがみれると思います。

その他