Spring BootとKubernetesで実現する今どきのDevOps⼊⾨佐藤 靖幸JJUG CCC 2022 Fall2022/11/27 JJUG CCC 2022 Fall 1
View Slide
⾃⼰紹介佐藤 靖幸得意領域バックエンド開発クラウドインフラ(AWS)好きなプログラミング⾔語Java Goコミュニティ活動JJUG JAWS2022/11/27 JJUG CCC 2022 Fall 2PARTNERNETWORK2022 APN AWS Top Engineers
本セッションについて本セッションはSpring BootとKubernetesでDevOpsを実現し、本番ワークロードで稼働するアプリケーションを構築したノウハウについてご紹介致します。2022/11/27 JJUG CCC 2022 Fall 3
アジェンダ2022/11/27 JJUG CCC 2022 Fall 4本セッションについてDevOpsにおけるコミュニケーションSpring BootとKubernetesで実現する今どきのDevOps⼊⾨継続的インテグレーション継続的デプロイセキュリティオブザーバビリティロギングまとめ
DevOpsにおけるコミュニケーション開発と運⽤の垣根をなくすために実践したコミュニケーション⼿法とは2022/11/27 JJUG CCC 2022 Fall 5
⼼理的安全性⼼理的安全性とは、「チームの中で対⼈関係におけるリスクをとっても⼤丈夫、というチームメンバーに共有される信念」のこと⽯井遼介. ⼼理的安全性のつくりかた 「⼼理的柔軟性」が困難を乗り越えるチームに変える (JapaneseEdition) (p. 22). Kindle Edition.2022/11/27 JJUG CCC 2022 Fall 6
⼼理的安全性のメリット最も重要な⼼理的安全性の確保のメリットは「チームの学習」が促進されること、といえます。⽯井遼介. ⼼理的安全性のつくりかた 「⼼理的柔軟性」が困難を乗り越えるチームに変える (JapaneseEdition) (p. 29). Kindle Edition.2022/11/27 JJUG CCC 2022 Fall 7
⼼理的安全性を持ったチームは、DevOpsエンジニアリングにおいても、スムーズな情報連携によるコミュニケーションが促進され、ストレッチゾーンによる技術⼒の向上が⾒込まれることを頑なに信じています。2022/11/27 JJUG CCC 2022 Fall 8
⼼理的安全性 4つの因⼦話しやすさ助け合い挑戦新規歓迎2022/11/27 JJUG CCC 2022 Fall 9
コミュニケーションの形成デイリーのコミュニケーション雑談する傾聴する相談する挑戦(ストレッチゾーン)を⽀援する新規参画者を全⼒で⽀援する⬇対⼈関係のリスクを下げることに影響2022/11/27 JJUG CCC 2022 Fall 10
ツールを最⼤限活⽤対⾯(オンライン)レビューにSlack CallSlack HangoutZoomペアプログラミングにJetBrains Code With MeVisual Studio Code Live Sharing2022/11/27 JJUG CCC 2022 Fall 11
コードレビューGoogleのコードレビューガイドをから、⼼理的安全性に寄与する4因⼦を取り込む親切にする理由を説明する礼儀正しく敬意を払うすぐにレビューを⾏う(1営業⽇以内)⬇チームの学習が促進されることに影響2022/11/27 JJUG CCC 2022 Fall 12
継続的インテグレーションAWSを活⽤したSpring Bootの継続的インテグレーションの⼿法をおさらい2022/11/27 JJUG CCC 2022 Fall 13
CIにおけるテスト戦略E2Eテスト結合テスト単体テスト• 上に⾏くほどコストが⾼い• ビジネスロジックのテストをコストが低い単体テストに集中。⾃動テストを⾼速に回す戦略を採⽤2022/11/27 JJUG CCC 2022 Fall 14
@SpringBootTest@SpringBootTestはコマンドラインから起動可能な結合テスト@SpringBootTestはCIにおいてコストが⾼め。DIで読み込むクラスが増えればテスト実⾏速度にも影響依存関係に従って必要なリソースの準備も必要データベースクラウドリソース など2022/11/27 JJUG CCC 2022 Fall 15
@ExtendWith(MockitoExtension.class)コストが低い単体テストを実⾏する際は、Spring FrameworkのDIで⾏っている依存性の注⼊をモック化する。2022/11/27 JJUG CCC 2022 Fall 16
CIパイプラインの選択肢Maven、Gradleでテストを実⾏出来る今どきなCIを選択する。2022/11/27 JJUG CCC 2022 Fall 17AWS CodePipeline
GitHub Actions 構成図2022/11/27 JJUG CCC 2022 Fall 18
AWS CodePipeline 構成図2022/11/27 JJUG CCC 2022 Fall 19
GitHub Actions コードworkflow.ymlにCIの順番をコードで定義2022/11/27 JJUG CCC 2022 Fall 20
AWS CodeBuild コードbuildspec.ymlにCIの順番をコードで定義2022/11/27 JJUG CCC 2022 Fall 21
継続的デプロイAWSを活⽤したSpring Bootの継続的デプロイの⼿法をおさらい2022/11/27 JJUG CCC 2022 Fall 22
GitFlowの活⽤GitFlowをベースとした考え⽅でシンプルにブランチを運⽤特定ブランチへのコミットをトリガーにデプロイパイプラインが起動2022/11/27 JJUG CCC 2022 Fall 23
特定ブランチの削除・直接コミットを禁⽌開発チーム内でコミットルールを強制GitHubProtected BranchCodeCommitIAM Policy2022/11/27 JJUG CCC 2022 Fall 24IAM Policyによるリポジトリ削除禁⽌の例
Kubernetesの特有のデプロイSpring Bootアプリケーションの最適化項⽬環境変数サービス公開機微情報2022/11/27 JJUG CCC 2022 Fall 25
Spring Bootの環境変数Twelve Factor Appの思想に基づき、Spring Bootアプリケーションの環境変数を外出しKubernetesのマニフェストファイルとして管理2022/11/27 JJUG CCC 2022 Fall 26
Spring Bootのサービス公開Spring Bootの組み込みTomcatがデフォルトで公開するポート8080をKubernetesの30000ポートにマッピング。AWSのロードバランサーのリスナーに登録して公開2022/11/27 JJUG CCC 2022 Fall 27
Spring Bootの機微情報DBのパスワードなどの機微情報は暗号化オープンソースのkubesecやArgoCD VaultPluginを活⽤2022/11/27 JJUG CCC 2022 Fall 28
コンテナのビルド・プッシュ継続的インテグレーションのビルドステップで⽣成したSpring Bootの起動可能jarファイルをコンテナにビルドし、 Amazon ECRにプッシュ2022/11/27 JJUG CCC 2022 Fall 29Amazon Elastic ContainerRegistry (Amazon ECR)
Spring BootのDockerfileビルドしたJarファイルを利⽤することで簡潔に記述可能2022/11/27 JJUG CCC 2022 Fall 30
GitHub Actions コードAWSの認証にはOIDC認証の利⽤を推奨2022/11/27 JJUG CCC 2022 Fall 31
AWS CodeBuild コードbuildspec.ymlでECRへプッシュ2022/11/27 JJUG CCC 2022 Fall 32
イメージタグの管理コンテナのイメージタグはlatest運⽤を避けるプッシュ毎にGitのコミットIDを付与2022/11/27 JJUG CCC 2022 Fall 33
GitOpsKustomizeを利⽤してマニフェストを共通化ArgoCDがKustomizeのKubernetesマニフェストを常時監視2022/11/27 JJUG CCC 2022 Fall 34
GitHub Actions 構成図2022/11/27 JJUG CCC 2022 Fall 35
AWS CodeBuild 構成図2022/11/27 JJUG CCC 2022 Fall 36
セキュリティ(脆弱性管理)コンテナの脆弱性管理をAWSが提供するマネージドサービスで楽をする2022/11/27 JJUG CCC 2022 Fall 37
脆弱性管理の選択肢の例オープンソースtrivyIaaSAmazon Inspector2022/11/27 JJUG CCC 2022 Fall 38
Amazon Inspector V22022/11/27 JJUG CCC 2022 Fall 39
オブザーバビリティ(可観測性)可観測性を⼊⼿できるAWSのマネージドサービスを利⽤して運⽤を楽にする2022/11/27 JJUG CCC 2022 Fall 40
可観測性を満たすためのサービスの選択肢の例オープンソースGrafanaIaaSAWS Container Insights on EKSSaaSDatadogSlack通知が可能なサービスを選択2022/11/27 JJUG CCC 2022 Fall 41
Grafana2022/11/27 JJUG CCC 2022 Fall 42
Container Insights on EKS2022/11/27 JJUG CCC 2022 Fall 43
Spring Boot Actuatorhttpエンドポイント経由でアプリケーションの様々な情報を取得可能Prometheus⽤のメトリクスを取得可能2022/11/27 JJUG CCC 2022 Fall 44
ロギング便利なロギングコンソールを活⽤して運⽤を楽にする2022/11/27 JJUG CCC 2022 Fall 45
Kubernetesにおけるログ出⼒サービスの選択肢IaaSCloudWatch LogsSaaSDatadog LogsSlack通知が可能なサービスを選択2022/11/27 JJUG CCC 2022 Fall 46
CloudWatch Logs2022/11/27 JJUG CCC 2022 Fall 47
CloudWatch Logs Insightログ検索機能を拡張2022/11/27 JJUG CCC 2022 Fall 48
Datadog Logs2022/11/27 JJUG CCC 2022 Fall 49
Spring Boot Tomcat Log標準出⼒設定2022/11/27 JJUG CCC 2022 Fall 50
Spring Boot Logback設定2022/11/27 JJUG CCC 2022 Fall 51JSON形式で出⼒
Spring Boot Logback設定2022/11/27 JJUG CCC 2022 Fall 52
まとめSpring BootとKubernetesで実現する今どきのDevOps⼊⾨のまとめ2022/11/27 JJUG CCC 2022 Fall 53
CNでJavaを利⽤するのは容易クラウドネイティブにおいてより⾼速に起動するアプリケーションが求められるなか、Go、Python、Typescriptなどで実装されたアプリケーションが台頭し始めたと実感しかしながら、Spring Bootはクラウドネイティブに容易に追従でき、未だに多くの企業様で利⽤されていると実感2022/11/27 JJUG CCC 2022 Fall 54
当たり前のことを当たり前に実践するコミュニケーションを促進する⽂化の形成継続的インテグレーション継続的デプロイセキュリティ(脆弱性管理)オブザーバビリティロギング当たり前のことをするためにSpring Bootの機能を最⼤限活⽤していく2022/11/27 JJUG CCC 2022 Fall 55
ご清聴ありがとうございました。2022/11/27 JJUG CCC 2022 Fall 56