

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 CI/CD 管道自动构建 Java 应用程序并将其部署到 Amazon EKS
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline"></a>

*MAHESH RAGHUNANDANAN、Jomcy Pappachen 和 James Radtke，Amazon Web Services*

## Summary
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline-summary"></a>

此模式描述了如何创建持续集成和持续交付 (CI/CD) 管道，该管道可根据推荐的 DevSecOps 做法自动构建并部署到上的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群。 AWS 云此模式使用采用 Spring Boot Java 框架开发的问候应用程序，该应用程序使用 Apache Maven。

您可以使用这种模式的方法为 Java 应用程序构建代码，将应用程序构件打包为 Docker 映像，对映像进行安全扫描，然后将该映像作为工作负载容器上传到 Amazon EKS 上。如果您想从紧密耦合的单片架构迁移到微服务架构，则此模式的方法非常有用。该方法还可以帮助您监控和管理 Java 应用程序的整个生命周期，从而确保更高的自动化水平并有助于避免错误或程序错误。

## 先决条件和限制
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline-prereqs"></a>

**先决条件**
+ 活跃 AWS 账户的.
+ AWS Command Line Interface (AWS CLI) 版本 2，已安装并配置。有关这方面的更多信息，请参阅 AWS CLI 文档 AWS CLI中的[安装或更新到最新版本](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)的。

  AWS CLI 版本 2 必须使用与创建 Amazon EKS 集群的相同 AWS Identity and Access Management (IAM) 角色进行配置，因为只有该角色才有权向中添加其他 IAM 角色`aws-auth``ConfigMap`。有关配置的信息和步骤 AWS CLI，请参阅 AWS CLI 文档中的[配置设置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html)。
+ 具有完全访问权限的 IAM 角色和权限 AWS CloudFormation。有关这方面的更多信息，请参阅 CloudFormation 文档中的[使用 IAM 控制访问权限](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html)。
+ 现有的 Amazon EKS 集群，包含 EKS 集群中 Worker 节点的 IAM 角色名称和 IAM 角色 Amazon 资源名称（ARN）的详细信息。
+ Kubernetes 集群自动扩缩器，已在 Amazon EKS 集群中安装和配置。有关更多信息，请参阅 Amazon EKS 文档中的[使用 Karpenter 和 Cluster Autoscaler 扩展集群计算](https://docs.aws.amazon.com/eks/latest/userguide/cluster-autoscaler.html)。 
+ 访问 GitHub 存储库中的代码。

**重要**  
AWS Security Hub CSPM 已作为此模式代码中包含的 CloudFormation 模板的一部分启用。默认情况下，启用 Security Hub CSPM 后，它会提供 30 天的免费试用期。试用结束后，会产生与此 AWS 服务相关的费用。有关定价的更多信息，请参阅 [AWS Security Hub CSPM 定价](https://aws.amazon.com/security-hub/pricing/)。

**产品版本**
+ Helm 版本 3.4.2 或更高版本
+ Apache Maven 版本 3.6.3 或更高版本
+ BridgeCrew Checkov 版本 2.2 或更高版本
+ Aqua Security Trivy 版本 0.37 或更高版本

## 架构
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline-architecture"></a>

**技术堆栈**
+ AWS CodeBuild
+ AWS CodeCommit
+ Amazon CodeGuru
+ AWS CodePipeline
+ Amazon Elastic Container Registry (Amazon ECR)
+ Amazon EKS
+ Amazon EventBridge
+ AWS Security Hub CSPM
+ Amazon Simple Notification Service（Amazon SNS）

**目标架构**

![\[将 Java 应用程序部署到 Amazon EKS 的工作流。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/95a5b5c2-d7fb-41eb-9089-455318c0d585/images/4f5fd8c2-2b6d-4945-aa64-fcf317521711.png)


下图显示了如下工作流：

1. 开发人员更新 CodeCommit 存储库基础分支中的 Java 应用程序代码，从而创建拉取请求 (PR)。

1. 提交 PR 后，Amazon CodeGuru Reviewer 会自动审查代码，根据 Java 的最佳实践对其进行分析，并向开发者提供建议。

1. PR 合并到基础分支后，将创建一个 Amazon EventBridge 事件。

1. 该 EventBridge 事件启动 CodePipeline 管道，管道启动。

1. CodePipeline 运行 CodeSecurity 扫描阶段（持续安全）。

1. AWS CodeBuild 启动安全扫描流程，在该流程中，使用 Checkov 扫描 Dockerfile 和 Kubernetes 部署 Helm 文件，并根据增量代码更改扫描应用程序源代码。应用程序源代码扫描由 [CodeGuru Reviewer 命令行界面 (CLI) 包装器](https://github.com/aws/aws-codeguru-cli)执行。
**注意**  
自 2025 年 11 月 7 日起，您无法在 Amazon CodeGuru Reviewer 中创建新的存储库关联。要了解具有类似审阅者功能的服务，请参阅 CodeGuru Reviewer 文档中的 [Amazon CodeGuru Reviewer 可用性变更](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/codeguru-reviewer-availability-change.html)。 CodeGuru 

1. 如果安全扫描阶段成功，则启动构建阶段（持续集成）。

1. 在构建阶段， CodeBuild 构建工件，将构件打包到 Docker 镜像，使用 Aqua Security Trivy 扫描映像中是否存在安全漏洞，然后将映像存储在 Amazon ECR 中。

1. 步骤 8 中检测到的漏洞将上传到 Security Hub CSPM，供开发人员或工程师进一步分析。Security Hub CSPM 提供了修复漏洞的概述和建议。

1.  CodePipeline 管道中连续阶段的电子邮件通知通过 Amazon SNS 发送。

1. 持续集成阶段完成后， CodePipeline 进入部署阶段（持续交付）。

1. 使用 Helm 图表将 Docker 映像作为容器工作负载（容器组（pod））部署到 Amazon EKS。

1. 应用程序容器使用 Amazon P CodeGuru rofiler 代理进行配置，该代理会将应用程序的分析数据（CPU、堆使用情况和延迟）发送到 P CodeGuru rofiler，从而帮助开发人员了解应用程序的行为。

## 工具
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline-tools"></a>

**AWS 服务**
+ [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)帮助您设置 AWS 资源，快速一致地配置资源，并在资源的整个生命周期中跨地区对其 AWS 账户 进行管理。
+  [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 是一项完全托管式构建服务，可编译源代码、运行单元测试和生成部署就绪的构件。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) 是一项版本控制服务，可帮助您私下存储和管理 Git 存储库，而无需管理自己的源代码控制系统。
+ [Amazon CodeGuru Profiler](https://docs.aws.amazon.com/codeguru/latest/profiler-ug/what-is-codeguru-profiler.html) 会从您的实时应用程序收集运行时性能数据，并提供建议，以帮助您微调应用程序性能。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 可帮助您快速对软件发布过程的不同阶段进行建模和配置，并自动执行持续发布软件变更所需步骤。
+ [Amazon Elastic Container Registry（Amazon ECR）](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html)是一项安全、可扩展且可靠的托管容器映像注册表服务。
+ [亚马逊 Elastic Kubernetes Service（亚马逊](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) EKS）可帮助你在上面运行 AWS Kubernetes，而无需安装或维护自己的 Kubernetes 控制平面或节点。
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) 是一项无服务器事件总线服务，可帮助您将应用程序与来自各种来源的实时数据连接起来，包括 AWS Lambda 函数、使用 API 目标的 HTTP 调用终端节点或其他来源的事件总线。 AWS 账户
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 通过控制谁经过身份验证并有权使用 AWS 资源，从而帮助您安全地管理对资源的访问权限。
+ [AWS Security Hub CSPM](https://docs.aws.amazon.com/securityhub/latest/userguide/what-is-securityhub.html)提供了您的安全状态的全面视图 AWS。它还可以帮助您根据安全行业标准和最佳实践检查您的 AWS 环境。
+ [Amazon Simple Notification Service（Amazon SNS）](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)可帮助您协调和管理发布者与客户端（包括 Web 服务器和电子邮件地址）之间的消息交换。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。

**其他服务**
+ [Helm](https://helm.sh/docs/) 是 Kubernetes 的开源软件包管理器。
+ [Apache Maven](https://maven.apache.org/) 是一款软件项目管理及理解工具。
+ [BridgeCrew Checkov](https://www.checkov.io/1.Welcome/What%20is%20Checkov.html) 是一种静态代码分析工具，用于扫描基础设施即代码 (IaC) 文件，以查找可能导致安全性或合规性问题的错误配置。
+ [Aqua Security Trivy](https://github.com/aquasecurity/trivy) 是一款全面的扫描工具，可检测容器映像、文件系统和 Git 存储库中的漏洞以及配置问题。

**代码**

此模式的代码可在 GitHub [aws-codepipeline-devsecops-amazoneks](https://github.com/aws-samples/aws-codepipeline-devsecops-amazoneks)存储库中找到。

## 最佳实践
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline-best-practices"></a>
+ 此模式遵循 [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)，在解决方案的所有阶段都对 IAM 实体应用最低权限原则。如果您想使用其他工具 AWS 服务 或第三方工具扩展解决方案，我们建议您查看 IAM 文档中有关[应用最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)的部分。
+ 如果您有多个 Java 应用程序，我们建议您为每个应用程序创建单独的 CI/CD 管道。
+ 如果您使用的是单体应用程序，我们建议在可能的情况下将应用程序分解为微服务。微服务更加灵活，可以更轻松地将应用程序部署为容器，并且可以更好地了解应用程序的整体构建和部署。

## 操作说明
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline-epics"></a>

### 设置环境
<a name="set-up-the-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 克隆 GitHub 存储库。 | 要克隆存储库，请运行以下命令。<pre>git clone https://github.com/aws-samples/aws-codepipeline-devsecops-amazoneks</pre> | 应用程序开发者、 DevOps 工程师 | 
| 创建 S3 存储桶并上传代码。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html) | AWS DevOps，云管理员， DevOps 工程师 | 
| 创建 CloudFormation 堆栈。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html) | AWS DevOps， DevOps 工程师 | 
| 验证 CloudFormation 堆栈部署。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html) | AWS DevOps， DevOps 工程师 | 
| 删除 S3 存储桶。 | 清空并删除您之前创建的 S3 存储桶。有关更多信息，请参阅 Amazon S3 文档中的[删除存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)。 | AWS DevOps， DevOps 工程师 | 

### 配置 Helm 图表
<a name="configure-the-helm-charts"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 配置 Java 应用程序的 Helm 图表。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html) | DevOps 工程师 | 
| 验证 Helm 图表是否存在语法错误。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html) | DevOps 工程师 | 

### 设置 Java CI/CD 管道
<a name="set-up-the-java-ci-cd-pipeline"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 CI/CD 管道。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html) | AWS DevOps | 

### 激活 Security Hub CSPM 和 Aqua Security 之间的集成
<a name="activate-integration-between-ash-and-aqua-security"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 打开 Aqua Security 集成。 | 要将 Trivy 报告的 Docker 镜像漏洞发现上传到 Security Hub CSPM，必须执行此步骤。由于 CloudFormation 不支持 Security Hub CSPM 集成，因此必须手动完成此过程。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html) | AWS 管理员、 DevOps 工程师 | 

### 配置 CodeBuild 为运行 Helm 或 kubectl 命令
<a name="configure-acb-to-run-helm-or-kubectl-commands"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
|  CodeBuild 允许在 Amazon EKS 集群中运行 Helm 或 kubectl 命令。 |  CodeBuild 要通过身份验证才能在 Amazon EKS 集群中使用 Helm 或`kubectl`命令，您必须将 IAM 角色添加到`aws-auth``ConfigMap`。在本例中，添加 IAM 角色的 ARN`EksCodeBuildkubeRoleARN`，即为 CodeBuild 服务创建的 IAM 角色，用于访问 Amazon EKS 集群并在其上部署工作负载。这是一次性活动。在部署批准阶段之前，必须完成以下程序 CodePipeline。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html)已配置 `aws_auth` `ConfigMap`，并授予访问权限。 | DevOps | 

### 验证 CI/CD 管道
<a name="validate-the-ci-cd-pipeline"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证 CI/CD 管道是否自动启动。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html)有关使用启动管道的更多信息 CodePipeline，请参阅 CodePipeline 文档[中的启动管](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-about-starting.html)[道CodePipeline、手动](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-rerun-manually.html)[启动管道和按计划](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-trigger-source-schedule.html)启动管道。 | DevOps | 
| 批准部署。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html) | DevOps | 
| 验证应用程序分析。 | 部署完成并将应用程序容器部署在 Amazon EKS 中后，在应用程序中配置的 Amazon P CodeGuru rofiler 代理将尝试将应用程序的分析数据（CPU、堆摘要、延迟和瓶颈）发送到 CodeGuru Profiler。对于应用程序的初始部署， CodeGuru Profiler 大约需要 15 分钟来可视化分析数据。 | AWS DevOps | 

## 相关资源
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline-resources"></a>
+ [AWS CodePipeline 文档](https://docs.aws.amazon.com/codepipeline/index.html)
+ 在 AWS CodePipeline（AWS 博客文章）[中使用 Trivy 扫描图像](https://aws.amazon.com/blogs/containers/scanning-images-with-trivy-in-an-aws-codepipeline/)
+ [使用 Amazon P CodeGuru rofiler 改进您的 Java 应用程序](https://aws.amazon.com/blogs/devops/improving-your-java-applications-using-amazon-codeguru-profiler)（AWS 博客文章）
+ [AWS 安全调查结果格式 (ASFF) 语法](https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-findings-format-syntax.html)
+ [亚马逊 EventBridge 事件模式](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html)
+ [Helm 升级](https://helm.sh/docs/helm/helm_upgrade/)

## 附加信息
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline-additional"></a>
+ CodeGuru 在功能方面，不应将 Profiler 与 AWS X-Ray 服务混淆。我们建议您使用 CodeGuru Profiler 来识别可能导致瓶颈或安全问题的最昂贵的代码行，并在它们成为潜在风险之前对其进行修复。X-Ray 服务用于监控应用程序性能。
+ 在此模式中，事件规则与默认事件总线相关联。如果需要，您可以扩展模式以使用自定义事件总线。
+ 此模式使用 CodeGuru Reviewer 作为应用程序代码的静态应用程序安全测试 (SAST) 工具。您也可以将此管道用于其他工具，例如 SonarQube 或 Checkmarx。您可以添加其中任何工具的扫描设置说明`buildspec/buildspec_secscan.yaml`来替换 CodeGuru 扫描指令。
**注意**  
自 2025 年 11 月 7 日起，您无法在 Amazon CodeGuru Reviewer 中创建新的存储库关联。要了解具有类似审阅者功能的服务，请参阅 CodeGuru Reviewer 文档中的 [Amazon CodeGuru Reviewer 可用性变更](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/codeguru-reviewer-availability-change.html)。 CodeGuru 