circleci + codedeployを使ってec2にリリース
現在の運用しているサーバーはec2で稼働しています。
以前codepipeline + codebuild + codedeployを使用してCDを実現していたのですが、速度面や設定の書き方、料金面で使いづらくなってきたのでcircleciで置き換えてみました。
- circleci
- aws ec2
- codedeploy
circleciのconfig.yml
今回りリースにはcodedepoloyを使用してec2へリリースしようと思います。
「circleci codedeploy」で調べると、「CircleCI Orbs」がヒットします。
CircleCIの機能単位で使えるショートカットみたいなのが使えるらしいので、使ってみました。
version: 2.1 executors: deploy_container: docker: - image: circleci/php:7.4-fpm working_directory: ~/repo orbs: aws-cli: circleci/aws-cli@2.0.3 aws-code-deploy: circleci/aws-code-deploy@2.0.0 commands: composer_install_with_cache: steps: - restore_cache: keys: - v1-composer-deps-{{ checksum "composer.json" }} - v1-composer-deps- - run: composer install -n --prefer-dist - save_cache: key: v1-composer-deps-{{ checksum "composer.json" }} paths: - ./vendor jobs: build: executor: deploy_container steps: - checkout - run: sudo apt update - composer_install_with_cache - save_cache: # ソースコードをキャッシュ key: v1-repo-{{ .Environment.CIRCLE_SHA1 }} paths: - ~/repo deploy_staging: executor: deploy_container steps: - checkout - composer_install_with_cache - aws-cli/setup - aws-code-deploy/push-bundle: application-name: "KintaiTest" bundle-bucket: "deploy-kintai-api" bundle-key: "api" - aws-code-deploy/deploy-bundle: application-name: "KintaiTest" bundle-bucket: "deploy-kintai-api" bundle-key: "api" deployment-group: "KintaiApi" workflows: version: 2 release-workflow: jobs: - build filters: branches: only: - develop - master - deploy_staging: requires: - build filters: branches: only: - develop
AWS IAMの追加
AWS のIAMユーザーをdeploy用のアカウントで作成します。セキュリティのため、用意するようにしています。
権限としてはS3とcodedeployの権限を付与しました。
circleciの環境変数を追加
「Project -> Project Setting -> Environment Variables 」にてIAMアカウントのKEY_IDとACCESS_KEYとREGIONを設定します。
codedeployの設定
aws codedeploy自体の作成は書きませんが、codebuildと一緒に使っていた時の設定と同じで使えました。
codedeployを使用する理由はec2のどのインスタンスにリリースを行うのか簡単にやりたいので使用しました。
料金
aws側の料金
- codedeployはec2へのリリースは無料
- s3は容量の料金と通信料
CircleCIの料金は個人開発分では、問題ない回数が割り当てられていると思います。Freeで始めてみます。
CircleCI Orbsのcodedeployで詰まった
CircleCI Orbsが便利そうだったので使ってみましたが、「aws-code-deploy/deploy」コマンドはgithubのソースをそのままdeployするため、それまでのビルドした処理等は関係ない状態になっています。
ドキュメントを読んでみるとソースがそのまま載っているので、処理内容を確認することができます。
commandsに書かれた処理を組み合わせてdeployをしているのがわかったため、jobsではなくcommandsを使用すれば自由に書けるかな。と思って書いてみたらいけました。
ドキュメントと中身を読むのは重要です。
まとめ
やってみてCircleCIの使いやすさが目立ちました。
codedeploy等で詰まった経験が役立ったのか、同じようなエラーケースにぶつかった時の解決は早かったと思います。
今回は稼働まで1日ぐらいでできたため、自分の推測と同じぐらいで設定することができました。
CircleCI がわかりやすい設定だったり、リリース前に設定ファイルのvalidがチェックできるコマンドもあり、deploy結果までの時間も早かったため、ありがたかったです。
当分はCircleCIを使っていこうと思います。