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

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

Red Frasco
November 28, 2022
210

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. AWS環境におけるSpring Boot
    アプリケーションのCI/CDを
    CircleCIで構築した話
    2022/11/27 JJUG CCC 2022 Fall

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  5. 5
    システム概要

    View Slide

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

    View Slide

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

    View Slide

  8. 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

    View Slide

  9. 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

    View Slide

  10. ソース構成
    ■Gitリポジトリ
    • Gradleのマルチプロジェクトで構成
    10
    apps

    ├── web : Webアプリケーション(web-app.jar)

    └── batch

    ├── batch_A : バッチアプリケーション(batch-A-app.jar)

    ├── batch_B : バッチアプリケーション(batch-B-app.jar)

    └── batch_...

    View Slide

  11. 11
    CircleCIで構築したCI/CD

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. 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 レジストリ で公開されているものは誰でも使える

    View Slide

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

    View Slide

  20. #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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. #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

    View Slide

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

    View Slide

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

    View Slide

  28. #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

    View Slide

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

    View Slide

  30. 30
    まとめ

    View Slide

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

    View Slide

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

    View Slide