Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWS環境におけるSpring BootアプリケーションのCI/CDをCircleCIで構築した話

Red Frasco
November 28, 2022
360

AWS環境におけるSpring BootアプリケーションのCI/CDをCircleCIで構築した話

JJUG CCC 2022 Fall の登壇資料です。

発表動画はこちらです。
https://www.youtube.com/watch?v=c-mb_17nIYs

Red Frasco

November 28, 2022
Tweet

Transcript

  1. ⾃⼰紹介 篠原 正太 (Shinohara Shota) @shinops • 株式会社 Red Frasco

    • バックエンドエンジニア ▪経歴 • 通信系IT (5年) → Red Frasco ▪その他 • 最初2年くらいは Ruby, Python • ここ4年くらいは Java • 最近はCI/CD改善に興味あり 2
  2. はじめに • 本セッションでは、AWS × Spring Boot × CircleCI で構築した CI/CD

    について紹介します • CircleCI に関する話題が中⼼となりますのでご了承ください • Spring Boot とありますが、他の Java アプリケーションにも応⽤可能 • 現在、初期開発フェーズなので実際の本番運⽤はこれからになります • こんな⼈におすすめなセッションです • これから Java アプリケーションの CI/CD を構築しようとしている • CircleCI やその他の CI サービスを最近利⽤し始めた 3
  3. 現在開発しているシステムについて 6 不動産会社 担当者 業務⽀援システム データ 連動 画像データ 他システム CSVデータ

    画像データ データ 連動 他システム ⼿⼊⼒ CSVデータ 画像データ ▪不動産会社向けの業務⽀援システム • Webアプリケーションとデータ連動を実現するバッチ処理で構成 連動元 システム 連動先 システム
  4. Application Server Webアプリケーション構成 ▪Spring Boot ( Spring MVC ) •

    EC2 インスタンス上で Spring Boot アプリケーションを実⾏ 8 EC2 instance contents Aurora Application Load Balancer Spring Boot EC2 instance contents Spring Boot
  5. Batch Application バッチ構成 ▪Spring Boot + Spring Batch • Step

    Functions でワークフローを制御して、AWS Batch ( ECS ) 上でバッチを実⾏ • 各バッチごとに以下の構成がある 9 AWS Step Functions workflow AWS Batch Event Container ECS Spring Boot Spring Batch Aurora
  6. ソース構成 ▪Gitリポジトリ • Gradleのマルチプロジェクトで構成 10 apps │ ├── web :

    Webアプリケーション(web-app.jar) │ └── batch │ ├── batch_A : バッチアプリケーション(batch-A-app.jar) │ ├── batch_B : バッチアプリケーション(batch-B-app.jar) │ └── batch_...
  7. ブランチ構成とデプロイ戦略 ▪ブランチ構成 • feature, stg, main ブランチで構成 ▪デプロイ戦略 • feature

    ブランチ : ユニットテスト、静的解析 • stg ブランチ : ステージング環境へのデプロイ • main ブランチ : 本番環境へのデプロイ 13 feature stg main ※前提として、不動産会社担当者が利⽤する業務画⾯のため、 メンテナンス化してサービス停⽌を伴うデプロイを想定しています 本番環境の CI/CD はまだ未構築
  8. 今回構築した CI/CD ワークフロー⼀覧 14 feature stg ▪test-feature ▪check-update └ ▪deploy-web

    └ ▪deploy-batch-A └ ▪deploy-batch-B └ ▪deploy-database-migration └ ▪deploy-testdata-import
  9. #test-feature : CI テストを実⾏ 15 run-unit-test run-checkstyle run-spotbugs CircleCI コンテナ

    DBUnitテスト ユニットテストを実行 Checkstyleを実行 SpotBugsを実行
  10. #test-feature : CI テストを実⾏ 16 ▪テストが⾼速 • ユニットテストと静的解析をそれぞれジョブを分けて、並列実⾏することで現 状2分ほどでテストが完了する ▪苦労した点・⼯夫した点

    • 最初はオンメモリの H2 データベースを利⽤していたが、MySQL と微妙に異なる 点があり CI でのみ DBUnit テストが通らないことがあった • CircleCI 上でセカンダリコンテナとして MySQL イメージを起動することで環境差分を解消
  11. 今回構築した CI/CD ワークフロー⼀覧 17 feature stg ▪test-feature ▪check-update └ ▪deploy-web

    └ ▪deploy-batch-A └ ▪deploy-batch-B └ ▪deploy-database-migration └ ▪deploy-testdata-import
  12. 18 check-update-files #check-update : ファイル更新をチェックして後続のワークフローの実⾏を制御 circleci/path-filtering という Orb(※) を利⽤して各ワークフローの実⾏を制御 orbs:

    path-filtering: circleci/[email protected] workflows: check-update: jobs: - path-filtering/filter: config-path: .circleci/continue-config.yml mapping: | apps/web/.* deploy-web true apps/batch/batch_A/.* deploy-batch-A true … apps/web 配下のファイルに変更があった場合に「deploy-web」 というパラメータが true に設定され、Web アプリケーションの デブロイワークフローが実⾏される ※ Orb : 再利⽤可能なコードスニペット Orb レジストリ で公開されているものは誰でも使える
  13. 今回構築した CI/CD ワークフロー⼀覧 19 feature stg ▪test-feature ▪check-update └ ▪deploy-web

    └ ▪deploy-batch-A └ ▪deploy-batch-B └ ▪deploy-database-migration └ ▪deploy-testdata-import
  14. #deploy-web : Webアプリケーションのビルド&デプロイ 20 S3 再起動 Lambda EC2 instance contents

    Spring Boot SSM Run Command アプリケーションサーバ Run Command で以下実⾏ ・Spring Boot 停⽌ ・S3 から jar をダウンロード ・Spring Boot 起動 run-test-web build-web deploy-web CIテストを実行 jar のビルド S3へのアップロード Spring Boot再起動Lambda の実行 web-app.jar
  15. 今回構築した CI/CD ワークフロー⼀覧 22 feature stg ▪test-feature ▪check-update └ ▪deploy-web

    └ ▪deploy-batch-A └ ▪deploy-batch-B └ ▪deploy-database-migration └ ▪deploy-testdata-import
  16. #deploy-batch : バッチのアプリケーションのビルド&デプロイ 23 ECR AWS Step Functions workflow AWS

    Batch Event Container ECS Spring Boot Spring Batch AWS CloudFormation URI指定 run-test-batch build-batch deploy-batch CIテストを実行 jar のビルド Docker イメージのビルド ECR へのデプロイ CloudFormation の実⾏ ・StepFunctions、AWS Batchの更新
  17. 今回構築した CI/CD ワークフロー⼀覧 24 feature stg ▪test-feature ▪check-update └ ▪deploy-web

    └ ▪deploy-batch-A └ ▪deploy-batch-B └ ▪deploy-database-migration └ ▪deploy-testdata-import
  18. #deploy-database-migration : DBマイグレーション 25 S3 DBマイグレーション Lambda EC2 運用サーバ Aurora

    Run Command で以下実⾏ ・S3 から tar をダウンロード・解凍 ・Flyway の Gradle タスク実⾏ SSM Run Command archive-file migrate-database 必要なソースを tar で圧縮 S3 にアップロード DB マイグレーション Lambda の実⾏ tar
  19. #deploy-database-migration : DBマイグレーション 26 ▪苦労した点・⼯夫した点 • CircleCI コンテナから直接 Aurora に接続しないようにする

    • パブリックに DB のポートを公開したくない • そのため、EC2 上に運⽤サーバ⽤のインスタンスを⽴て、そこから Flyway でマイグレーション を実⾏するようにしている • 運⽤サーバから Github へアクセスしないようにする • 必要なソースのみを tar で圧縮して、S3 経由で運⽤サーバに連携している
  20. 今回構築した CI/CD ワークフロー⼀覧 27 feature stg ▪test-feature ▪check-update └ ▪deploy-web

    └ ▪deploy-batch-A └ ▪deploy-batch-B └ ▪deploy-database-migration └ ▪deploy-testdata-import
  21. #deploy-testdata-import : テストデータ投⼊ 28 S3 テストデータ投入 Lambda EC2 運用サーバ Aurora

    Run Command で以下実⾏ ・S3 から tar をダウンロード・解凍 ・テストデータ投⼊の Gradle タスク実⾏ SSM Run Command 開発メンバー AWS Management Console Database Rider (≒ DBUnit) ワークフロー archive-file 必要なソースを tar で圧縮 S3 にアップロード tar
  22. #deploy-testdata-import : テストデータ投⼊ 29 ▪苦労した点・⼯夫した点 • テストデータ投⼊は Database Rider (

    ≒ DBUnit ) を利⽤ • テスト環境での動作確認に必要なデータを Yaml ファイルで管理 • 例)開発メンバーのログインユーザ情報など • 結合テスト・システムテスト⽤のデータも管理できるようにして、同じ状況をすぐに再 現できるようにする予定 • テストデータ投⼊ Lambda のみ⼿動実⾏としている理由 • CLEAN INSERT で登録しているため本番環境では実⾏してはいけないため • 安全を期すため CI/CD ワークフローには組み込んでいない
  23. AWS × Spring Boot × CircleCI での CI/CD の構築 •

    AWS × Spring Boot × CircleCI で構築した CI/CD を紹介しました • CI/CD を構築する上での参考の1つになればと思います • 今回 CircleCI を採⽤することで、開発を効率的に進めることがで きた • 豊富なOrbs機能 • ワークフローやジョブの並列実⾏によるビルド時間の短縮 31