kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

circleci + codedeployを使ってec2にリリース (開発,本番環境の切り替え)

CircleCIでAWS Ec2にリリースをしていますが、テスト環境と本番環境が違う場所にあり、それぞれの環境へリリースするためのやり方を調べた結果です。

一応できていますが、あまり良さそうではないので、circleciのconfigについては自分で書いた方がいいと思います。

前回の記事

kazu22002.hatenablog.com

前提

テスト環境と本番環境は別の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にコピーして使いたいようにカスタマイズする方が今回は良い方法かもしれないです。

想定されていないのはしょうがないとしか言えません。

一応リリースできるところまで確認できました。

ドキュメント

circleci.com

circleci.com

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になります。

想定外のことをするのは大変ですね。

まとめ

やりたいことができれば詳細まで知る必要はないと思っていますが、できない時はちゃんとドキュメントを読んで、理解しながらトライ&エラーするしかないですね。

ドキュメントを読むことが重要ですし、ドキュメントが英語だったので読むことぐらいできるようにならないと厳しいと常に感じています。

記事自体も「これで動きそう」で書こうとしましたが、書かなくてよかったです。

動かしてみると意外なところでつまづくこともありますね。

とりあえずちゃんと動く内容で書けたので、個人的には安心しています。ただこのやり方が正しいのかは不明です。