CircleCI2.0経由でRailsアプリをBeanstalkにデプロイする方法

Elastic Beanstalk便利ですよね、初めて使ったときは感動した。
ただ、`eb deploy` これがイケてない...!

デプロイの方法がイケてない気がしてずっとモヤモヤしていたため、CircleCI2.0経由でデプロイする方法を検討しました。

唯一、CircleCIは1.0の情報が多くて、2.0の情報と混同してしまって少し手こずりました。
改めて下記、情報を参考にさせていただきながらまとめました。


* [「まだ間に合う！CircleCI 2.0へ移行する」](https://qiita.com/hitsuji-haneta/items/821c91619b3ddb9981d8)
    * CircleCI 1.0 ➞ 2.0の変更点を解説してくれています。
* [CircleCI 2.0 Beanstalk Deployment example](https://kevingoedecke.me/2018/03/12/circleci-2-0-beanstalk-example-tutorial/)
    * 英語ですが、同じ課題に対してのソリューションを解説してくれています。


## 前提

* Ruby：2.5.3
* Rails：5.1.5

※ ElasticBeanstalkへデプロイ済みの状況を想定しているため、ElasticBeanstalkなどの環境構築関連は割愛します。

## 目次
1. AWS IAM にてCircleCIからBeanstalkを操作する用のユーザーを作成
2. GitHub / BitBucketをCircleCIに接続
3. 1で作成したIAMユーザー情報をCircleCI内で設定
4. デプロイ

## 1. AWS IAM にてCircleCIからBeanstalkを操作する用のユーザーを作成

まずデプロイ操作用のIAMを作成します。
「IAM」➞ 「ユーザー」➞ 「ユーザーを追加」で作成画面へ。

「アクセスの種類」はプログラムによるアクセスを選択。ユーザー名は認識しやすいものを適当につけます。

<img width="1439" alt="スクリーンショット 2019-04-19 0.54.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93211/a396c850-b3f4-8ba9-3979-421feb6319d7.png">

アクセス許可では、「AWSElasticBeanstalkFullAccess」をアタッチし、ユーザー作成。

<img width="1439" alt="スクリーンショット 2019-04-19 0.56.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93211/7c3a90de-0f7b-c6c7-9104-14062ca175e9.png">

ユーザー作成後にできるcredentialsは後ほどCircleCI上で設定するため、保管しておきましょう。

## 2. GitHub / BitBucketをCircleCIに接続

CicleCIへ行き、Github or Bitbucketアカウントで、サインアップします。
Add Projectをするとステップが表示されるので基本的にその通りにやればうまくワークしますが、configファイルの中身だけ設定をいじる必要があります。

下記のように書きましたが、さくっと解説します。
各タスクの概念は下記記事を参照してください。

[「[Qiita]まだ間に合う！CircleCI 2.0へ移行する」](https://qiita.com/hitsuji-haneta/items/821c91619b3ddb9981d8)

```.circleci/config.yml
version: 2
jobs:
  deploy:
    docker:
      - image: circleci/python:2.7
    working_directory: ~/repo
    steps:
      - checkout
      - run:
          name: Install awscli
          command: |
            sudo pip install awsebcli --upgrade
      - run:
          name: Create AWS credentials manually
          command: |
            mkdir ~/.aws
            touch ~/.aws/config
            chmod 600 ~/.aws/config
            echo "[profile eb-cli]" > ~/.aws/config
            echo "aws_access_key_id=$AWS_ACCESS_KEY_ID" >> ~/.aws/config
            echo "aws_secret_access_key=$AWS_SECRET_ACCESS_KEY" >> ~/.aws/config
      - run:
          name: Deploy to EB if branch is Master
          command: |
            eb use [your app name] --profile eb-cli
            eb deploy -v --staged --profile eb-cli

workflows:
  version: 2
  build-deploy:
    jobs:
      - deploy:
          filters:
            branches:
              only:
                - master
                - develop

```

### dockerをベースに構築。pipで awscliをinstall

```
jobs:
  deploy:
    docker:
      - image: circleci/python:2.7
    working_directory: ~/repo
    steps:
      - checkout
      - run:
          name: Install awscli
          command: |
            sudo pip install awsebcli --upgrade

```

docker imageを使って、pythonをインストールしていきます。
`run`のところでコマンドが走っています。



### AWS credentialsを設定

```
- run:
  name: Create AWS credentials manually
  command: |
  mkdir ~/.aws
  touch ~/.aws/config
  chmod 600 ~/.aws/config
  echo "[profile eb-cli]" > ~/.aws/config
  echo "aws_access_key_id=$AWS_ACCESS_KEY_ID" >> ~/.aws/config
  echo "aws_secret_access_key=$AWS_SECRET_ACCESS_KEY" >> ~/.aws/config
```

現在作っているこの環境に先程作成したCredentialsを適用するコマンドを書いていきます。

### デプロイコマンドの設定

```
- run:
  name: Deploy to EB if branch is Master
  command: |
  eb use [your app name] --profile eb-cli
  eb deploy -v --staged --profile eb-cli
```

ここでは、デプロイコマンドを記述しています。
`[your app name]`は各々のElastic Beanstalkの環境でセッティングしたapplication nameを適用してください。

### デプロイworkflowの設定
``` 
workflows:
  version: 2
  build-deploy:
    jobs:
      - deploy:
          filters:
            branches:
              only:
                - master
```



workflow以下は、定義したジョブの発動条件を明記しています。
各々の開発フローに合わせてbranchを設定してください。
ここでは、masterにマージされた時に発動するよう記述しています。

### リポジトリへpush

これで設定ファイルはおしまいです。忘れずに連携したリポジトリにpushしてください。

## 3. 1で作成したIAMユーザー情報をCircleCI内で設定

CicleCIへ行き、「project」➞ 「作成したproject」➞ 「右上にある歯車設定ボタン」でプロジェクトの設定画面に移ります。

「BUILD SETTINGS」内の「Environment Variables」➞ 「Add valuable」で、
・AWS_ACCESS_KEY_ID
・AWS_SECRET_ACCESS_KEY
を追加します。
値は1でIAMを作成した際にできたcredentialsの内容です。



## 4. デプロイ

いよいよデプロイです。指定したbranchにmergeされたら自動にデプロイが走ります。
ここでエラーが出たら beanstalkとCicleCIの連携ができてないことがほとんどです。


``` 
ERROR: This directory has not been set up with the EB CLI
You must first run "eb init".
```

自分も**eb initしてね〜**というエラーに遭遇しました。
これはローカルで `eb init`した際に作られた `.elasticbeanstalk/config.yml`が **git ignore**されていたことが原因です。

これを修正して、再度pushしたらうまくいきました。


自動デプロイは気持ちいいですね、これにtestを加えたり、buildを加えたりしたらまた追記していこうと思います。終わり。