Circle CIとAWSとDockerでデプロイを自動化した話

エンジニアアルバイトの妹尾です。

今回はタイトルの通り、Circle CI + AWS + Dockerの組み合わせで簡単にサービスのデプロイを自動化した話をします。

弊社サービスWorkinGoodではGItHub flowを採用しており、masterへマージした後に自動的にElastic Beanstalkへ新しいバージョンを作るところまで行っています。依存サービスとの関係もありデプロイするタイミングはこちらが手動でAWSのGUI上から行っています。

また、弊社では開発環境構築にDockerを使っていますが、本番環境へのデプロイにも使用しています。

DockerでLaravel開発環境を整える by Takuma Seno | MatchinGoodエンジニアアルバイトブログ
このブログ初投稿となります、MatchinGoodでエンジニアアルバイトをしている妹尾です。 弊社では人材紹介会社様と人材派遣会社様向けのシステムの開発をしており、今年初めごろに派遣会社スタッフ様向けの新サービスである WorkinGood を始めました。 主にPHPを使用して開発していますが、新しいサービスに関してはAWSやDocker、Reactなどトレンドとなっているものに追随して技術を選択しています。 そこで今回は弊社の開発環境構築にDockerを採用した話をしたいと思います。 弊社ではプロダクシ
https://www.wantedly.com/companies/matchingood/post_articles/36964


これを実現するために具体的には以下のものを使っています。

  • GitHub
  • Circle CI
  • AWS Elastic Container Registry
  • AWS Elastic Beanstalk

かなりお手軽にこの仕組みを作ることができるので簡単に手順を示していきたいと思います。

circle.yml

最初にcircle.ymlにどのように書けばいいかです。

machine:
timezone:
Asia/Tokyo

services:
- docker
dependencies:
pre:
- sudo pip install --upgrade awscli

deployment:
production:
branch: master
commands:
- ./deploy.sh $CIRCLE_SHA1

今回の話に関係のあるところだけ書きました。deploymentにbranchをmasterに指定することでmasterブランチのCIが通った時にcommands以下が実行されます。Circle CI内ではGitHubのコミットIDが$CIRCLE_SHA1という変数に入っています。

aws-cliを使用するために$AWS_ACCESS_KEY_IDと$AWS_SECRET_ACCESS_KEYの環境変数を設定する必要がありますが、セキュリティ上の問題からバージョン管理に含めずにCircle CI上のUIから設定します。

deploy.sh

SHA1=$1
DOCKERRUN_FILE=$SHA1-Dockerrun.aws.json
EB_BUCKET= # Elastic Beanstalkのバージョンファイルが入るS3のバケット名

aws ecr get-login | bash

docker build -t {AWS ID}.dkr.ecr.us-east-1.amazonaws.com/{リポジトリ名}:$SHA1 .
docker push {AWS ID}.dkr.ecr.us-east-1.amazonaws.com/{リポジトリ名}:$SHA1

sed "s/<tag>/$SHA1/" < Dockerrun.aws.json > $DOCKERRUN_FILE

aws s3 cp $DOCKERRUN_FILE s3://$EB_BUCKET/$DOCKERRUN_FILE

aws elasticbeanstalk create-application-version\
--application-name application \
--version-label $SHA1 \
--source-bundle S3Bucket=$EB_BUCKET,S3Key=$DOCKERRUN_FILE

Elastic Beanstalkのバージョンはただのjsonファイルで管理されているのであらかじめDockerrun.aws.jsonという名前で以下のファイルを用意しています。

{
"AWSEBDockerrunVersion": "1",
"Image" : {
"Name" : "{AWS ID}.dkr.ecr.us-east-1.amazonaws.com/{リポジトリ名}:<tag>"
},
"Ports" : [{ "ContainerPort": "80" }]
}

やっていることの流れとしては

  • aws-cliでログイン
  • Dockerコンテナをビルド
  • Dockerコンテナをpush
  • バージョンファイルをS3に上げる
  • Elastic Beanstalkに新しいバージョンを作る

という感じです。

ここまで行えばElastic Beanstalkに新しいバージョンが作成されているのがわかると思います。

注意点

Circle CI用に適切な権限を持ったIAMを用意する必要があります。以下の操作ができるようにIAMを作りましょう。

  • S3のバージョンファイルが入るバケットへのアップロード
  • Docker Container Registryへのpush
  • Elastic Beanstalkのバージョンの作成

まとめ

簡単にデプロイの自動化ができそうなのがわかっていただけたと思います。弊社のような小規模のチームでの開発では自動化できるところは自動化を進めて効率を高める必要があります。

このようなモダンな仕組みもすべてアルバイトエンジニアによって構築されています。プログラミング初心者の方はこのような新しい仕組みを学ぶことができ、実力のある人はDevOpsをさらに磨き上げることもできる職場です。

是非一度お話を聞きに来ませんか!?

マッチングッド株式会社's job postings
Anonymous
18118754 1230363203753456 7313041874233910035 n
46c8923d 0ba7 4282 b324 44080ae27720?1545397501
Picture?height=40&width=40
8b7c0642 b272 40eb b5ff daf2888da0a0?1504184836
10407717 841235665951733 1038533762019815644 n
8 Likes
Anonymous
18118754 1230363203753456 7313041874233910035 n
46c8923d 0ba7 4282 b324 44080ae27720?1545397501
Picture?height=40&width=40
8b7c0642 b272 40eb b5ff daf2888da0a0?1504184836
10407717 841235665951733 1038533762019815644 n
8 Likes

Weekly ranking

Show other rankings

Page top icon