ECS FargateでRails動かそうとして2ヶ月かかって手元に残ったもの【2.Build編】

弊社の基幹システムをVPSからAWSに移行するにあたって、まずはrailsを動かしてみる、という段階で無事に死にました☆
今後のための備忘録です。

前記事: [ECS FargateでRails動かそうとして2ヶ月かかって手元に残ったもの【1.docker編】](https://qiita.com/ShoutaWATANABE/items/20523e3e07a6ffb46ad7)

# 前回まででやったこと
![バックエンド構成 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131949/72bef02a-3055-918b-6674-1304e956eadc.png)

# 今回やったこと

githubへのリポジトリの作成は割愛します。
今回はgithubのmasterブランチに変更をpushしたときに本番環境のコンテナイメージが自動更新されるところまでやってみます。


## [ECR](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/what-is-ecr.html)

![スクリーンショット 2019-08-22 15.44.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131949/5710ce4c-7edf-f478-1afd-691900857f7d.png)

今回はリポジトリを2つ作ります。
![スクリーンショット 2019-08-22 15.52.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131949/b05b9ea9-c9b9-899a-a32f-a10bec55beeb.png)

## [CodeBuild](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/welcome.html)
![FireShot Capture 015 - CodeBuild - AWS Developer Tools - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131949/845c8ce2-1fc1-6f8f-80ca-4ca363d42cfa.png)


途中、環境変数を設定する部分があります。
そこには以下のように設定します。
![スクリーンショット 2019-08-22 16.57.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131949/b3b2354e-2981-186b-43ba-3398add31bae.png)

以下からサービスロールを設定します。
![スクリーンショット 2019-08-29 11.42.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131949/abd3b7d3-dc5f-9d02-aa7d-dd005bd29140.png)


ここまでの状態だと、このようになっているはずです。
![スクリーンショット 2019-08-29 11.56.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131949/ffe41622-753e-e98c-42bf-13bc8ab5b4ce.png)

「ポリシーをアタッチします」を押して、新しいポリシーを追加します。
![スクリーンショット 2019-08-29 11.56.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131949/ebc211ef-8950-0563-f742-3d98643c765e.png)

![スクリーンショット 2019-08-29 11.57.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131949/17b58e8a-c452-0135-dd1e-04e60cad83f4.png)

jsonは以下をコピペします。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:PutImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload"
            ],
            "Resource": "*"
        }
    ]
}
```

## [CodePipeline](https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/welcome.html)
![スクリーンショット 2019-08-22 16.04.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131949/7022b930-8f0b-74ff-9a20-5e4a968ce5d4.png)

![スクリーンショット 2019-08-22 16.05.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131949/219c9989-ab0b-29fa-4b9a-076294154a87.png)
ここではCodeBuildで設定したリポジトリと同じリポジトリを設定します。

![スクリーンショット 2019-08-22 16.07.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131949/86ccde52-a76e-1394-b5b4-91c291d986fc.png)

そして、先程作ったCodeBuildのプロジェクト名を設定します。

CodeBuild側の設定は以上ですが、CodeBuildでコンテナをビルドするためには`buildspec.yml`というファイルが必要になります。

```
プロジェクトルート
  ├ docker
  │  ├ mysql
  │  │  ├ volumes
  │  │  │  └ developmentのmysqlの永続化用
  │  │  ├ charset.cnf
  │  │  ├ password.yml
  │  │  └ Dockerfile
  │  ├ nginx
  │  │  ├ development
  │  │  │  ├ default.conf
  │  │  │  └ Dockerfile
  │  │  ├ production
  │  │  │  ├ default.conf
  │  │  │  └ Dockerfile
  │  │  └ nginx.conf
  │  └ rails
  │     └ Dockerfile
  ├ src
  │  └ railsアプリのソース
  ├ .gitignore
  ├ buildspec.yml ←コイツ
  ├ docker-compose.common.yml
  ├ docker-compose.development.yml
  ├ docker-compose.production.yml
  └ README.md
```
このファイル構成でここまで説明をしていない唯一のファイルです。
ビルドコマンドや、railsコマンド等はこのファイルに書きます。

```yaml:buildspec.yml
version: 0.2

phases:
  install:
    runtime-versions:
      nodejs: 10
      ruby: 2.6
  pre_build:
    commands:
      - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
  build:
    commands:
      - docker-compose -f docker-compose.production.yml build
      - docker-compose -f docker-compose.production.yml run --rm web rake db:migrate RAILS_ENV=production
      - docker-compose -f docker-compose.production.yml run --rm web rake assets:precompile RAILS_ENV=production
      - docker tag $WEB_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$WEB_REPO_NAME:$IMAGE_TAG
      - docker tag $SERVER_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$SERVER_REPO_NAME:$IMAGE_TAG
  post_build:
    commands:
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$WEB_REPO_NAME:$IMAGE_TAG
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$SERVER_REPO_NAME:$IMAGE_TAG
```
先程の環境変数はここで読み込まれます。

さて、これで準備ができました。
コードを更新して、githubにpushしてみましょう。

![スクリーンショット 2019-08-22 18.02.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131949/0bc1b6bb-8ff8-477d-bf9a-cbaf98cd1477.png)
CodePipeline上で更新が始まったことが確認できます。
更新には5分程かかります。
この時間の短縮も、今後の課題の一つです。

![スクリーンショット 2019-08-22 18.08.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131949/6f417973-195d-c1ba-9100-17c28f861ea5.png)
CodeBuild上でもリアルタイムで状況が把握できます。
COMPLETEまでフェーズが進めば、今回の目的は達成です。

# ここまでできたこと
![バックエンド構成 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131949/e9b8a04d-c596-5f34-16fc-0e8ec8d5a39a.png)

次記事:[ECS FargateでRails動かそうとして2ヶ月かかって手元に残ったもの【3.Fargate編】](https://qiita.com/ShoutaWATANABE/items/401efdc09191b2f20990)