AWS LambdaにApexを使ってCircleCIからデプロイする

## やりたい事
リリースブランチにmergeした場合のみ、circleciからAWS lambdaにdeployをします。
その際Deployの状況をSlackに通知も行いたいと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/81734/5daa760b-6b29-5e3d-8f24-7e37ecf9294d.png)



Apexの使い方については以前にこちらの記事を書いているので参考にしてみてください。
[AWS LambdaをApexでDeployします - Qiita](https://qiita.com/Jason/items/bbbf315391785839f2b5)

また、今回はcircleci.ymlをメインに説明したいと思います。

## やる事
+ 1.Slackのwebhook設定
+ 2.circleci管理画面からの設定
+ 3.circleci.ymlの作成

##  1.SlackのWebhook設定
ブラウザからSlackにログインしている状態で以下URLにアクセスします。
[https://slack.com/services/new/incoming-webhook](https://slack.com/services/new/incoming-webhook)

チャンネルを選択し、[着信 Web フック インテグレーションの追加]をクリックします。
ページ遷移し、[Webhook URL]が表示されるのでこれを使用します。

## 2.circleci管理画面からの設定
先ほど取得したSlackのwebhookやAWS access key等の情報をCircleCiで使用したいのでCircleCIの管理画面からこれらの”key:value”を環境変数に持たせてます。

リポジトリの設定から[Environment Variables
]を選択し、[Add Variable]をクリックすると”key:value”が入力でき、
入力すると末尾4文字だけが表示されますがそれより前はマスクしてくれます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/81734/fc6b30bf-3b75-76bd-ecb1-409e4012e5c8.png)

## 3.circleci.ymlの設定
CIでリリースに使用する Apex をインストールとそれをキャッシュさせておく。
キャッシュさせておけばCIの自動時間短縮ができるし、Deployしない場合(testのみ)でもこれをインストールする時間を気にしなくて良い。

また、ブランチを条件判定する事でリリースブランチにマージされた時のみDeployが実行することも可能ですしリリースのSlack通知をしておくと便利です。

```
version: 2

machine:
    timezone:
        Asia/Tokyo
    services:
        - docker

jobs:
    build:
        docker:
            - image: circleci/node:9.4.0

        working_directory: ~/repo

        steps:
            - checkout
            - setup_remote_docker

            - run: echo 'export PATH=/home/circleci/bin:$PATH' >> $BASH_ENV

            - restore_cache:
                key: v1-apex
            - run:
                name: Install Apex
                command: |
                    # apexをインストールする
                    curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sudo sh
                    # /usr/local/binでしようするとcacheさせる際に権限が足りなくてcacheできなかったのでユーザのカレントディレクトリに配置する
                    test -e ./bin || mkdir -m 755 /home/circleci/bin
                    sudo mv /usr/local/bin/apex /home/circleci/bin/apex
                    sudo chmod +x /home/circleci/bin/apex
                    sudo chown circleci:circleci /home/circleci/bin/apex
            - save_cache:
                key: v1-apex
                paths:
                    - /usr/local/bin/apex

            - deploy:
                name: apex lambda deploy
                command: |
                    export PATH=/home/circleci/bin:$PATH
                    if [ "${CIRCLE_BRANCH}" == "release" ]; then
                      curl -X POST --data-urlencode "payload={\"channel\": \"#deploy\", \"username\": \"Deploy GOD\", \"text\": \"${CIRCLE_USERNAME} さんによるDeployを開始します。\", \"icon_emoji\": \":bowtie:\"}" ${SLACK_TOKEN}
                      npm install
                      apex deploy apex_lambda_test \
                        -s "S3_BUCKET= apex_lambda_test.com" \
                        -s "S3_PREFIX=apex_lambda_test" \
                        -s "TABLE_NAME=job_info_lists" || curl -X POST --data-urlencode "payload={\"channel\": \"#deploy\", \"username\": \"Deploy GOD\", \"text\": \"Deployが失敗しました。\", \"icon_emoji\": \":bowtie:\"}" ${SLACK_TOKEN}
                      curl -X POST --data-urlencode "payload={\"channel\": \"#deploy\", \"username\": \"Deploy GOD\", \"text\": \"Deployが完了しました。\", \"icon_emoji\": \":bowtie:\"}" ${SLACK_TOKEN}
                    fi

```