Slide 1

Slide 1 text

Spring Bootと Kubernetesで 実現する今どきの DevOps⼊⾨ 佐藤 靖幸 JJUG CCC 2022 Fall 2022/11/27 JJUG CCC 2022 Fall 1

Slide 2

Slide 2 text

⾃⼰紹介 佐藤 靖幸 得意領域 バックエンド開発 クラウドインフラ(AWS) 好きなプログラミング⾔語 Java Go コミュニティ活動 JJUG JAWS 2022/11/27 JJUG CCC 2022 Fall 2 PARTNER NETWORK 2022 APN AWS Top Engineers

Slide 3

Slide 3 text

本セッションについて 本セッションはSpring BootとKubernetesで DevOpsを実現し、本番ワークロードで稼働す るアプリケーションを構築したノウハウについ てご紹介致します。 2022/11/27 JJUG CCC 2022 Fall 3

Slide 4

Slide 4 text

アジェンダ 2022/11/27 JJUG CCC 2022 Fall 4 本セッションについて DevOpsにおけるコミュニケーション Spring BootとKubernetesで実現する今どきのDevOps⼊⾨ 継続的インテグレーション 継続的デプロイ セキュリティ オブザーバビリティ ロギング まとめ

Slide 5

Slide 5 text

DevOpsにおける コミュニケーション 開発と運⽤の垣根を なくすために実践した コミュニケーション⼿法とは 2022/11/27 JJUG CCC 2022 Fall 5

Slide 6

Slide 6 text

⼼理的安全性 ⼼理的安全性とは、 「チームの中で対⼈関係におけるリスクを とっても⼤丈夫、というチームメンバーに 共有される信念」のこと ⽯井遼介. ⼼理的安全性のつくりかた 「⼼理的柔軟性」が困難を乗り越えるチームに変える (Japanese Edition) (p. 22). Kindle Edition. 2022/11/27 JJUG CCC 2022 Fall 6

Slide 7

Slide 7 text

⼼理的安全性のメリット 最も重要な⼼理的安全性の確保のメリットは 「チームの学習」が促進されること、といえま す。 ⽯井遼介. ⼼理的安全性のつくりかた 「⼼理的柔軟性」が困難を乗り越えるチームに変える (Japanese Edition) (p. 29). Kindle Edition. 2022/11/27 JJUG CCC 2022 Fall 7

Slide 8

Slide 8 text

⼼理的安全性を持ったチームは、DevOpsエン ジニアリングにおいても、スムーズな情報連携 によるコミュニケーションが促進され、スト レッチゾーンによる技術⼒の向上が⾒込まれる ことを頑なに信じています。 2022/11/27 JJUG CCC 2022 Fall 8

Slide 9

Slide 9 text

⼼理的安全性 4つの因⼦ 話しやすさ 助け合い 挑戦 新規歓迎 2022/11/27 JJUG CCC 2022 Fall 9

Slide 10

Slide 10 text

コミュニケーションの形成 デイリーのコミュニケーション 雑談する 傾聴する 相談する 挑戦(ストレッチゾーン)を⽀援する 新規参画者を全⼒で⽀援する ⬇ 対⼈関係のリスクを下げることに影響 2022/11/27 JJUG CCC 2022 Fall 10

Slide 11

Slide 11 text

ツールを最⼤限活⽤ 対⾯(オンライン)レビューに Slack Call Slack Hangout Zoom ペアプログラミングに JetBrains Code With Me Visual Studio Code Live Sharing 2022/11/27 JJUG CCC 2022 Fall 11

Slide 12

Slide 12 text

コードレビュー Googleのコードレビューガイドをから、⼼理的 安全性に寄与する4因⼦を取り込む 親切にする 理由を説明する 礼儀正しく敬意を払う すぐにレビューを⾏う(1営業⽇以内) ⬇ チームの学習が促進されることに影響 2022/11/27 JJUG CCC 2022 Fall 12

Slide 13

Slide 13 text

継続的インテグレーション AWSを活⽤したSpring Bootの 継続的インテグレーションの ⼿法をおさらい 2022/11/27 JJUG CCC 2022 Fall 13

Slide 14

Slide 14 text

CIにおけるテスト戦略 E2E テスト 結合テスト 単体テスト • 上に⾏くほどコスト が⾼い • ビジネスロジックの テストをコストが低 い単体テストに集中。 ⾃動テストを⾼速に 回す戦略を採⽤ 2022/11/27 JJUG CCC 2022 Fall 14

Slide 15

Slide 15 text

@SpringBootTest @SpringBootTestはコマンドラインから起動 可能な結合テスト @SpringBootTestはCIにおいてコストが⾼め。 DIで読み込むクラスが増えればテスト実⾏速度 にも影響 依存関係に従って必要なリソースの準備も必要 データベース クラウドリソース など 2022/11/27 JJUG CCC 2022 Fall 15

Slide 16

Slide 16 text

@ExtendWith(MockitoExtension.class) コストが低い単体テストを実⾏する際は、 Spring FrameworkのDIで⾏っている依存性の 注⼊をモック化する。 2022/11/27 JJUG CCC 2022 Fall 16

Slide 17

Slide 17 text

CIパイプラインの選択肢 Maven、Gradleでテストを実⾏出来る 今どきなCIを選択する。 2022/11/27 JJUG CCC 2022 Fall 17 AWS CodePipeline

Slide 18

Slide 18 text

GitHub Actions 構成図 2022/11/27 JJUG CCC 2022 Fall 18

Slide 19

Slide 19 text

AWS CodePipeline 構成図 2022/11/27 JJUG CCC 2022 Fall 19

Slide 20

Slide 20 text

GitHub Actions コード workflow.ymlにCIの順番をコードで定義 2022/11/27 JJUG CCC 2022 Fall 20

Slide 21

Slide 21 text

AWS CodeBuild コード buildspec.ymlにCIの順番をコードで定義 2022/11/27 JJUG CCC 2022 Fall 21

Slide 22

Slide 22 text

継続的デプロイ AWSを活⽤したSpring Bootの 継続的デプロイの ⼿法をおさらい 2022/11/27 JJUG CCC 2022 Fall 22

Slide 23

Slide 23 text

GitFlowの活⽤ GitFlowをベースとし た考え⽅でシンプルに ブランチを運⽤ 特定ブランチへのコ ミットをトリガーにデ プロイパイプラインが 起動 2022/11/27 JJUG CCC 2022 Fall 23

Slide 24

Slide 24 text

特定ブランチの 削除・直接コミットを禁⽌ 開発チーム内でコミットルールを強制 GitHub Protected Branch CodeCommit IAM Policy 2022/11/27 JJUG CCC 2022 Fall 24 IAM Policyによるリポジトリ削除禁⽌の例

Slide 25

Slide 25 text

Kubernetesの特有のデプロイ Spring Bootアプリケーションの最適化項⽬ 環境変数 サービス公開 機微情報 2022/11/27 JJUG CCC 2022 Fall 25

Slide 26

Slide 26 text

Spring Bootの環境変数 Twelve Factor App の思想に基づき、 Spring Bootアプリ ケーションの環境変数 を外出し Kubernetesのマニ フェストファイルとし て管理 2022/11/27 JJUG CCC 2022 Fall 26

Slide 27

Slide 27 text

Spring Bootのサービス公開 Spring Bootの組み込 みTomcatがデフォル トで公開するポート 8080をKubernetes の30000ポートにマッ ピング。AWSのロー ドバランサーのリス ナーに登録して公開 2022/11/27 JJUG CCC 2022 Fall 27

Slide 28

Slide 28 text

Spring Bootの機微情報 DBのパスワードなどの機微情報は暗号化 オープンソースのkubesecやArgoCD Vault Pluginを活⽤ 2022/11/27 JJUG CCC 2022 Fall 28

Slide 29

Slide 29 text

コンテナのビルド・プッシュ 継続的インテグレーションのビルドステップで ⽣成したSpring Bootの起動可能jarファイル をコンテナにビルドし、 Amazon ECRにプッ シュ 2022/11/27 JJUG CCC 2022 Fall 29 Amazon Elastic Container Registry (Amazon ECR)

Slide 30

Slide 30 text

Spring BootのDockerfile ビルドしたJarファイルを利⽤することで 簡潔に記述可能 2022/11/27 JJUG CCC 2022 Fall 30

Slide 31

Slide 31 text

GitHub Actions コード AWSの認証にはOIDC認証の利⽤を推奨 2022/11/27 JJUG CCC 2022 Fall 31

Slide 32

Slide 32 text

AWS CodeBuild コード buildspec.ymlでECRへプッシュ 2022/11/27 JJUG CCC 2022 Fall 32

Slide 33

Slide 33 text

イメージタグの管理 コンテナのイメージタグはlatest運⽤を避ける プッシュ毎にGitのコミットIDを付与 2022/11/27 JJUG CCC 2022 Fall 33

Slide 34

Slide 34 text

GitOps Kustomizeを利⽤してマニフェストを共通化 ArgoCDがKustomizeのKubernetesマニフェス トを常時監視 2022/11/27 JJUG CCC 2022 Fall 34

Slide 35

Slide 35 text

GitHub Actions 構成図 2022/11/27 JJUG CCC 2022 Fall 35

Slide 36

Slide 36 text

AWS CodeBuild 構成図 2022/11/27 JJUG CCC 2022 Fall 36

Slide 37

Slide 37 text

セキュリティ(脆弱性管理) コンテナの脆弱性管理を AWSが提供するマネージド サービスで楽をする 2022/11/27 JJUG CCC 2022 Fall 37

Slide 38

Slide 38 text

脆弱性管理の選択肢の例 オープンソース trivy IaaS Amazon Inspector 2022/11/27 JJUG CCC 2022 Fall 38

Slide 39

Slide 39 text

Amazon Inspector V2 2022/11/27 JJUG CCC 2022 Fall 39

Slide 40

Slide 40 text

オブザーバビリティ (可観測性) 可観測性を⼊⼿できるAWSの マネージドサービスを利⽤して 運⽤を楽にする 2022/11/27 JJUG CCC 2022 Fall 40

Slide 41

Slide 41 text

可観測性を満たすための サービスの選択肢の例 オープンソース Grafana IaaS AWS Container Insights on EKS SaaS Datadog Slack通知が可能なサービスを選択 2022/11/27 JJUG CCC 2022 Fall 41

Slide 42

Slide 42 text

Grafana 2022/11/27 JJUG CCC 2022 Fall 42

Slide 43

Slide 43 text

Container Insights on EKS 2022/11/27 JJUG CCC 2022 Fall 43

Slide 44

Slide 44 text

Spring Boot Actuator httpエンドポイント経由でアプリケーションの 様々な情報を取得可能 Prometheus⽤のメトリクスを取得可能 2022/11/27 JJUG CCC 2022 Fall 44

Slide 45

Slide 45 text

ロギング 便利なロギングコンソールを 活⽤して運⽤を楽にする 2022/11/27 JJUG CCC 2022 Fall 45

Slide 46

Slide 46 text

Kubernetesにおける ログ出⼒サービスの選択肢 IaaS CloudWatch Logs SaaS Datadog Logs Slack通知が可能なサービスを選択 2022/11/27 JJUG CCC 2022 Fall 46

Slide 47

Slide 47 text

CloudWatch Logs 2022/11/27 JJUG CCC 2022 Fall 47

Slide 48

Slide 48 text

CloudWatch Logs Insight ログ検索機能を拡張 2022/11/27 JJUG CCC 2022 Fall 48

Slide 49

Slide 49 text

Datadog Logs 2022/11/27 JJUG CCC 2022 Fall 49

Slide 50

Slide 50 text

Spring Boot Tomcat Log 標準出⼒設定 2022/11/27 JJUG CCC 2022 Fall 50

Slide 51

Slide 51 text

Spring Boot Logback設定 2022/11/27 JJUG CCC 2022 Fall 51 JSON形式で出⼒

Slide 52

Slide 52 text

Spring Boot Logback設定 2022/11/27 JJUG CCC 2022 Fall 52

Slide 53

Slide 53 text

まとめ Spring BootとKubernetesで 実現する今どきのDevOps⼊⾨の まとめ 2022/11/27 JJUG CCC 2022 Fall 53

Slide 54

Slide 54 text

CNでJavaを利⽤するのは容易 クラウドネイティブにおいてより⾼速に起動す るアプリケーションが求められるなか、Go、 Python、Typescriptなどで実装されたアプリ ケーションが台頭し始めたと実感 しかしながら、Spring Bootはクラウドネイ ティブに容易に追従でき、未だに多くの企業様 で利⽤されていると実感 2022/11/27 JJUG CCC 2022 Fall 54

Slide 55

Slide 55 text

当たり前のことを 当たり前に実践する コミュニケーションを促進する⽂化の形成 継続的インテグレーション 継続的デプロイ セキュリティ(脆弱性管理) オブザーバビリティ ロギング 当たり前のことをするために Spring Bootの機能を最⼤限活⽤していく 2022/11/27 JJUG CCC 2022 Fall 55

Slide 56

Slide 56 text

ご清聴ありがとうございました。 2022/11/27 JJUG CCC 2022 Fall 56