本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 CI/CD 管道自动构建 Java 应用程序并将其部署到 Amazon EKS
创建者:MAHESH RAGHUNANDANAN(AWS)、James Radtke(AWS)和 Jomcy Pappachen(AWS)
代码存储库:aws-cicd-java-eks | 环境:生产 | 技术:容器和微服务;; CloudNative DevOps;现代化 |
工作负载:所有其他工作负载 | AWS 服务:AWS CloudFormation;AWS CodeCommit;AWS CodePipeline;亚马逊 EC2 容器注册表;亚马逊 EKS |
Summary
此模式描述了如何创建持续集成和持续交付 (CI/CD) 管道,该管道可自动构建并部署具有推荐 DevSecOps 实践的 Java 应用程序,并将其部署到亚马逊网络服务 (AWS) 云上的亚马逊 Elastic Kubernetes Service (Amazon EKS) 集群。此模式使用采用 Spring Boot Java 框架开发的问候应用程序,该应用程序使用 Apache Maven。
您可以使用这种模式的方法为 Java 应用程序构建代码,将应用程序构件打包为 Docker 映像,对映像进行安全扫描,然后将该映像作为工作负载容器上传到 Amazon EKS 上。如果您想从紧密耦合的单片架构迁移到微服务架构,则此模式的方法非常有用。该方法还可以帮助您监控和管理 Java 应用程序的整个生命周期,从而确保更高的自动化水平并有助于避免错误或程序错误。
先决条件和限制
先决条件
一个有效的 Amazon Web Services account。
AWS 命令行界面(AWS CLI)版本 2,已安装并配置。有关这方面的更多信息,请参阅 AWS CLI 文档中的安装、更新和卸载 AWS CLI 版本 2。
AWS CLI 版本 2 必须使用与创建 Amazon EKS 集群相同的 IAM 角色进行配置,因为只有该角色才有权向
aws-auth
ConfigMap
中添加其他 IAM 角色。有关配置 AWS CLI 的信息和步骤,请参阅 AWS CLI 文档中的配置基础知识。具有 AWS 完全访问权限的 AWS Identity and Access Management (IAM) 角色和权限 CloudFormation。有关这方面的更多信息,请参阅 AWS CloudFormation 文档中的使用 IAM 控制访问权限。
现有的 Amazon EKS 集群,包含 EKS 集群中 Worker 节点的 IAM 角色名称和 IAM 角色 Amazon 资源名称(ARN)的详细信息。
Kubernetes 集群自动扩缩器,已在 Amazon EKS 集群中安装和配置。有关更多信息,请参阅 Amazon EKS 文档中的集群自动扩缩器。
访问 GitHub 存储库中的代码。
重要提示
AWS Security Hub 已作为代码中的 AWS CloudFormation 模板的一部分启用。默认情况下,启用 Security Hub 后,它会提供 30 天的免费试用,之后将收取与此 Amazon Web Services 相关的费用。有关定价的更多信息,请参阅 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)
目标架构
图表显示了以下工作流:
开发人员更新 CodeCommit 存储库基础分支中的 Java 应用程序代码,从而创建拉取请求 (PR)。
提交 PR 后,Amazon CodeGuru Reviewer 会自动审查代码,根据 Java 的最佳实践对其进行分析,并向开发者提供建议。
PR 合并到基础分支后,将创建一个 Amazon EventBridge 事件。
该 EventBridge 事件启动 CodePipeline 管道,管道启动。
CodePipeline 运行 CodeSecurity 扫描阶段(持续安全)。
CodeBuild 启动安全扫描流程,在该流程中,使用 Checkov 扫描 Dockerfile 和 Kubernetes 部署 Helm 文件,并根据增量代码更改扫描应用程序源代码。应用程序源代码扫描由 CodeGuru Reviewer 命令行界面 (CLI) 包装器
执行。 如果安全扫描阶段成功,则启动构建阶段(持续集成)。
在构建阶段, CodeBuild 构建工件,将构件打包到 Docker 镜像,使用 Aqua Security Trivy 扫描映像中是否存在安全漏洞,然后将映像存储在 Amazon ECR 中。
步骤 8 中检测到的漏洞将上传到 Security Hub,供开发人员或工程师进一步分析。Security Hub 提供了修复漏洞的概述和建议。
CodePipeline 管道中各个阶段的电子邮件通知通过 Amazon SNS 发送。
持续集成阶段完成后, CodePipeline 进入部署阶段(持续交付)。
使用 Helm 图表将 Docker 映像作为容器工作负载(容器组(pod))部署到 Amazon EKS。
应用程序容器配置了 Amazon P CodeGuru rofiler Agent,它会将应用程序的分析数据(CPU、堆使用情况和延迟)发送到 Amazon P CodeGuru rofiler,这可以帮助开发人员了解应用程序的行为。
工具
Amazon Web Services
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) 可帮助您在 AWS 上运行 Kubernetes,而无需安装或维护您自己的 Kubernetes 控制面板或节点。
Amazon EventBridge 是一项无服务器事件总线服务,可帮助您将应用程序与来自各种来源的实时数据连接起来。例如,AWS Lambda 函数、使用 API 目标的 HTTP 调用端点或其他 Amazon Web Services account 中的事件总线。
AWS Identity and Access Management (AWS IAM) 通过控制验证和授权使用您 AWS 资源的用户,帮助您安全地管理对您 AWS 资源的访问。
AWS Security Hub 向您提供 AWS 中安全状态的全面视图。Security Hub 还可以帮助您根据安全行业标准和最佳实践检查环境。
Amazon Simple Notification Service (Amazon SNS) 可帮助您协调和管理发布者与客户端(包括 Web 服务器和电子邮件地址)之间的消息交换。
Amazon Simple Storage Service (Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。
其他服务
Helm
是 Kubernetes 的开源软件包管理器。 Apache Maven
是一款软件项目管理及理解工具。 BridgeCrew Checkov
是一种静态代码分析工具,用于扫描基础设施即代码 (IaC) 文件,以查找可能导致安全性或合规性问题的错误配置。 Aqua Security Trivy
是一款全面的扫描工具,可检测容器映像、文件系统和 Git 存储库中的漏洞以及配置问题。
代码
此模式的代码可在 GitHub aws-codepipeline-devsecops-amazoneks
最佳实践
在本解决方案的所有阶段,IAM 实体都遵循了最低权限原则。如果您想使用其他 Amazon Web Services 或第三方工具扩展解决方案,我们建议您遵循最低权限原则。
如果您有多个 Java 应用程序,我们建议为每个应用程序创建单独的 CI/CD 管线。
如果您使用的是单体应用程序,我们建议尽可能将应用程序分解为微服务。微服务更加灵活,可以更轻松地将应用程序部署为容器,并且可以更好地了解应用程序的整体构建和部署。
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
克隆 GitHub 存储库。 | 要克隆存储库,请运行以下命令。
| 应用程序开发者、 DevOps 工程师 |
创建 S3 存储桶并上传代码。 |
| AWS DevOps, DevOps 工程师,云管理员, DevOps |
创建 AWS CloudFormation 堆栈。 |
| AWS DevOps, DevOps |
验证 CloudFormation 堆栈部署。 |
| DevOps 工程师 |
删除 S3 存储桶。 | 清空并删除您之前创建的 S3 存储桶。有关更多信息,请参阅 Amazon S3 文档中的删除存储桶。 | AWS DevOps, DevOps |
任务 | 描述 | 所需技能 |
---|---|---|
配置 Java 应用程序的 Helm 图表。 |
您可以通过更改 | 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 P CodeGuru rofiler 代理将尝试将应用程序的分析数据(CPU、堆摘要、延迟和瓶颈)发送到 Ama CodeGuru zon Profiler。 对于应用程序的初始部署,Amazon CodeGuru Profiler 大约需要 15 分钟才能对分析数据进行可视化。 | AWS DevOps |
相关资源
其他信息
CodeGuru 在功能方面,不应将 Profiler 与 AWS X-Ray 服务混淆。 CodeGuru Profiler 是识别可能导致瓶颈或安全问题的最昂贵代码行,并在它们成为潜在风险之前对其进行修复的首选。AWS X-Ray 服务用于监控应用程序性能。
在此模式中,事件规则与默认事件总线相关联。如果需要,您可以扩展模式以使用自定义事件总线。
此模式使用 CodeGuru Reviewer 作为应用程序代码的静态应用程序安全测试 (SAST) 工具。您也可以将此管道用于其他工具,例如 SonarQube 或 Checkmarx。可以添加其中任何工具的相应扫描设置说明buildspec/buildspec_secscan.yaml
,取代的扫描指令 CodeGuru。