翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
CI/CD パイプラインを使用して Amazon EKS へ Java アプリケーションを自動的にビルドし、デプロイする
作成者: MAHESH RAGHUNANDANAN (AWS)、James Radtke (AWS)、Jomcy Pappachen (AWS)
コードリポジトリ: aws-cicd-java-eks | 環境:本稼働 | テクノロジー: コンテナとマイクロサービス CloudNative;; DevOps; モダナイゼーション |
ワークロード:その他すべてのワークロード | AWS サービス: AWS CloudFormation、AWS CodeCommit、AWS CodePipeline、Amazon EC2 Container RegistryAmazon EKS |
[概要]
このパターンでは、推奨される DevSecOps プラクティスを使用して Java アプリケーションを自動的に構築し、Amazon Web Services (AWS) クラウド上の Amazon Elastic Kubernetes Service (Amazon EKS) クラスターにデプロイする継続的インテグレーションと継続的デリバリー (CI/CD) パイプラインを作成する方法について説明します。このパターンでは、Spring Boot Java フレームワークで開発され、Apache Maven を使用するグリーティングアプリケーションを使用しています。
このパターンのアプローチを使用して Java アプリケーションのコードをビルドし、アプリケーションのアーティファクトを Docker イメージとしてパッケージ化し、イメージをセキュリティスキャンし、そのイメージをワークロードコンテナとして Amazon EKS にアップロードできます。このパターンのアプローチは、緊密に結合されたモノリシックアーキテクチャからマイクロサービスアーキテクチャに移行する場合に便利です。このアプローチは、Java アプリケーションのライフサイクル全体を監視および管理する上でも役立ち、より高いレベルの自動化が可能になり、エラーまたはバグを回避できます。
前提条件と制限
前提条件
アクティブな AWS アカウント。
AWS コマンドラインインターフェイス (AWS CLI) バージョン 2 (インストールおよび設定済み)。詳細については、AWS CLI ドキュメントの「AWS CLI バージョン 2 のインストール、更新、およびアンインストール」を参照してください。
AWS CLI バージョン 2 は、Amazon EKS クラスターを作成するのと同じ IAM ロールで設定する必要があります。これは、そのロールのみが
aws-auth
ConfigMap
に他の IAM ロールを追加する権限があるためです。AWS CLI の設定に関する情報と手順については、AWS CLI ドキュメントの「設定の基本」を参照してください。AWS Identity and Access Management (IAM) ロールと AWS へのフルアクセス許可 CloudFormation。詳細については、AWS CloudFormation ドキュメントの「IAM によるアクセスの制御」を参照してください。
EKS クラスター内のワーカーノードの IAM ロール名と IAM ロールの Amazon リソースネーム (ARN) の詳細を含む既存の Amazon EKS クラスター。
Amazon EKS クラスターにインストールおよび設定済みの Kubernetes クラスターオートスケーラー。詳細については、Amazon EKS ドキュメントの「クラスターオートスケーラー」を参照してください。
GitHub リポジトリ内のコードへのアクセス。
重要な注意事項
AWS Security Hub は、コード内の AWS CloudFormation テンプレートの一部として有効になります。デフォルトでは、Security Hub を有効にすると 30 日間の無料トライアルが提供され、その後はこの AWS サービスに関連するコストがかかります。価格設定の詳細については、「AWS Security Hub の価格設定
製品バージョン
Helm バージョン 3.4.2 以降
Apache Maven バージョン 3.6.3 以降
BridgeCrew Checkov バージョン 2.2 以降
Aqua Security Trivy バージョン 0.37 以降
アーキテクチャ
テクノロジースタック
AWS CodeBuild
AWS CodeCommit
Amazon CodeGuru
AWS CodePipeline
Amazon Elastic Container Registry
Amazon Elastic Kubernetes Service
Amazon EventBridge
AWS Security Hub
Amazon Simple Notification Service (Amazon SNS)
ターゲットアーキテクチャ
![""](images/pattern-img/95a5b5c2-d7fb-41eb-9089-455318c0d585/images/4f5fd8c2-2b6d-4945-aa64-fcf317521711.png)
この図表は、次のワークフローを示しています:
開発者はリポジトリのベースブランチで Java アプリケーションコードを更新し CodeCommit 、プルリクエスト (PR) を作成します。
PR が送信されるとすぐに、Amazon CodeGuru Reviewer は自動的にコードを確認し、Java のベストプラクティスに基づいて分析し、開発者にレコメンデーションを提供します。
PR がベースブランチにマージされると、Amazon EventBridge イベントが作成されます。
EventBridge イベントは CodePipeline パイプラインを開始し、パイプラインは を開始します。
CodePipeline は CodeSecurity スキャンステージ (継続的なセキュリティ) を実行します。
CodeBuild は、Dockerfile および Kubernetes デプロイ Helm ファイルが Checkov を使用してスキャンされ、アプリケーションのソースコードが増分コード変更に基づいてスキャンされるセキュリティスキャンプロセスを開始します。アプリケーションのソースコードスキャンは、CodeGuru レビューワーコマンドラインインターフェイス (CLI) ラッパー
によって実行されます。 セキュリティスキャンステージが成功すると、ビルドステージ (継続的インテグレーション) が開始されます。
ビルドステージでは、 はアーティファクトを CodeBuild ビルドし、アーティファクトを Docker イメージにパッケージ化し、Aqua Security Trivy を使用してイメージをスキャンし、Amazon ECR にイメージを保存します。
ステップ 8 で検出された脆弱性は Security Hub にアップロードされ、開発者またはエンジニアによってさらに分析されます。Security Hub は、脆弱性を修復するための概要と推奨事項を提供します。
CodePipeline パイプライン内のさまざまなフェーズの E メール通知は、Amazon SNS を介して送信されます。
継続的インテグレーションフェーズが完了すると、 はデプロイステージ (継続的デリバリー) CodePipeline に入ります。
Docker イメージは、Helm チャートを使用してコンテナワークロード (ポッド) として Amazon EKS にデプロイされます。
アプリケーションポッドは、アプリケーションのプロファイリングデータ (CPU、ヒープ使用量、レイテンシー) CodeGuru を Amazon Profiler に送信する Amazon CodeGuru Profiler Agent で設定され、デベロッパーがアプリケーションの動作を理解するのに役立ちます。
ツール
AWS サービス
AWS CloudFormation は、AWS リソースをセットアップし、迅速かつ一貫したプロビジョニングを行い、AWS アカウントとリージョン全体のライフサイクルを通じてリソースを管理するのに役立ちます。
AWS CodeBuild は、ソースコードをコンパイルし、ユニットテストを実行し、すぐにデプロイできるアーティファクトを生成するのに役立つフルマネージドビルドサービスです。
AWS CodeCommit は、独自のソース管理システムを管理する必要なく、Git リポジトリをプライベートに保存および管理するためのバージョン管理サービスです。
Amazon CodeGuru Profiler は、ライブアプリケーションからランタイムパフォーマンスデータを収集し、アプリケーションのパフォーマンスを微調整するのに役立つレコメンデーションを提供します。
Amazon CodeGuru Reviewer は、プログラム分析と機械学習を使用して、デベロッパーが見つけるのが難しい潜在的な欠陥を検出し、Java および Python コードを改善するための提案を提供します。
AWS CodePipeline を使用すると、ソフトウェアリリースのさまざまな段階を迅速にモデル化して設定し、ソフトウェアの変更を継続的にリリースするために必要なステップを自動化できます。
Amazon Elastic Container Registry (Amazon ECR) は、セキュリティ、スケーラビリティ、信頼性を備えたマネージドコンテナイメージレジストリサービスです。
Amazon Elastic Kubernetes Service (Amazon EKS) は、 で Kubernetes を実行する際に役立ちます。独自の Kubernetes コントロールプレーンまたはノードをインストールおよび維持する必要はありません。
Amazon EventBridge は、アプリケーションをさまざまなソースからのリアルタイムデータに接続するのに役立つサーバーレスイベントバスサービスです。たとえば、AWS Lambda 関数、API 宛先を使用する HTTP 呼び出しエンドポイント、または他の AWS アカウントのイベントバスなどです。
「AWS Identity and Access Management (IAM)」は、AWS リソースへのアクセスを安全に管理し、誰が認証され、使用する権限があるかを制御するのに役立ちます。
AWS Security Hub は、AWS のセキュリティ状態の包括的なビューを提供します。また、セキュリティ業界の標準とベストプラクティスに対してお使いの AWS 環境をチェックする上で役立ちます。
「Amazon Simple Notification Service (Amazon SNS)」は、ウェブサーバーやメールアドレスなど、パブリッシャーとクライアント間のメッセージの交換を調整および管理するのに役立ちます。
Amazon Simple Storage Service (Amazon S3) は、任意のデータ量を保存、保護、取得する際に役立つクラウドベースのオブジェクトストレージサービスです。
その他のサービス
Helm
は Kubernetes 用のオープンソースのパッケージマネージャーです。 Apache Maven
は、ソフトウェアプロジェクトを管理する包括ツールです。 BridgeCrew Checkov
は、Infrastructure as Code (IaC) ファイルをスキャンして、セキュリティやコンプライアンスの問題につながる可能性のある設定ミスがないか確認するための静的コード分析ツールです。 Aqua Security Trivy
は、設定の問題に加えて、コンテナイメージ、ファイルシステム、Git リポジトリの脆弱性のための包括的スキャナーです。
コード
このパターンのコードはリポジトリにあります GitHub aws-codepipeline-devsecops-amazoneks
ベストプラクティス
このソリューションのすべての段階で、IAM エンティティは最小特権の原則に従っています。AWS のサービスまたはサードパーティのツールを追加してソリューションを拡張する場合は、最小特権の原則に従うことをお勧めします。
Java アプリケーションが複数ある場合は、各アプリケーションに個別の CI/CD パイプラインを作成することをお勧めします。
モノリスアプリケーションがある場合は、アプリケーションをできる限りマイクロサービスに分割することをお勧めします。マイクロサービスは柔軟性が高く、アプリケーションをコンテナとして簡単にデプロイでき、アプリケーションのビルドとデプロイ全体をよりよく把握できます。
エピック
タスク | 説明 | 必要なスキル |
---|---|---|
GitHub リポジトリのクローンを作成します。 | リポジトリのクローンを作成するには、次のコマンドを実行します。
| アプリ開発者、 DevOps エンジニア |
S3 バケットを作成し、コードをアップロードします。 |
| AWS DevOps、 DevOps エンジニア、クラウド管理者、 DevOps |
AWS CloudFormation スタックを作成します。 |
| AWS DevOps、 DevOps |
CloudFormation スタックのデプロイを検証します。 |
| DevOps エンジニア |
S3 バケットを削除します。 | 以前に作成した S3 バケットを空にして削除します。詳細については、Amazon EFS ユーザーガイドの「バケットの削除」を参照してください。 | AWS DevOps、 DevOps |
タスク | 説明 | 必要なスキル |
---|---|---|
Java アプリケーションの Helm チャートを設定します。 |
Kubernetes ワークロードのさまざまな機能を有効にするには、 | DevOps |
Helm チャートの構文エラーを検証します。 |
| DevOps エンジニア |
タスク | 説明 | 必要なスキル |
---|---|---|
CI/CD パイプラインを作成します。 |
| AWS DevOps |
タスク | 説明 | 必要なスキル |
---|---|---|
Aqua Security の統合をオンにします。 | このステップは、Trivy が報告した Docker イメージの脆弱性検出結果を Security Hub にアップロードするために必要です。AWS CloudFormation は Security Hub 統合をサポートしていないため、このプロセスは手動で実行する必要があります。
| AWS 管理者、 DevOps エンジニア |
タスク | 説明 | 必要なスキル |
---|---|---|
CodeBuild が Amazon EKS クラスターで Helm または kubectl コマンドを実行できるようにします。 | CodeBuild が EKS クラスターで Helm または 重要: のデプロイ承認ステージの前に、次の手順を完了する必要があります CodePipeline。
| DevOps |
タスク | 説明 | 必要なスキル |
---|---|---|
CI/CD パイプラインが自動的に開始されることを確認します。 |
を使用してパイプラインを開始する方法の詳細については CodePipeline、AWS CodePipeline ドキュメントの「 でパイプラインを開始する CodePipeline」、「パイプラインを手動で開始する」、および「スケジュールに従ってパイプラインを開始する」を参照してください。 | DevOps |
デプロイを承認します。 |
| DevOps |
アプリケーションプロファイリングを検証します。 | デプロイが完了し、アプリケーションポッドが Amazon EKS にデプロイされると、アプリケーションで設定された Amazon CodeGuru Profiler エージェントは、アプリケーションのプロファイリングデータ (CPU、ヒープサマリー、レイテンシー、ボトルネック) を Amazon CodeGuru Profiler に送信しようとします。 アプリケーションの初期デプロイでは、Amazon CodeGuru Profiler がプロファイリングデータを視覚化するのに約 15 分かかります。 | AWS DevOps |
関連リソース
追加情報
CodeGuru Profiler は、機能の観点から AWS X-Ray サービスと混同しないでください。 CodeGuru Profiler は、ボトルネックやセキュリティ問題を引き起こす可能性のある最も高価なコード行を特定し、潜在的なリスクになる前に修正することをお勧めします。AWS X-Ray サービスは、アプリケーションのパフォーマンスをモニタリングするものです。
このパターンでは、イベントルールはデフォルトのイベントバスに関連付けられます。必要に応じて、カスタムイベントバスを使用するようにパターンを拡張できます。
このパターンでは、アプリケーションコードの静的アプリケーションセキュリティテスト (SAST) ツールとして CodeGuru Reviewer を使用します。このパイプラインは、 SonarQube や Checkmarx などの他のツールにも使用できます。これらのツールの対応するスキャンセットアップ手順は、 のスキャン手順の代わりに buildspec/buildspec_secscan.yaml
に追加できます CodeGuru。