drone CIでECRからimageをpullする


久々の投稿です。
現在は自分の会社で受託開発しながら、個人事業主てして副業しながら、契約社員として働いている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みたいな感じでジョブを実行していく感じになります。

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

今回のdrone CIの使い方

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

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_idaws_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の認証を通せば後は、scriptscommandsでなんでもできます。
但し当たり前ですが、同じプロセス内でしか認証は持続しないので、気をつけてください。

  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