端到端 AWS DevOps 项目:在 Amazon EKS 上自动构建和部署 Java 应用程序
在本项目中,我们将使用 AWS 服务,在 Amazon Elastic Kubernetes Service (EKS) 上构建并部署一个 Java 应用程序,并利用持续集成和持续部署 (CI/CD) 管道。每个 AWS 组件都构成了可靠的 DevOps 工作流,因此本指南对于希望在 AWS 上构建可扩展解决方案的 DevOps 工程师来说非常有用。
目录
项目概述
该项目旨在自动化基于 Java 的微服务应用程序的构建、测试和部署流程。利用 AWS 服务,我们将确保从代码提交到生产部署的整个流程可靠且安全。以下是我们将使用的 AWS 服务的概述:
- GitHub:源代码库
- AWS CodeBuild:用于构建和测试应用程序
- AWS CodePipeline:协调 CI/CD
- Amazon Elastic Container Registry(ECR):用于容器镜像存储
- Amazon Elastic Kubernetes Service(EKS):用于部署应用程序
- Amazon CodeGuru:用于代码质量分析
- AWS Security Hub:监控安全漏洞
- Amazon SNS:用于通知
先决条件
首先,您需要以下内容:
- 具有 ECR、EKS、CodePipeline、CodeBuild、Security Hub 和 SNS 权限的AWS 账户。
- 源代码的GitHub 存储库。
- Java 应用程序(最好是微服务应用程序)带有用于容器化的 Dockerfile。
- Docker 安装用于本地容器化任务。
架构图
下面是一个示例架构图,表示 AWS 上的 CI/CD 管道和部署环境:
设置 GitHub 存储库
步骤 1:创建您的 GitHub 存储库
-
创建存储库:
- 登录 GitHub,创建一个新的存储库,并上传您的 Java 应用程序源代码。
-
添加 Dockerfile:
- 在项目的根目录中包含一个 Dockerfile 来定义 Java 应用程序的容器环境。
-
示例 Dockerfile:
FROM openjdk:11-jdk
WORKDIR /app
COPY . /app
RUN ./gradlew build
CMD ["java", "-jar", "build/libs/your-app.jar"]
-
将 GitHub 与 AWS CodePipeline 集成:
- 导航到AWS CodePipeline并创建一个新的管道。
- 对于源提供商,选择GitHub并授权 AWS 访问您的存储库。
- 选择要监视更改的分支(例如,主要)。
-
创建 GitHub Webhook:
- 在 GitHub 中,前往“设置”>“Webhook”,并为存储库设置一个 Webhook。这样,CodePipeline 便会在推送到存储库时自动触发。
创建 Amazon ECR 存储库
Amazon Elastic Container Registry (ECR) 是一个完全托管的容器注册表。我们将在这里存储 Java 应用程序的 Docker 镜像。
- 创建 Amazon ECR 存储库:
aws ecr create-repository --repository-name my-java-app --region <your-region>
-
使用 ECR 对 Docker 进行身份验证:
- 使用以下命令登录您的 ECR 注册表:
aws ecr get-login-password --region <your-region> | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com
-
构建、标记和推送 Docker 镜像:
- 构建 Docker 镜像:
docker build -t my-java-app .
-
标记图像:
docker tag my-java-app:latest <account-id>.dkr.ecr.<region>.amazonaws.com/my-java-app:latest
-
将图像推送到 ECR:
docker push <account-id>.dkr.ecr.<region>.amazonaws.com/my-java-app:latest
设置 Amazon EKS 集群
Amazon Elastic Kubernetes Service (EKS) 在 AWS 上提供托管的 Kubernetes 集群,我们将使用它来部署和管理我们的应用程序容器。
步骤 1:创建 EKS 集群
- 创建EKS集群:
aws eks create-cluster --name my-eks-cluster --region <your-region> --kubernetes-version 1.21 --role-arn <eks-role-arn>
-
设置工作节点:
- 使用EKS 控制台或 CLI 为您的集群设置工作节点(节点组)以运行应用程序 pod。
-
更新 kubeconfig:
- 更新本地 Kubernetes 配置以与 EKS 集群交互。
aws eks update-kubeconfig --region <your-region> --name my-eks-cluster
步骤 2:在 EKS 上部署 Java 应用程序
- 创建 Kubernetes 部署 YAML:
- 定义一个
deployment.yaml
文件来指定Java应用程序的副本数、Docker镜像和其他配置。
- 定义一个
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-java-app
spec:
replicas: 3
selector:
matchLabels:
app: my-java-app
template:
metadata:
labels:
app: my-java-app
spec:
containers:
- name: my-java-app
image: <account-id>.dkr.ecr.<region>.amazonaws.com/my-java-app:latest
ports:
- containerPort: 8080
- 部署到EKS:
kubectl apply -f deployment.yaml
- 创建负载均衡服务:
- 使用负载均衡器公开应用程序以供外部访问。
apiVersion: v1
kind: Service
metadata:
name: my-java-app-service
spec:
type: LoadBalancer
selector:
app: my-java-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
- 部署服务:
kubectl apply -f service.yaml
构建和配置 CI/CD 管道
步骤 1:设置 CodePipeline
-
创建 CodePipeline 管道:
- 转到AWS CodePipeline并设置阶段:
- 来源(GitHub)
- 构建(CodeBuild)
- 部署(EKS)
- 转到AWS CodePipeline并设置阶段:
-
配置AWS CodeBuild:
- 为 CodeBuild定义一个
buildspec.yml
以构建 Docker 镜像并将其推送到 ECR。
- 为 CodeBuild定义一个
version: 0.2
phases:
install:
runtime-versions:
java: corretto11
build:
commands:
- echo Building the Docker image...
- docker build -t my-java-app .
- docker tag my-java-app:latest <account-id>.dkr.ecr.<region>.amazonaws.com/my-java-app:latest
- docker push <account-id>.dkr.ecr.<region>.amazonaws.com/my-java-app:latest
- 在 CodePipeline 中设置部署阶段:
- 将 EKS 与 CodePipeline 集成以实现部署自动化。
第 2 步:自动化质量和安全检查
-
亚马逊CodeGuru:
- 将CodeGuru Reviewer与 GitHub集成,对每次提交执行代码质量检查。
-
AWS 安全中心:
- 启用Security Hub来监控 AWS 资源中的安全漏洞。
-
Amazon SNS 通知:
- 设置SNS以获取有关构建或部署失败或安全警报的通知:
aws sns create-topic --name my-devops-notifications
aws sns subscribe --topic-arn arn:aws:sns:<region>:<account-id>:my-devops-notifications --protocol email --notification-endpoint <your-email>
- EventBridge 自动化规则:
- 创建 EventBridge 规则以根据 CodePipeline 或 Security Hub 事件触发特定操作(如 SNS 通知)。
结论
这个端到端项目提供了一套完整的 DevOps 解决方案,用于在 AWS 上构建和部署 Java 应用程序。通过使用 Code
我们通过 CI/CD 管道、容器存储 ECR 和部署 EKS 确保可扩展且可靠的运营。此外,CodeGuru、Security Hub 和 SNS 有助于维护代码质量、安全性和实时警报,使此设置稳健可靠,适用于企业。
👤 作者

加入我们的电报社区||在 GitHub 上关注我以获取更多 DevOps 内容!
文章来源:https://dev.to/prodevopsguytech/end-to-end-aws-devops-project-automate-java-application-build-and-deployment-on-amazon-eks-5al8