drone CIでECRからimageをpullする

久々の投稿です。
現在は自分の会社で受託開発しながら、個人事業主てして副業しながら、契約社員として働いている[revenue-hack](https://github.com/revenue-hack)です。
https://www.praha-inc.com/
こんな会社やってます。

さて、今回はdrone CIでECRからpullして、そのまま`docker run`して、コンテナ立てる方法についてお話します。


## 対象ユーザ
- drone CIを使っている人
- コンテナ系のCIに興味がある人
- AWSとdrone CIを使っている人

## drone CIについて
drone CIについては色々な記事があるのでここでは詳細に述べませんが、dockerコンテナ内でジョブを実行していくCIになります。
なので、drone CI自体がdockerで立てるようになっているので、docker in dockerみたいな感じでジョブを実行していく感じになります。

- https://engineering.linecorp.com/ja/blog/go-oss-ci-tool-drone-replaces-jenkins/

とかが参考になるかと思います。
また2019-03-11現在、`v1.0.0-rc.6`なので、もう少しで`ga`になるかな〜
- https://github.com/drone/drone

## 今回のdrone CIの使い方

今回はdrone CIでの使い方として以下のシンプルなアーキでやってみました。

![スクリーンショット 2019-03-12 10.49.17.png](https://qiita-image-store.s3.amazonaws.com/0/74872/0e0849a7-48c1-f3e8-819e-20ec16c5bf8f.png)


## drone CIでimage build&push

まずdocker CIでimage buildする方法です。
以下が`.drone.yml`(buildしているジョブだけです)。

```
develop-build:
    group: build
    image: plugins/ecr
    region: ap-northeast-1
    registry: registry uri
    environment:
      - AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    secrets: [ AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY ]
    dockerfile: ./Dockerfile
    tags: ${DRONE_COMMIT:0:8}
    when:
      branch: develop
      event: push
```


imageは公式のpluginで`plugins/ecr`というのがあるので、それを使います。
jobのkeyとして`region`,`registry`,`repo`をそれぞれ指定します。

| key | value | 説明 |
|:-----------|------------:|:------------:|
| group | build | 同じvalueでグルーピングしておくと、並列処理してくれる |
| region | ap-northeast-1(東京) | ECRのリージョン |
| registry | registry uri | ECRのregistry uri |
| environment | 環境変数 | ECRにログインするために必要なIAMのログイン情報(acccess_key, secret_key) |
| dockerfile | ./Dockerfile | Dockerfileの場所 |
| tag | ${DRONE_COMMIT:0:8} | docker tag.${DRONE_COMMIT:0:8}でcommit hashの前8桁が使える |
| when | いつ実行するか | 今回の場合だと、developブランチにpushされたときこのjobが実行される |

あとはsecretsに`aws_access_key_id`と`aws_secret_access_key`を登録しておきましょう。
https://docs.drone.io/user-guide/pipeline/secrets/

このjobを実行すると、Registry URIにimageがpushされます。

## drone CIでimage pull
今回の掲題でもある内容です。
pushしたのはいいもののどうやってpullすればよいのかというのに悩みました。
結果、イメージを作っちゃいました。
- https://hub.docker.com/r/revenuehack/drone-ecr-auth
- https://github.com/revenue-hack/drone-ecr-auth


これを使ってECRの認証を通せば後は、`scripts`や`commands`でなんでもできます。
但し当たり前ですが、同じプロセス内でしか認証は持続しないので、気をつけてください。

```
  develop-deploy:
    group: deploy
    image: revenuehack/drone-ecr-auth
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      - AWS_REGION=ap-northeaxt-1
    secrets: [ AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY ]
    commands:
      - $(aws ecr get-login --region ap-northeast-1 --no-include-email)
      - docker pull registry_url:${DRONE_COMMIT:0:8}
      - docker run -d -p 8181:80 --net net-network_default --name=web_development registry_url:${DRONE_COMMIT:0:8}
    when:
      branch: develop
      event: push
```


imageに先程の`revenuehack/drone-ecr-auth`を指定します。
あとは環境変数をしているのを忘れずにやります。
そして最後に`commands`で`$(aws ecr get-login --region ap-northeast-1 --no-include-email)`をすることで
認証が通るので、そこからはpullするなりrunするなり好きなようにできます。


以上、drone CIでECRからpullしてくる方法でした。


## Reference
- https://github.com/drone/drone
- https://engineering.linecorp.com/ja/blog/go-oss-ci-tool-drone-replaces-jenkins/
- https://hub.docker.com/r/revenuehack/drone-ecr-auth
- https://github.com/revenue-hack/drone-ecr-auth