kazu22002の技術覚書

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

circleci + codedeployを使ってec2にリリース

現在の運用しているサーバーはec2で稼働しています。

以前codepipeline + codebuild + codedeployを使用してCDを実現していたのですが、速度面や設定の書き方、料金面で使いづらくなってきたのでcircleciで置き換えてみました。

  • circleci
  • aws ec2
  • codedeploy

circleciのconfig.yml

今回りリースにはcodedepoloyを使用してec2へリリースしようと思います。

「circleci codedeploy」で調べると、「CircleCI Orbs」がヒットします。

circleci.com

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を設定します。

f:id:kazu22002:20210723095735p:plain

codedeployの設定

aws codedeploy自体の作成は書きませんが、codebuildと一緒に使っていた時の設定と同じで使えました。

codedeployを使用する理由はec2のどのインスタンスにリリースを行うのか簡単にやりたいので使用しました。

料金

aws側の料金

  • codedeployはec2へのリリースは無料
  • s3は容量の料金と通信料

circleci.com

CircleCIの料金は個人開発分では、問題ない回数が割り当てられていると思います。Freeで始めてみます。

CircleCI Orbsのcodedeployで詰まった

CircleCI Orbsが便利そうだったので使ってみましたが、「aws-code-deploy/deploy」コマンドはgithubのソースをそのままdeployするため、それまでのビルドした処理等は関係ない状態になっています。

circleci.com

ドキュメントを読んでみるとソースがそのまま載っているので、処理内容を確認することができます。

commandsに書かれた処理を組み合わせてdeployをしているのがわかったため、jobsではなくcommandsを使用すれば自由に書けるかな。と思って書いてみたらいけました。

ドキュメントと中身を読むのは重要です。

まとめ

やってみてCircleCIの使いやすさが目立ちました。

codedeploy等で詰まった経験が役立ったのか、同じようなエラーケースにぶつかった時の解決は早かったと思います。

今回は稼働まで1日ぐらいでできたため、自分の推測と同じぐらいで設定することができました。

CircleCI がわかりやすい設定だったり、リリース前に設定ファイルのvalidがチェックできるコマンドもあり、deploy結果までの時間も早かったため、ありがたかったです。

当分はCircleCIを使っていこうと思います。

以前の関連記事

kazu22002.hatenablog.com

kazu22002.hatenablog.com

kazu22002.hatenablog.com

kazu22002.hatenablog.com