在此專案中,我們將使用 AWS 服務透過持續整合和持續部署 (CI/CD) 管道在 Amazon Elastic Kubernetes Service (EKS) 上建置和部署 Java 應用程式。每個 AWS 元件都有助於實現可靠的開發營運工作流程,因此本指南對於希望在 AWS 上建立可擴展解決方案的開發營運工程師非常有用。
該專案旨在自動化基於 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 儲存庫。
具有用於容器化的 Dockerfile 的Java 應用程式(最好是微服務應用程式)。
Docker 安裝用於本機容器化任務。
下面是一個範例架構圖,表示 AWS 上的 CI/CD 管道和部署環境:
FROM openjdk:11-jdk
WORKDIR /app
COPY . /app
RUN ./gradlew build
CMD ["java", "-jar", "build/libs/your-app.jar"]
導航至AWS CodePipeline並建立新管道。
對於來源提供者,選擇GitHub並授權 AWS 存取您的儲存庫。
選擇要監視變更的分支(例如,主分支)。
Amazon Elastic Container Registry (ECR) 是一個完全託管的容器註冊表。我們將在這裡儲存 Java 應用程式的 Docker 映像。
aws ecr create-repository --repository-name my-java-app --region <your-region>
aws ecr get-login-password --region <your-region> | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com
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
Amazon Elastic Kubernetes Service (EKS) 在 AWS 上提供託管 Kubernetes 集群,我們將使用它來部署和管理應用程式容器。
aws eks create-cluster --name my-eks-cluster --region <your-region> --kubernetes-version 1.21 --role-arn <eks-role-arn>
aws eks update-kubeconfig --region <your-region> --name my-eks-cluster
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
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
- **Source** (GitHub)
- **Build** (CodeBuild)
- **Deploy** (EKS)
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
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>
該端到端專案提供了完整的 DevOps 解決方案,用於在 AWS 上建置和部署 Java 應用程式。透過使用程式碼
CI/CD 管道、容器儲存 ECR 和部署 EKS,我們確保可擴展且可靠的操作。此外,CodeGuru、Security Hub 和 SNS 有助於維護程式碼品質、安全性和即時警報,使此設定強大且適合企業使用。
加入我們的Telegram 社群||在 GitHub 上關注我以獲取更多 DevOps 內容!