在此專案中,我們將使用 AWS 服務透過持續整合和持續部署 (CI/CD) 管道在 Amazon Elastic Kubernetes Service (EKS) 上建置和部署 Java 應用程式。每個 AWS 元件都有助於實現可靠的開發營運工作流程,因此本指南對於希望在 AWS 上建立可擴展解決方案的開發營運工程師非常有用。

目錄

  1. 專案概況

  2. 先決條件

  3. 架構圖

  4. 設定 GitHub 儲存庫

  5. 建立 Amazon ECR 儲存庫

  6. 設定 Amazon EKS 集群

  7. 建置和配置 CI/CD 管道

  8. 整合安全和通知服務

  9. 結論


專案概況

該專案旨在自動化基於 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 :用於通知


先決條件

首先,您需要具備以下條件:

  1. 具有 ECR、EKS、CodePipeline、CodeBuild、Security Hub 和 SNS 權限的AWS 帳戶

  2. 原始碼的GitHub 儲存庫

  3. 具有用於容器化的 Dockerfile 的Java 應用程式(最好是微服務應用程式)。

  4. Docker 安裝用於本機容器化任務。


架構圖

下面是一個範例架構圖,表示 AWS 上的 CI/CD 管道和部署環境:

圖片說明


設定 GitHub 儲存庫

第 1 步:建立您的 GitHub 儲存庫

  1. 建立一個儲存庫
  • 登入 GitHub,建立新儲存庫,然後上傳 Java 應用程式原始碼。
  1. 新增 Dockerfile
  • 在專案的根目錄中包含一個 Dockerfile 來定義 Java 應用程式的容器環境。
  1. 範例 Dockerfile
   FROM openjdk:11-jdk
   WORKDIR /app
   COPY . /app
   RUN ./gradlew build
   CMD ["java", "-jar", "build/libs/your-app.jar"]
  1. 將 GitHub 與 AWS CodePipeline 整合
  • 導航至AWS CodePipeline並建立新管道。

  • 對於來源提供者,選擇GitHub並授權 AWS 存取您的儲存庫。

  • 選擇要監視變更的分支(例如,主分支)。

  1. 建立 GitHub Webhook
  • 在 GitHub 中,前往設定 > Webhooks並為儲存庫設定 Webhook。這允許 CodePipeline 在任何推送到儲存庫時自動觸發。

建立 Amazon ECR 儲存庫

Amazon Elastic Container Registry (ECR) 是一個完全託管的容器註冊表。我們將在這裡儲存 Java 應用程式的 Docker 映像。

  1. 建立 Amazon ECR 儲存庫
   aws ecr create-repository --repository-name my-java-app --region <your-region>
  1. 使用 ECR 驗證 Docker
  • 使用以下命令登入您的 ECR 註冊表:
     aws ecr get-login-password --region <your-region> | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com
  1. 建置、標記和推送 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 集群,我們將使用它來部署和管理應用程式容器。

步驟一:建立EKS集群

  1. 建立 EKS 叢集
   aws eks create-cluster --name my-eks-cluster --region <your-region> --kubernetes-version 1.21 --role-arn <eks-role-arn>
  1. 設定工作節點
  • 使用EKS 控制台或 CLI 為叢集設定工作節點(節點群組)以執行應用程式 Pod。
  1. 更新 kubeconfig
  • 更新本機 Kubernetes 配置以與 EKS 叢集互動。
     aws eks update-kubeconfig --region <your-region> --name my-eks-cluster

步驟 2:在 EKS 上部署 Java 應用程式

  1. 建立 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
  1. 部署到 EKS
   kubectl apply -f deployment.yaml
  1. 建立負載平衡器服務
  • 使用負載平衡器公開應用程式以供外部存取。
   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
  1. 部署服務
   kubectl apply -f service.yaml

建置和配置 CI/CD 管道

第 1 步:設定 CodePipeline

  1. 建立 CodePipeline 管道
  • 前往AWS CodePipeline並設定階段:
 - **Source** (GitHub)
 - **Build** (CodeBuild)
 - **Deploy** (EKS)
  1. 配置 AWS CodeBuild
  • 為 CodeBuild 定義buildspec.yml以建立 Docker 映像並將其推送到 ECR。
   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
  1. 在 CodePipeline 中設定部署階段
  • 將 EKS 與 CodePipeline 整合以自動化部署。

第 2 步:自動化品質和安全檢查

  1. 亞馬遜程式碼大師
  • CodeGuru Reviewer與 GitHub 集成,對每次提交執行程式碼品質檢查。
  1. AWS 安全中心
  • 啟用Security Hub來監控 AWS 資源中的安全漏洞。
  1. 亞馬遜 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>
  1. EventBridge 自動化規則
  • 建立 EventBridge 規則以根據 CodePipeline 或 Security Hub 事件觸發特定操作(例如 SNS 通知)。

結論

該端到端專案提供了完整的 DevOps 解決方案,用於在 AWS 上建置和部署 Java 應用程式。透過使用程式碼

CI/CD 管道、容器儲存 ECR 和部署 EKS,我們確保可擴展且可靠的操作。此外,CodeGuru、Security Hub 和 SNS 有助於維護程式碼品質、安全性和即時警報,使此設定強大且適合企業使用。

👤 作者

橫幅

加入我們的Telegram 社群||在 GitHub 上關注我以獲取更多 DevOps 內容!


原文出處:https://dev.to/prodevopsguytech/end-to-end-aws-devops-project-automate-java-application-build-and-deployment-on-amazon-eks-5al8


共有 0 則留言