JJUG CCC 2022 Fall の登壇資料です。
発表動画はこちらです。 https://www.youtube.com/watch?v=c-mb_17nIYs
AWS環境におけるSpring BootアプリケーションのCI/CDをCircleCIで構築した話2022/11/27 JJUG CCC 2022 Fall
View Slide
⾃⼰紹介篠原 正太 (Shinohara Shota) @shinops• 株式会社 Red Frasco• バックエンドエンジニア■経歴• 通信系IT (5年) → Red Frasco■その他• 最初2年くらいは Ruby, Python• ここ4年くらいは Java• 最近はCI/CD改善に興味あり2
はじめに• 本セッションでは、AWS × Spring Boot × CircleCI で構築したCI/CD について紹介します• CircleCI に関する話題が中⼼となりますのでご了承ください• Spring Boot とありますが、他の Java アプリケーションにも応⽤可能• 現在、初期開発フェーズなので実際の本番運⽤はこれからになります• こんな⼈におすすめなセッションです• これから Java アプリケーションの CI/CD を構築しようとしている• CircleCI やその他の CI サービスを最近利⽤し始めた3
⽬次システム概要アプリケーション構成の紹介CircleCIで構築したCI/CDまとめ
5システム概要
現在開発しているシステムについて6不動産会社担当者業務⽀援システムデータ連動画像データ他システム CSVデータ画像データデータ連動他システム⼿⼊⼒CSVデータ画像データ■不動産会社向けの業務⽀援システム• Webアプリケーションとデータ連動を実現するバッチ処理で構成連動元システム連動先システム
7アプリケーション構成の紹介
Application ServerWebアプリケーション構成■Spring Boot ( Spring MVC )• EC2 インスタンス上で Spring Boot アプリケーションを実⾏8EC2 instance contentsAuroraApplication LoadBalancerSpring BootEC2 instance contentsSpring Boot
Batch Applicationバッチ構成■Spring Boot + Spring Batch• Step Functions でワークフローを制御して、AWS Batch ( ECS ) 上でバッチを実⾏• 各バッチごとに以下の構成がある9AWS Step Functions workflowAWS BatchEventContainerECSSpring BootSpring BatchAurora
ソース構成■Gitリポジトリ• Gradleのマルチプロジェクトで構成10apps│├── web : Webアプリケーション(web-app.jar)│└── batch│├── batch_A : バッチアプリケーション(batch-A-app.jar)│├── batch_B : バッチアプリケーション(batch-B-app.jar)│└── batch_...
11CircleCIで構築したCI/CD
ステップジョブワークフローCircleCI の特徴• ワークフロー、ジョブ、ステップから構成される• 複数のワークフローやジョブは並列して実⾏可能• ビルド時間を削減しやすい12run-unit-test build deployrun-checkstylerun-spotbugscheckoutgradle build
ブランチ構成とデプロイ戦略■ブランチ構成• feature, stg, main ブランチで構成■デプロイ戦略• feature ブランチ : ユニットテスト、静的解析• stg ブランチ : ステージング環境へのデプロイ• main ブランチ : 本番環境へのデプロイ13feature stg main※前提として、不動産会社担当者が利⽤する業務画⾯のため、メンテナンス化してサービス停⽌を伴うデプロイを想定しています本番環境の CI/CD はまだ未構築
今回構築した CI/CD ワークフロー⼀覧14feature stg■test-feature ■check-update└ ■deploy-web└ ■deploy-batch-A└ ■deploy-batch-B└ ■deploy-database-migration└ ■deploy-testdata-import
#test-feature : CI テストを実⾏15run-unit-testrun-checkstylerun-spotbugsCircleCI コンテナDBUnitテストユニットテストを実行Checkstyleを実行SpotBugsを実行
#test-feature : CI テストを実⾏16■テストが⾼速• ユニットテストと静的解析をそれぞれジョブを分けて、並列実⾏することで現状2分ほどでテストが完了する■苦労した点・⼯夫した点• 最初はオンメモリの H2 データベースを利⽤していたが、MySQL と微妙に異なる点があり CI でのみ DBUnit テストが通らないことがあった• CircleCI 上でセカンダリコンテナとして MySQL イメージを起動することで環境差分を解消
今回構築した CI/CD ワークフロー⼀覧17feature stg■test-feature ■check-update└ ■deploy-web└ ■deploy-batch-A└ ■deploy-batch-B└ ■deploy-database-migration└ ■deploy-testdata-import
18check-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.ymlmapping: |apps/web/.* deploy-web trueapps/batch/batch_A/.* deploy-batch-A true…apps/web 配下のファイルに変更があった場合に「deploy-web」というパラメータが true に設定され、Web アプリケーションのデブロイワークフローが実⾏される※ Orb : 再利⽤可能なコードスニペットOrb レジストリ で公開されているものは誰でも使える
今回構築した CI/CD ワークフロー⼀覧19feature stg■test-feature ■check-update└ ■deploy-web└ ■deploy-batch-A└ ■deploy-batch-B└ ■deploy-database-migration└ ■deploy-testdata-import
#deploy-web : Webアプリケーションのビルド&デプロイ20S3再起動LambdaEC2 instance contentsSpring BootSSMRun CommandアプリケーションサーバRun Command で以下実⾏・Spring Boot 停⽌・S3 から jar をダウンロード・Spring Boot 起動run-test-web build-web deploy-webCIテストを実行 jar のビルドS3へのアップロードSpring Boot再起動Lambda の実行web-app.jar
#deploy-web : Webアプリケーションのビルド&デプロイ21■デプロイも⾼速• 各デプロイワークフローがそれぞれ並列実⾏されるので、現状5分ほどでデプロイが完了する■苦労した点・⼯夫した点• 複雑なデプロイ処理は Lambda ファンクションとして定義• 必要なファイルだけを S3 で連携するような仕組み
今回構築した CI/CD ワークフロー⼀覧22feature stg■test-feature ■check-update└ ■deploy-web└ ■deploy-batch-A└ ■deploy-batch-B└ ■deploy-database-migration└ ■deploy-testdata-import
#deploy-batch : バッチのアプリケーションのビルド&デプロイ23ECRAWS Step Functions workflowAWS BatchEventContainerECSSpring BootSpring BatchAWS CloudFormationURI指定run-test-batch build-batch deploy-batchCIテストを実行 jar のビルドDocker イメージのビルドECR へのデプロイCloudFormation の実⾏・StepFunctions、AWS Batchの更新
今回構築した CI/CD ワークフロー⼀覧24feature stg■test-feature ■check-update└ ■deploy-web└ ■deploy-batch-A└ ■deploy-batch-B└ ■deploy-database-migration└ ■deploy-testdata-import
#deploy-database-migration : DBマイグレーション25S3DBマイグレーションLambdaEC2運用サーバAuroraRun Command で以下実⾏・S3 から tar をダウンロード・解凍・Flyway の Gradle タスク実⾏SSMRun Commandarchive-file migrate-database必要なソースを tar で圧縮S3 にアップロードDB マイグレーション Lambda の実⾏tar
#deploy-database-migration : DBマイグレーション26■苦労した点・⼯夫した点• CircleCI コンテナから直接 Aurora に接続しないようにする• パブリックに DB のポートを公開したくない• そのため、EC2 上に運⽤サーバ⽤のインスタンスを⽴て、そこから Flyway でマイグレーションを実⾏するようにしている• 運⽤サーバから Github へアクセスしないようにする• 必要なソースのみを tar で圧縮して、S3 経由で運⽤サーバに連携している
今回構築した CI/CD ワークフロー⼀覧27feature stg■test-feature ■check-update└ ■deploy-web└ ■deploy-batch-A└ ■deploy-batch-B└ ■deploy-database-migration└ ■deploy-testdata-import
#deploy-testdata-import : テストデータ投⼊28S3テストデータ投入LambdaEC2運用サーバAuroraRun Command で以下実⾏・S3 から tar をダウンロード・解凍・テストデータ投⼊の Gradle タスク実⾏SSMRun Command開発メンバーAWS ManagementConsoleDatabase Rider(≒ DBUnit)ワークフローarchive-file必要なソースを tar で圧縮S3 にアップロードtar
#deploy-testdata-import : テストデータ投⼊29■苦労した点・⼯夫した点• テストデータ投⼊は Database Rider ( ≒ DBUnit ) を利⽤• テスト環境での動作確認に必要なデータを Yaml ファイルで管理• 例)開発メンバーのログインユーザ情報など• 結合テスト・システムテスト⽤のデータも管理できるようにして、同じ状況をすぐに再現できるようにする予定• テストデータ投⼊ Lambda のみ⼿動実⾏としている理由• CLEAN INSERT で登録しているため本番環境では実⾏してはいけないため• 安全を期すため CI/CD ワークフローには組み込んでいない
30まとめ
AWS × Spring Boot × CircleCI での CI/CD の構築• AWS × Spring Boot × CircleCI で構築した CI/CD を紹介しました• CI/CD を構築する上での参考の1つになればと思います• 今回 CircleCI を採⽤することで、開発を効率的に進めることができた• 豊富なOrbs機能• ワークフローやジョブの並列実⾏によるビルド時間の短縮31
END OFPRESENTATIONご清聴ありがとうございました