現在の運用しているサーバーは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を使っていこうと思います。