CircleCIでAWS Ec2にリリースをしていますが、テスト環境と本番環境が違う場所にあり、それぞれの環境へリリースするためのやり方を調べた結果です。
一応できていますが、あまり良さそうではないので、circleciのconfigについては自分で書いた方がいいと思います。
前回の記事
前提
テスト環境と本番環境は別のAWSアカウントに作成してあります。
アクセスとしてはIAMユーザーを作成してあるため、AWS CLIでプロファイルを切り替えてコマンドをすることで実現できると思っています。
前回の記事を参考に、環境ごとの切り替えができるか調べた内容のため前回の記事の内容が参考になります。
config
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
- run:
name: Test Command
command: aws deploy list-applications
- 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"
deploy_product:
executor: deploy_container
steps:
- checkout
- composer_install_with_cache
- aws-cli/setup:
aws-access-key-id: AWS_ACCESS_KEY_ID_PROD
aws-secret-access-key: AWS_SECRET_ACCESS_KEY_PROD
profile-name: product
- aws-code-deploy/push-bundle:
application-name: "KintaiWeb"
arguments: '--profile product'
bundle-bucket: "deploy-kintai-service"
bundle-key: "api"
- aws-code-deploy/deploy-bundle:
application-name: "KintaiWeb"
deploy-bundle-arguments: '--profile product'
get-deployment-group-arguments: '--profile product'
bundle-bucket: "deploy-kintai-service"
bundle-key: "api"
deployment-group: "KintaiApi"
test:
executor: deploy_container
steps:
- restore_cache: # ソースコードの復元
key: v1-repo-{{ .Environment.CIRCLE_SHA1 }}
- run: phpunit
workflows:
version: 2
release-workflow:
jobs:
- build:
filters:
branches:
only:
- develop
- master
- deploy_staging:
requires:
- build
filters:
branches:
only:
- develop
- deploy_product:
requires:
- build
filters:
branches:
only: master
CircleCIの管理画面で、環境変数「AWS_ACCESS_KEY_ID_PROD,AWS_SECRET_ACCESS_KEY_PROD,AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY」を設定しています。
bundle-bucketがstagingとproductで違う理由は、ありません。個人的な環境でproductで同じ名称のバケットが作成できず困ったので別名称で作成しました。
productのリリースについて、たぶん書き方は良くないです。
argumentsでAWS CLIのprofileを指定していますが、ドキュメントを確認するとコマンドの最後に配置されているためなんとか動いている感じです。profileを指定してリリースを変えることは想定されていないみたいに見えますね。
一番いい方法はorbでconfigの書き方を学んで、自分のconfigにコピーして使いたいようにカスタマイズする方が今回は良い方法かもしれないです。
想定されていないのはしょうがないとしか言えません。
一応リリースできるところまで確認できました。
ドキュメント
aws-code-deployのドキュメントを見ていると、examplesでoverride_credentialsがありますが、このコマンドを参考にして同じコマンドを書いてみましたが、指定したプロファイルで動作しなかったため、別の方法を模索した感じです。
試した内容
- aws-cli/setupにprofile情報を記述 -> 以降のコマンドはprofileのdefaultで動作したため、失敗
- push-bundleのargumentsにprofileを記述 -> deploy_bundleはprofileのdefaultで動作したため、失敗
- deploy_bundleのdeploy-bundle-argumentsにprofileを記述 -> deploy_bundleのstatus取得でエラーになり、失敗
色々と試して期待した内容にできたconfigになります。
想定外のことをするのは大変ですね。
まとめ
やりたいことができれば詳細まで知る必要はないと思っていますが、できない時はちゃんとドキュメントを読んで、理解しながらトライ&エラーするしかないですね。
ドキュメントを読むことが重要ですし、ドキュメントが英語だったので読むことぐらいできるようにならないと厳しいと常に感じています。
記事自体も「これで動きそう」で書こうとしましたが、書かなくてよかったです。
動かしてみると意外なところでつまづくこともありますね。
とりあえずちゃんと動く内容で書けたので、個人的には安心しています。ただこのやり方が正しいのかは不明です。