

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

# 使用 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 Cloud此模式使用采用 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 的工作流。](https://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 存储桶并上传代码。 | 1. 登录 AWS 管理控制台，打开 [Amazon S3 控制台](https://console.aws.amazon.com/s3/)，然后在计划部署此解决方案的 AWS 区域 位置创建 S3 存储桶。有关更多信息，请参阅 Amazon S3 文档中的[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)。<br />2. 在 S3 存储桶中，创建一个名为 `code` 的文件夹。<br />3. 导航到您克隆存储库的位置。要创建扩展名为 .zip（`cicdstack.zip`）的整个代码的压缩版本并验证 .zip 文件，请按顺序运行以下命令。<pre>cd aws-codepipeline-devsecops-amazoneks<br />python -m zipfile -c cicdstack.zip *<br />python -m zipfile -t cicdstack.zip</pre>如果 `python` 命令失败并显示未找到 Python，请改用 `python3`。<br />4. 将 `cicdstack.zip` 文件上传到您在上一步的 S3 存储桶中创建的代码文件夹。 | AWS DevOps，云管理员， DevOps 工程师 | 
| 创建 CloudFormation 堆栈。 | 1. 打开 [CloudFormation 控制台](https://console.aws.amazon.com/cloudformation/)，然后选择**创建堆栈**。<br />2. 在**指定模板**中，选择**上传模板文件**，上传 `cf_templates/codecommit_ecr.yaml` 文件，然后选择**下一步**。<br />3. 在**指定堆栈详细信息**中，输入堆栈名称，然后提供以下输入参数值：`CodeCommitRepositoryBranchName`：您的代码将驻留的分支的名称（默认值为 `main`）`CodeCommitRepositoryName`: CodeCommitrepository 要创建的名称`CodeCommitRepositoryS3Bucket`：您在其中创建代码文件夹的 S3 存储桶的名称`CodeCommitRepositoryS3BucketObjKey`: `code/cicdstack.zip``ECRRepositoryName`：要创建的 Amazon ECR 存储库的名称<br />4. 选择**下一步**，使用**配置堆栈选项**的默认设置，然后选择**下一步**。<br />5. 在**查看**部分中，验证模板和堆栈的详细信息，然后选择**创建堆栈**。然后创建堆栈，包括 CodeCommit 和 Amazon ECR 存储库。<br />6. 记下 CodeCommit 和 Amazon ECR 存储库的名称，这是设置 Java CI/CD 管道所必需的。 | AWS DevOps， DevOps 工程师 | 
| 验证 CloudFormation 堆栈部署。 | 1. 在 CloudFormation 控制台的**堆栈**下，验证您部署的 CloudFormation 堆栈的状态。堆栈的状态应为**创建完成**。<br />2. 在控制台中，验证 CloudFormation 和 Amazon ECR 存储库是否已配置并准备就绪。 | 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 图表。 | 1. 在您克隆 GitHub 存储库的位置，导航到该文件夹`helm_charts/aws-proserve-java-greeting`。在此文件夹中，该 `values.dev.yaml` ****文件包含有关 Kubernetes 资源配置的信息，您可以针对将容器部署到 Amazon EKS 来修改这些配置。通过提供您的 AWS 账户 ID 和 Amazon ECR 存储库名称来更新 Docker 存储库参数。 AWS 区域<pre>image:<br />  repository: <account-id>.dkr.ecr.<region>.amazonaws.com/<app-ecr-repo-name></pre><br />2. Java 容器组（pod）的服务类型设置为 `LoadBalancer`。<pre>service:<br />  type: LoadBalancer<br />  port: 80<br />  targetPort: 8080<br />  path: /hello<br />  initialDelaySeconds: 60<br />  periodSeconds: 30</pre><br />要使用其他服务（例如 `NodePort`），可以更改此参数。有关更多信息，请参阅 [Kubernetes 文档](https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types)。<br />3. 您可以通过将参数 `autoscaling` 更改为 `enabled: true` 来激活 [Kubernetes 水平容器组（pod）自动扩缩器](https://docs.aws.amazon.com/eks/latest/userguide/horizontal-pod-autoscaler.html)。<pre>autoscaling:<br />  enabled: true<br />  minReplicas: 1<br />  maxReplicas: 100<br />  targetCPUUtilizationPercentage: 80<br />  # targetMemoryUtilizationPercentage: 80</pre><br />4. 您可以通过更改 `values.<ENV>.yaml` 文件中的值为 Kubernetes 工作负载启用不同的功能，其中 `<ENV>` 是您的开发、生产、UAT 或 QA 环境。 | DevOps 工程师 | 
| 验证 Helm 图表是否存在语法错误。 | 1. 在终端上，运行以下命令，验证 Helm v3 是否已安装在本地工作站中。<pre>helm --version</pre><br />如果未安装 Helm v3，[请安装](https://helm.sh/docs/intro/install/)。<br />2. 在终端中，导航到 Helm 图表目录（`helm_charts/aws-proserve-java-greeting`），然后运行以下命令。<pre>helm lint . -f values.dev.yaml</pre><br />这将检查 Helm 图表中是否存在任何语法错误。 | DevOps 工程师 | 

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


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 CI/CD 管道。 | 1. 打开 [CloudFormation 控制台](https://console.aws.amazon.com/cloudformation/)，然后选择**创建堆栈**。<br />2. 在**指定模板**中，选择**上传模板文件**，上传 `cf_templates/build_deployment.yaml` 模板，然后选择**下一步**。<br />3. 在**指定堆栈详细信息**中，指定**堆栈名称**，然后提供以下输入参数值：`CodeBranchName`: 您的代码所在 CodeCommit 存储库的分支名称`EKSClusterName`：EKS 集群的名称（非 `EKSCluster` ID）`EKSCodeBuildAppName`：应用程序 Helm 图表的名称（`aws-proserve-java-greeting`）`EKSWorkerNodeRoleARN`：分配给 Amazon EKS Worker 节点的 IAM 角色的 ARN`EKSWorkerNodeRoleName`：分配给 Amazon EKS Worker 节点的 IAM 角色的名称`EcrDockerRepository`：用于存储代码的 Docker 映像的 Amazon ECR 存储库的名称`EmailRecipient`：应将构建通知发送到的电子邮件地址`EnvType`：环境（例如，开发、测试或生产）`SourceRepoName`: 您的代码所在 CodeCommit 存储库的名称<br />4. 选择**下一步**。使用**配置堆栈选项**的默认设置，然后选择**下一步**。<br />5. 在 “**查看**” 部分，验证 CloudFormation 模板和堆栈的详细信息，然后选择 “**下一步**”。<br />6. 选择**创建堆栈**。 <br />7. 在 CloudFormation 堆栈部署期间，您在参数中提供的电子邮件地址的所有者将收到一条订阅 SNS 主题的消息。要订阅 Amazon SNS，所有者必须选择消息中的链接。<br />8. 创建堆栈后，打开堆栈的**输出**选项卡，然后记录 `EksCodeBuildkubeRoleARN` 输出密钥的 ARN 值。稍后，当您为 IAM 角色提供在 Amazon EKS 集群中部署工作负载的权限时，将需要此 CodeBuild IAM ARN 值。 | 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 集成，因此必须手动完成此过程。1. 打开 [AWS Security Hub CSPM 控制台](https://console.aws.amazon.com/securityhub/)，然后导航到**集成**。<br />2. 搜索 Aqua Security，然后选择 **Aqua Security：Aqua Security**。<br />3. 选择**接受调查发现**。 | 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。1. 在 Amazon Linux 或 macOS 环境中打开 `cf_templates/kube_aws_auth_configmap_patch.sh` Shell 脚本。<br />2. 通过运行以下命令对 Amazon EKS 集群进行验证。<pre>aws eks --region <aws-region> update-kubeconfig --name <eks-cluster-name></pre><br />3. 使用以下命令运行 Shell 脚本，将 `<rolearn-eks-codebuild-kubectl>` 替换为之前记录的 `EksCodeBuildkubeRoleARN` ARN 值。<pre>bash cf_templates/kube_aws_auth_configmap_patch.sh <rolearn-eks-codebuild-kubectl> </pre><br />已配置 `aws_auth` `ConfigMap`，并授予访问权限。 | DevOps | 

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


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证 CI/CD 管道是否自动启动。 | 1. 如果 Checkov 在 Dockerfile 或 Helm 图表中检测到漏洞，则管道中的 CodeSecurity 扫描阶段通常会失败。但是，此示例的目的是建立一个识别潜在安全漏洞的过程，而不是通过 CI/CD 管道进行修复，通常是一个 DevSecOps 过程。在文件 `buildspec/buildspec_secscan.yaml` 中，该 `checkov` 命令使用 `--soft-fail` 标志来避免管线故障。<pre>- echo -e "\n Running Dockerfile Scan"<br />- checkov -f code/app/Dockerfile --framework dockerfile --soft-fail --summary-position bottom<br />- echo -e "\n Running Scan of Helm Chart files"<br />- cp -pv helm_charts/$EKS_CODEBUILD_APP_NAME/values.dev.yaml helm_charts/$EKS_CODEBUILD_APP_NAME/values.yaml<br />- checkov -d helm_charts/$EKS_CODEBUILD_APP_NAME --framework helm --soft-fail --summary-position bottom<br />- rm -rfv helm_charts/$EKS_CODEBUILD_APP_NAME/values.yaml</pre><br />要使管线在报告 Dockerfile 和 Helm 图表的漏洞时失败，必须从 `checkov` 命令中删除该 `--soft-fail` 选项。然后，开发人员或工程师可以修复漏洞并将更改提交到 CodeCommit 源代码存储库。<br />2. 与 CodeSecurity 扫描类似，在将应用程序推送到 Amazon ECR 之前，构建阶段使用 Aqua S `HIGH` ecurity Trivy 来识别 `CRITICAL` Docker 镜像漏洞。<pre>- AWS_REGION=$AWS_DEFAULT_REGION AWS_ACCOUNT_ID=$AWS_ACCOUNT_ID trivy -d image --no-progress --ignore-unfixed --exit-code 0 --severity HIGH,CRITICAL --format template --template "@securityhub/asff.tpl" -o securityhub/report.asff $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$CODEBUILD_RESOLVED_SOURCE_VERSION</pre><br />在此示例中，当报告 Docker 映像漏洞时管道不会失败，因为 `buildspec/buildspec.yml` 文件中的 `trivy` 命令包含值为****** **`0` 的标志** **`--exit-code`。要使管线在报告 `HIGH` 和 `CRTICAL` 漏洞时失败，请将 `--exit-code` 的值更改为 `1`。然后，开发人员或工程师可以修复漏洞并将更改提交到 CodeCommit 源代码存储库。<br />3. Aqua Security Trivy 报告的 Docker 镜像漏洞已上传到 Security Hub CSPM。**在 Security Hub CSPM 控制台上，导航到调查结果。**使用**记录****状态 = 活跃**和**产品 = Aqua Security**来筛选调查发现。这列出了 Security Hub CSPM 中的 Docker 镜像漏洞。漏洞可能需要 15 分钟到一个小时才会出现在 Security Hub CSPM 中。有关使用启动管道的更多信息 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 | 
| 批准部署。 | 1. 构建阶段完成后，将有一个部署批准门。审查者或发布经理应检查该构建，如果满足所有要求，则应予以批准。对于使用持续交付进行应用程序部署的团队，推荐使用这种方法。<br />2. 批准后，管线将启动部署阶段。<br />3. 部署阶段成功后，此阶段的 CodeBuild 日志将提供应用程序的 URL。使用 URL 验证应用程序是否准备就绪。 | DevOps | 
| 验证应用程序分析。 | 部署完成并将应用程序容器部署在 Amazon EKS 中后，在应用程序中配置的 Amazon P CodeGuru rofiler 代理将尝试将应用程序的分析数据（CPU、堆摘要、延迟和瓶颈）发送到 CodeGuru Profiler。<br />对于应用程序的初始部署， 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 