gyaboooのゆる〜いブログ

ゆるくレンタルサーバーの保守してます

CircleCIを使ってAWS ECSにRailsをデプロイ(ALBとECRも使ってます)

最近、寒くなってきました。

布団から出るのがしんどいです。

ということでCircleCIでAWS ECSにRailsをデプロイしてみました。

ゴニョゴニョしながらやったので間違いや漏れの可能性もありますが。。。

事前準備

  • CircleCiに登録
  • GithubとCIrcleCIの連絡(登録時に連携させられる)
  • Dockerのインストール
  • AWSアカウントの作成とAMIの作成(ESC関連の権限が必要かも)
  • 外部にデータベース用意(私の環境ではRDSを利用)
  • AWS ECRの作成

1. ECS, ECR, ALBの設定

以下のブログを参考に設定させていただきました。

kimh.github.io

注意点としてはALBのヘルスチェックで応答コードが200以外は失敗と見なされる?ようなので deviseなどで絶対ログインしている場合はヘルスチェックURLをログインURLなどに変更した方が良いかと思います。

2. Docker周辺の設定

  1. ほぼ、Docker公式サイトからRailsのDockerfileとentrypoint.shをコピペ

    Quickstart: Compose and Rails | Docker Documentation

  2. コピペしたDockerfileとentrypoint.shをRailsのルートディレクトリ(appフォルダやGemfileがあるディレクトリ)に保存

  3. Dockerfileの内容を少し変更

     FROM ruby:2.6
     RUN apt-get update -qq && apt-get install -y nodejs build-essential default-mysql-client
     RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
    
     ENV APP_NAME <任意のアプリケーション名>
     RUN mkdir /${APP_NAME}
     WORKDIR /${APP_NAME}
     COPY Gemfile /${APP_NAME}/Gemfile
     COPY Gemfile.lock /${APP_NAME}/Gemfile.lock
     RUN bundle install
     COPY . /${APP_NAME}
    
     ARG RAILS_MASTER_KEY
     ENV RAILS_MASTER_KEY ${RAILS_MASTER_KEY}
     ARG RAILS_ENV
     ENV RAILS_ENV ${RAILS_ENV}
     RUN rails assets:precompile
    
     COPY entrypoint.sh /usr/bin/
     RUN chmod +x /usr/bin/entrypoint.sh
     ENTRYPOINT ["entrypoint.sh"]
     EXPOSE 3000
    
     CMD ["rails", "server", "-b", "0.0.0.0"]
    

    RAILS_MASTER_KEYやRAILS_ENVは後ほどCircleCIの環境変数で設定

おそらくdocker-compose.yml無くてもCircleCI上でdocker imageのビルドはできるはずです。

おそらく。

3. CircleCIの設定

  1. Railsのルートディレクトリに.circleciフォルダとconfig.ymlを作成
  2. config.ymlに以下を記載

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

    qiita.com

     version: 2.1
     orbs:
       aws-ecr: circleci/aws-ecr@6.6.0
       aws-ecs: circleci/aws-ecs@1.0.4
       aws-cli: circleci/aws-cli@0.1.19
    
     jobs:
       db-create-migrate-on-task-run:
         machine:
           image: ubuntu-1604:201903-01
         steps:
           - checkout
           - aws-cli/setup:
               aws-access-key-id: AWS_ACCESS_KEY_ID
               aws-secret-access-key: AWS_SECRET_ACCESS_KEY
               aws-region: AWS_REGION
           - run:
               name: "db create"
               command: |
                 aws ecs run-task --region $AWS_REGION \
                   --cluster <ECSのクラスタ名> \
                   --task-definition <ECSのタスク定義名> \
                   --overrides '{ "containerOverrides": [ { "name": "<ECSのタスク定義で指定したコンテナ名>", "command": ["rails", "db:create"] } ] }'
           - run:
               name: "db migrate"
               command: |
                 aws ecs run-task --region $AWS_REGION \
                   --cluster <ECSのクラスタ名> \
                   --task-definition <ECSのタスク定義名> \
                   --overrides '{ "containerOverrides": [ { "name": "<ECSのタスク定義で指定したコンテナ名>", "command": ["rails", "db:migrate"] } ] }'
    
     workflows:
       build-and-deploy:
         jobs:
           - aws-ecr/build-and-push-image:
               account-url: AWS_ECR_ACCOUNT_URL
               repo: '<ECRで作成したレポジトリ名>'
               tag: '${CIRCLE_SHA1}'
               extra-build-args: '--build-arg RAILS_MASTER_KEY=${RAILS_MASTER_KEY} --build-arg RAILS_ENV=${RAILS_ENV}'
    
           - db-create-migrate-on-task-run:
               requires:
                 - aws-ecr/build-and-push-image
    
           - aws-ecs/deploy-service-update:
               requires:
                 - db-create-migrate-on-task-run
               family: '<ECSのタスク定義名>'
               cluster-name: '<ECSのクラスタ名>'
               service-name: '<ECSのサービス名>'
               container-image-name-updates: 'container=<ECSのタスク定義で指定したコンテナ名>,tag=${CIRCLE_SHA1}'
    

    CircleCI Orbsに公式からECS, ECRのjobsが出てるのでそれを使う

    db createやdb migrateもついでにやってもらう

    docker imageのビルド時にRAILS_MASTER_KEYをRAILS_ENVを渡す

  3. CircleCIにログインし環境変数を設定

AWS_ACCESS_KEY_ID AWS_ECR_ACCOUNT_URL AWS_REGION AWS_SECRET_ACCESS_KEY RAILS_ENV RAILS_MASTER_KEY
AMIのアクセスキー ECRのURL ~.comなどで終わる リージョン名 AMIのシークレットキー 本番であればproduction master.keyの中身の文字列

f:id:gyabooo:20191225130700p:plain
CircleCI

4. masterへプッシュ

動けばOK

今後

  • テストの追加
  • ステージングの追加
  • ブランチ別でのCI追加
  • Nginxの導入

などなど

難しすぎて必死のパッチです。