CircleCIを使ってAWS ECSにRailsをデプロイ(ALBとECRも使ってます)
最近、寒くなってきました。
布団から出るのがしんどいです。
ということでCircleCIでAWS ECSにRailsをデプロイしてみました。
ゴニョゴニョしながらやったので間違いや漏れの可能性もありますが。。。
事前準備
- CircleCiに登録
- GithubとCIrcleCIの連絡(登録時に連携させられる)
- Dockerのインストール
- AWSアカウントの作成とAMIの作成(ESC関連の権限が必要かも)
- 外部にデータベース用意(私の環境ではRDSを利用)
- AWS ECRの作成
1. ECS, ECR, ALBの設定
以下のブログを参考に設定させていただきました。
注意点としてはALBのヘルスチェックで応答コードが200以外は失敗と見なされる?ようなので deviseなどで絶対ログインしている場合はヘルスチェックURLをログインURLなどに変更した方が良いかと思います。
2. Docker周辺の設定
ほぼ、Docker公式サイトからRailsのDockerfileとentrypoint.shをコピペ
コピペしたDockerfileとentrypoint.shをRailsのルートディレクトリ(appフォルダやGemfileがあるディレクトリ)に保存
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"]
おそらくdocker-compose.yml無くてもCircleCI上でdocker imageのビルドはできるはずです。
おそらく。
3. CircleCIの設定
- Railsのルートディレクトリに.circleciフォルダとconfig.ymlを作成
config.ymlに以下を記載
以下の記事を参考に設定させていただきました。
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もついでにやってもらう
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の中身の文字列 |
4. masterへプッシュ
動けばOK
今後
- テストの追加
- ステージングの追加
- ブランチ別でのCI追加
- Nginxの導入
などなど
難しすぎて必死のパッチです。