Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

⾃⼰紹介 篠原 正太 (Shinohara Shota) @shinops • 株式会社 Red Frasco • バックエンドエンジニア ■経歴 • 通信系IT (5年) → Red Frasco ■その他 • 最初2年くらいは Ruby, Python • ここ4年くらいは Java • 最近はCI/CD改善に興味あり 2

Slide 3

Slide 3 text

はじめに • 本セッションでは、AWS × Spring Boot × CircleCI で構築した CI/CD について紹介します • CircleCI に関する話題が中⼼となりますのでご了承ください • Spring Boot とありますが、他の Java アプリケーションにも応⽤可能 • 現在、初期開発フェーズなので実際の本番運⽤はこれからになります • こんな⼈におすすめなセッションです • これから Java アプリケーションの CI/CD を構築しようとしている • CircleCI やその他の CI サービスを最近利⽤し始めた 3

Slide 4

Slide 4 text

⽬次 システム概要 アプリケーション構成の紹介 CircleCIで構築したCI/CD まとめ

Slide 5

Slide 5 text

5 システム概要

Slide 6

Slide 6 text

現在開発しているシステムについて 6 不動産会社 担当者 業務⽀援システム データ 連動 画像データ 他システム CSVデータ 画像データ データ 連動 他システム ⼿⼊⼒ CSVデータ 画像データ ■不動産会社向けの業務⽀援システム • Webアプリケーションとデータ連動を実現するバッチ処理で構成 連動元 システム 連動先 システム

Slide 7

Slide 7 text

7 アプリケーション構成の紹介

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

ソース構成 ■Gitリポジトリ • Gradleのマルチプロジェクトで構成 10 apps │ ├── web : Webアプリケーション(web-app.jar) │ └── batch │ ├── batch_A : バッチアプリケーション(batch-A-app.jar) │ ├── batch_B : バッチアプリケーション(batch-B-app.jar) │ └── batch_...

Slide 11

Slide 11 text

11 CircleCIで構築したCI/CD

Slide 12

Slide 12 text

ステップ ジョブ ワークフロー CircleCI の特徴 • ワークフロー、ジョブ、ステップから構成される • 複数のワークフローやジョブは並列して実⾏可能 • ビルド時間を削減しやすい 12 run-unit-test build deploy run-checkstyle run-spotbugs checkout gradle build

Slide 13

Slide 13 text

ブランチ構成とデプロイ戦略 ■ブランチ構成 • feature, stg, main ブランチで構成 ■デプロイ戦略 • feature ブランチ : ユニットテスト、静的解析 • stg ブランチ : ステージング環境へのデプロイ • main ブランチ : 本番環境へのデプロイ 13 feature stg main ※前提として、不動産会社担当者が利⽤する業務画⾯のため、 メンテナンス化してサービス停⽌を伴うデプロイを想定しています 本番環境の CI/CD はまだ未構築

Slide 14

Slide 14 text

今回構築した CI/CD ワークフロー⼀覧 14 feature stg ■test-feature ■check-update └ ■deploy-web └ ■deploy-batch-A └ ■deploy-batch-B └ ■deploy-database-migration └ ■deploy-testdata-import

Slide 15

Slide 15 text

#test-feature : CI テストを実⾏ 15 run-unit-test run-checkstyle run-spotbugs CircleCI コンテナ DBUnitテスト ユニットテストを実行 Checkstyleを実行 SpotBugsを実行

Slide 16

Slide 16 text

#test-feature : CI テストを実⾏ 16 ■テストが⾼速 • ユニットテストと静的解析をそれぞれジョブを分けて、並列実⾏することで現 状2分ほどでテストが完了する ■苦労した点・⼯夫した点 • 最初はオンメモリの H2 データベースを利⽤していたが、MySQL と微妙に異なる 点があり CI でのみ DBUnit テストが通らないことがあった • CircleCI 上でセカンダリコンテナとして MySQL イメージを起動することで環境差分を解消

Slide 17

Slide 17 text

今回構築した CI/CD ワークフロー⼀覧 17 feature stg ■test-feature ■check-update └ ■deploy-web └ ■deploy-batch-A └ ■deploy-batch-B └ ■deploy-database-migration └ ■deploy-testdata-import

Slide 18

Slide 18 text

18 check-update-files #check-update : ファイル更新をチェックして後続のワークフローの実⾏を制御 circleci/path-filtering という Orb(※) を利⽤して各ワークフローの実⾏を制御 orbs: path-filtering: circleci/path-filtering@0.1.3 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 レジストリ で公開されているものは誰でも使える

Slide 19

Slide 19 text

今回構築した CI/CD ワークフロー⼀覧 19 feature stg ■test-feature ■check-update └ ■deploy-web └ ■deploy-batch-A └ ■deploy-batch-B └ ■deploy-database-migration └ ■deploy-testdata-import

Slide 20

Slide 20 text

#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

Slide 21

Slide 21 text

#deploy-web : Webアプリケーションのビルド&デプロイ 21 ■デプロイも⾼速 • 各デプロイワークフローがそれぞれ並列実⾏されるので、現状5分ほどでデプロ イが完了する ■苦労した点・⼯夫した点 • 複雑なデプロイ処理は Lambda ファンクションとして定義 • 必要なファイルだけを S3 で連携するような仕組み

Slide 22

Slide 22 text

今回構築した CI/CD ワークフロー⼀覧 22 feature stg ■test-feature ■check-update └ ■deploy-web └ ■deploy-batch-A └ ■deploy-batch-B └ ■deploy-database-migration └ ■deploy-testdata-import

Slide 23

Slide 23 text

#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の更新

Slide 24

Slide 24 text

今回構築した CI/CD ワークフロー⼀覧 24 feature stg ■test-feature ■check-update └ ■deploy-web └ ■deploy-batch-A └ ■deploy-batch-B └ ■deploy-database-migration └ ■deploy-testdata-import

Slide 25

Slide 25 text

#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

Slide 26

Slide 26 text

#deploy-database-migration : DBマイグレーション 26 ■苦労した点・⼯夫した点 • CircleCI コンテナから直接 Aurora に接続しないようにする • パブリックに DB のポートを公開したくない • そのため、EC2 上に運⽤サーバ⽤のインスタンスを⽴て、そこから Flyway でマイグレーション を実⾏するようにしている • 運⽤サーバから Github へアクセスしないようにする • 必要なソースのみを tar で圧縮して、S3 経由で運⽤サーバに連携している

Slide 27

Slide 27 text

今回構築した CI/CD ワークフロー⼀覧 27 feature stg ■test-feature ■check-update └ ■deploy-web └ ■deploy-batch-A └ ■deploy-batch-B └ ■deploy-database-migration └ ■deploy-testdata-import

Slide 28

Slide 28 text

#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

Slide 29

Slide 29 text

#deploy-testdata-import : テストデータ投⼊ 29 ■苦労した点・⼯夫した点 • テストデータ投⼊は Database Rider ( ≒ DBUnit ) を利⽤ • テスト環境での動作確認に必要なデータを Yaml ファイルで管理 • 例)開発メンバーのログインユーザ情報など • 結合テスト・システムテスト⽤のデータも管理できるようにして、同じ状況をすぐに再 現できるようにする予定 • テストデータ投⼊ Lambda のみ⼿動実⾏としている理由 • CLEAN INSERT で登録しているため本番環境では実⾏してはいけないため • 安全を期すため CI/CD ワークフローには組み込んでいない

Slide 30

Slide 30 text

30 まとめ

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

END OF PRESENTATION ご清聴ありがとうございました