こんにちわ、まつしん(@matsushin11)です。
前回の記事ではECS環境を構築してアプリが動かすところまで行いました。
この記事では前回の続きとしてCI実行時にecs-deployを用いてECSにデプロイする仕組みを作ります。
今回が自動デプロイ環境構築の最後の記事となります。
最終的に完成したリポジトリはこちらです。
本記事でやること
CircleCIとecs-deployを利用して自動デプロイ環境を作ります。
これによって、GitHubのPRがマージされてCIでテストが通ったタイミングで自動デプロイするというフローができます。
Circle CIの設定
まずはCircleCIとリポジトリを連携させましょう。
CircleCIにログインしてサイドメニューで「ADD PROJECTS」から今回作成したリポジトリから「Set Up Project」を押下。
次の画面でLanguageで「Go」を選択して「Start Building」で連携完了です。
次にCIからECRやECSを利用できるようにIAM Userを作成して利用できるようにしていきます。
AWSマネジメントコンソールにログインしてIAMのユーザ登録画面へ。
ユーザ名を入力してアクセスの種類はプログラムによるアクセスにチェックして次のステップへ。
アクセス許可の設定では既存のポリシーを直接アタッチを選択して「AmazonEC2ContainerRegistryFullAccess」と「AmazonEC2ContainerServiceFullAccess」の2つを許可する。
そのままユーザの作成を完了させる。
次に作成したIAMユーザ情報をCI側で環境変数として設定しておきましょう。
プロジェクトのSettings の「Environment Variables」を選択して「AWS_ACCOUNT_ID」「AWS_ACCESS_KEY_ID」「AWS_SECRET_ACCESS_KEY」をそれぞれ登録。
登録できたら次にCIが実行時の内容を決めます。今回は以下のようにしてファイルを作成しました。
.circle_ci/config.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
version: 2 jobs: test: machine: image: circleci/classic:edge steps: - checkout - run: name: "run test" command: | go test deploy: working_directory: ~/go/src/github.com/Matsushin/go-ecs-deploy docker: - image: circleci/python:2.7-node-browsers steps: - checkout - setup_remote_docker - run: sudo pip install awscli - run: $(aws ecr get-login --region ap-northeast-1 --no-include-email) - run: name: Build ECR API command: | docker build -f ./Dockerfile -t go-ecs-deploy-app . - run: name: TAG ECR API command: | docker tag go-ecs-deploy-app $AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/go-ecs-deploy-app:latest - run: name: Deploy command: | export AWS_DEFAULT_REGION="ap-northeast-1" bash ./deploy.sh # Workflows workflows: version: 2 test_and_deploy: jobs: - test - deploy: requires: - test filters: branches: only: - master |
ジョブをテストとデプロイの2つに分けて、テストが通ったらデプロイが実行されるという流れです。
デプロイの動きとしてはDockerイメージを作成してタグ付けしています。そして最後に deploy.sh を実行しているのですが、この内容については次に説明していきます。
デプロイの仕組みを構築
いよいよ最後にデプロイの仕組みを作ります。
ecs-deployファイルの設置
ECSにデプロイするためにecs-deployを利用します。
こちらのファイルの内容をコピーして scripts/ecs-deploy ファイルを作成して貼り付けます。
念の為CIから実行できるようにファイルの権限を 755 にしておきます。
1 |
$ chmod 755 scripts/ecs-deploy |
deploy.shファイルの設置
最後にecs-deployを利用するためのシェル実行ファイルを作成します。
deploy.sh
1 2 3 4 5 |
#!/bin/sh eval $(aws ecr get-login --no-include-email --region ap-northeast-1) docker push $AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/go-ecs-deploy-app:latest ./scripts/ecs-deploy --cluster go-ecs-deploy-cluster --service-name go-ecs-deploy-service --image $AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/go-ecs-deploy-app:latest --timeout 600 |
オプションに以下を指定するようにしてecs-deployを実行します。
- —cluster … ECSで登録したクラスタ名
- —service-name … ECSで登録したサービス名
- —image … ECRのリポジトリのURI
以上で、完成です!動作確認していきましょう!!
動作確認
まずはコードを変更したことがわかるように「Deploy succeeded.」と表示されるように変更して master ブランチでコミット・プッシュします。
数分待ってWORKFLOWS画面がSUCCEEDEDとなればデプロイ完了です。
デプロイが完了したことをコマンドを実行して確認します。
以下のように前回の記事で利用したエンドポイントで下記のような表示がされればOK!
1 2 |
$ curl http://ec2-13-230-159-143.ap-northeast-1.compute.amazonaws.com:8080 Deploy succeeded. |
これで自動デプロイが実行されたことが確認できました!!!
まとめ
ここまで長い道のりでした。
自動デプロイを実現するまでにAWSのECS、ECRさらにはDocker、CircleCIの設定方法とインフラに関して多くの知識が必要になります。
しかし、コードを書いて実装するだけでなくチームの開発効率を上げるための仕組み作りができるとプログラマとしての価値が上がるのではないかと思います。また自分で作れなくても構成がどうなっているとか知っているだけでも価値はあると考えています。
なので今回は自分にとってはかなり良い学びとなっています。
コメントを残す