기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
CI/CD 파이프라인을 사용하여 Amazon EKS에 Java 애플리케이션 자동 구축 및 배포
작성자: MAHESH RAGHUNANDANAN(AWS), James Radtke(AWS), Jomcy Pappachen(AWS)
코드 리포지토리: aws-cicd-java-eks | 환경: 프로덕션 | 기술: 컨테이너 및 마이크로서비스, CloudNative DevOps; 현대화 |
워크로드: 기타 모든 워크로드 | AWS 서비스: AWS CloudFormation, AWS, AWS CodeCommit CodePipeline, 아마존 EC2 컨테이너 레지스트리, 아마존 EKS |
요약
이 패턴은 권장 DevSecOps 사례에 따라 자바 애플리케이션을 자동으로 빌드하고 Amazon Web Services (AWS) 클라우드의 Amazon Elastic Kubernetes Service (Amazon EKS) 클러스터에 배포하는 지속적 통합 및 지속적 전송 (CI/CD) 파이프라인을 생성하는 방법을 설명합니다. 이 패턴은 Spring Boot Java 프레임워크로 개발되고 Apache Maven을 사용하는 인사말 애플리케이션을 사용합니다.
이 패턴의 접근 방식을 사용하여 Java 애플리케이션용 코드를 빌드하고, 애플리케이션 아티팩트를 도커 이미지로 패키징하고, 이미지를 보안 스캔하고, 이미지를 Amazon EKS의 워크로드 컨테이너로 업로드할 수 있습니다. 이 패턴의 접근 방식은 긴밀하게 연결된 모놀리식 아키텍처에서 마이크로서비스 아키텍처로 마이그레이션하려는 경우에 유용합니다. 또한 이 접근 방식은 Java 애플리케이션의 전체 라이프사이클을 모니터링하고 관리하는 데 도움이 되므로 자동화 수준을 높이고 오류나 버그를 방지하는 데 도움이 됩니다.
사전 조건 및 제한 사항
사전 조건
활성 상태의 AWS 계정.
AWS Command Line Interface(AWS CLI) 버전 2, 설치 및 구성됨. 이에 대한 자세한 내용은 AWS CLI 설명서에서 AWS CLI 버전 2 설치, 업데이트 및 제거를 참조하십시오.
AWS CLI 버전 2는 Amazon EKS 클러스터를 생성하는 것과 동일한 IAM 역할로 구성해야 합니다. 해당 역할만 다른 IAM 역할을
aws-auth
ConfigMap
에 추가할 권한이 있기 때문입니다. AWS CLI를 구성하는 데 필요한 정보 및 단계는 AWS CLI 설명서의 구성 기본 사항을 참조하십시오.AWS 자격 증명 및 액세스 관리 (IAM) 역할 및 권한 ( CloudFormationAWS에 대한 전체 액세스 권한 포함) 이에 대한 자세한 내용은 AWS CloudFormation 설명서의 IAM을 통한 액세스 제어를 참조하십시오.
EKS 클러스터에 있는 워커 노드의 IAM 역할 이름 및 IAM 역할 Amazon 리소스 이름(ARN)에 대한 세부 정보가 포함된 기존 Amazon EKS 클러스터.
Amazon EKS 클러스터에 설치 및 구성된 Kubernetes Cluster Autoscaler. 자세한 내용은 Amazon EKS 설명서에서 클러스터 자동 규모 조정을 참조하십시오.
GitHub 리포지토리의 코드에 대한 액세스.
중요 정보
AWS Security Hub는 코드에 있는 AWS CloudFormation 템플릿의 일부로 활성화됩니다. 기본적으로 Security Hub가 활성화되면 30일 무료 평가판이 제공되며, 그 이후에는 이 AWS 서비스와 관련된 비용이 발생합니다. 요금에 대한 자세한 내용은 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
아마존 CodeGuru
AWS CodePipeline
Amazon Elastic 컨테이너 레지스트리
Amazon Elastic Kubernetes 서비스
아마존 EventBridge
AWS Security Hub
Amazon Simple Notification Service(SNS)
대상 아키텍처
![""](images/pattern-img/95a5b5c2-d7fb-41eb-9089-455318c0d585/images/4f5fd8c2-2b6d-4945-aa64-fcf317521711.png)
이 다이어그램은 다음 워크플로를 보여줍니다.
개발자는 CodeCommit 리포지토리의 기본 브랜치에서 Java 애플리케이션 코드를 업데이트하여 풀 리퀘스트 (PR) 를 생성합니다.
PR이 제출되는 즉시 Amazon CodeGuru Reviewer는 코드를 자동으로 검토하고 Java 모범 사례를 기반으로 코드를 분석하고 개발자에게 권장 사항을 제공합니다.
PR이 기본 브랜치에 병합된 후 Amazon EventBridge 이벤트가 생성됩니다.
EventBridge 이벤트가 시작되고 CodePipeline 파이프라인이 시작됩니다.
CodePipeline CodeSecurity 스캔 단계 (지속적 보안) 를 실행합니다.
CodeBuild Checkov를 사용하여 Dockerfile 및 Kubernetes 배포 Helm 파일을 스캔하고 증분 코드 변경을 기반으로 애플리케이션 소스 코드를 스캔하는 보안 스캔 프로세스를 시작합니다. 응용 프로그램 소스 코드 스캔은 CodeGuru 리뷰어 명령줄 인터페이스 (CLI) 래퍼를
통해 수행됩니다. 보안 스캔 단계가 성공하면 빌드 단계(지속적 통합)가 시작됩니다.
빌드 단계에서 아티팩트를 CodeBuild 빌드하고, 아티팩트를 Docker 이미지에 패키징하고, Aqua Security Trivy를 사용하여 이미지의 보안 취약성을 스캔하고, 이미지를 Amazon ECR에 저장합니다.
8단계에서 탐지된 취약성은 개발자 또는 엔지니어가 추가 분석을 위해 Security Hub에 업로드됩니다. Security Hub는 취약성 해결을 위한 개요 및 권장 사항을 제공합니다.
CodePipeline 파이프라인 내의 다양한 단계에 대한 이메일 알림이 Amazon SNS를 통해 전송됩니다.
지속적 통합 단계가 완료되면 배포 단계 (지속적 전송) 로 CodePipeline 들어갑니다.
도커 이미지는 차트 Helm을 사용하여 Amazon EKS에 컨테이너 워크로드(포드)로 배포됩니다.
애플리케이션 포드는 Amazon CodeGuru Profiler Agent로 구성되어 있습니다. Amazon Profiler Agent는 애플리케이션의 프로파일링 데이터 (CPU, 힙 사용량, 지연 시간) 를 Amazon CodeGuru Profiler로 전송하여 개발자가 애플리케이션의 동작을 이해하는 데 도움이 됩니다.
도구
서비스
AWS는 AWS CloudFormation 리소스를 설정하고, 빠르고 일관되게 프로비저닝하고, AWS 계정 및 지역 전반의 수명 주기 전반에 걸쳐 리소스를 관리할 수 있도록 지원합니다.
CodeBuildAWS는 소스 코드를 컴파일하고, 단위 테스트를 실행하고, 배포할 준비가 된 아티팩트를 생성하는 데 도움이 되는 완전관리형 빌드 서비스입니다.
CodeCommitAWS는 자체 소스 제어 시스템을 관리할 필요 없이 Git 리포지토리를 비공개로 저장하고 관리할 수 있는 버전 제어 서비스입니다.
Amazon CodeGuru Profiler는 라이브 애플리케이션에서 런타임 성능 데이터를 수집하고 애플리케이션 성능을 미세 조정하는 데 도움이 되는 권장 사항을 제공합니다.
Amazon CodeGuru Reviewer는 프로그램 분석 및 기계 학습을 사용하여 개발자가 찾기 어려운 잠재적 결함을 탐지하고 Java 및 Python 코드 개선을 위한 제안을 제공합니다.
AWS는 소프트웨어 릴리스의 여러 단계를 신속하게 모델링 및 구성하고 소프트웨어 변경 사항을 지속적으로 릴리스하는 CodePipeline 데 필요한 단계를 자동화하도록 지원합니다.
Amazon Elastic Container Registry(Amazon ECR)는 안전하고 확장성이 있고 신뢰할 수 있는 관리형 컨테이너 이미지 레지스트리 서비스입니다.
Amazon Elastic Kubernetes Service (Amazon EKS)는 자체 Kubernetes 컨트롤 플레인 또는 노드를 설치하거나 유지 관리할 필요 없이 Kubernetes를 실행하는 데 도움이 됩니다.
EventBridgeAmazon은 다양한 소스의 실시간 데이터와 애플리케이션을 연결하는 데 도움이 되는 서버리스 이벤트 버스 서비스입니다. AWS Lambda 함수, API 대상을 사용하는 HTTP 간접 호출 엔드포인트 또는 다른 AWS 계정의 이벤트 버스를 예로 들 수 있습니다.
AWS Identity and Access Management(IAM)는 누구에게 인증 및 사용 권한이 있는지 제어하여 AWS 리소스에 대한 액세스를 안전하게 관리할 수 있도록 도와줍니다.
AWS Security Hub는 AWS의 보안 상태에 대한 포괄적인 보기를 제공합니다. 이를 통해 AWS 환경에서 보안 업계 표준 및 모범 사례를 준수하는지 확인할 수도 있습니다.
Amazon Simple Notification Service(Amazon SNS)를 사용하면 웹 서버 및 이메일 주소를 포함하여 게시자와 클라이언트 간의 메시지 교환을 조정하고 관리할 수 있습니다.
Amazon Simple Storage Service(S3)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.
기타 서비스
Helm
은 Kubernetes용 오픈소스 패키지 관리자입니다. Apache Maven
은 소프트웨어 프로젝트 관리 및 이해 도구입니다. BridgeCrew Checkov는
IaC (Infrastructure as Code) 파일을 스캔하여 보안 또는 규정 준수 문제로 이어질 수 있는 구성 오류를 찾아내는 정적 코드 분석 도구입니다. Aqua Security Trivy
는 구성 문제 외에도 컨테이너 이미지, 파일 시스템 및 Git 리포지토리의 취약성에 대한 포괄적인 스캐너입니다.
code
이 패턴의 코드는 리포지토리에서 사용할 수 있습니다. GitHub aws-codepipeline-devsecops-amazoneks
모범 사례
이 솔루션의 모든 단계에서 IAM 엔터티에 대한 최소 권한 원칙이 준수되었습니다. 추가 AWS 서비스 또는 타사 도구를 사용하여 솔루션을 확장하려는 경우 최소 권한 원칙을 따르는 것이 좋습니다.
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을 구성하십시오. |
개발, 프로덕션, UAT 또는 QA 환경이 있는 | DevOps |
차트 Helm에 구문 오류가 있는지 검증하십시오. |
| DevOps 엔지니어 |
작업 | 설명 | 필요한 기술 |
---|---|---|
CI/CD 파이프라인을 생성합니다. |
| AWS DevOps |
작업 | 설명 | 필요한 기술 |
---|---|---|
Aqua Security 통합을 켜십시오. | 이 단계는 Trivy에서 보고한 도커 이미지 취약성 조사 결과를 Security Hub에 업로드하는 데 필요합니다. AWS는 Security Hub 통합을 CloudFormation 지원하지 않으므로 이 프로세스는 수동으로 수행해야 합니다.
| AWS 관리자, DevOps 엔지니어 |
작업 | 설명 | 필요한 기술 |
---|---|---|
Amazon EKS 클러스터에서 헬름 또는 kubectl 명령을 실행할 수 있습니다. CodeBuild | EKS 클러스터에서 Helm 또는 중요: 배포 승인 단계가 시작되기 전에 다음 절차를 완료해야 합니다. CodePipeline
| DevOps |
작업 | 설명 | 필요한 기술 |
---|---|---|
CI/CD 파이프라인이 자동으로 시작되는지 확인합니다. |
를 사용하여 CodePipeline 파이프라인을 시작하는 방법에 대한 자세한 내용은 AWS CodePipeline 설명서에서 파이프라인 시작 CodePipeline, 수동으로 파이프라인 시작 및 일정에 따라 파이프라인 시작을 참조하십시오. | DevOps |
배포를 승인하십시오. |
| DevOps |
애플리케이션 프로파일링 검증. | 배포가 완료되고 애플리케이션 포드가 Amazon EKS에 배포되면 애플리케이션에 구성된 Amazon CodeGuru Profiler 에이전트가 애플리케이션의 프로파일링 데이터 (CPU, 힙 요약, 지연 시간, 병목 현상) 를 Amazon Profiler로 전송하려고 시도합니다. CodeGuru Amazon CodeGuru Profiler는 애플리케이션을 처음 배포할 때 프로파일링 데이터를 시각화하는 데 약 15분이 걸립니다. | AWS DevOps |
관련 리소스
추가 정보
CodeGuru 프로파일러를 기능 측면에서 AWS X-Ray 서비스와 혼동해서는 안 됩니다. CodeGuru 프로파일러는 병목 현상이나 보안 문제를 일으킬 수 있는 가장 비용이 많이 드는 코드 라인을 식별하고 잠재적 위험이 되기 전에 수정하는 데 선호됩니다. AWS X-Ray 서비스는 애플리케이션 성능 모니터링을 위한 서비스입니다.
이 패턴에서 이벤트 규칙은 기본 이벤트 버스와 연결됩니다. 필요한 경우 패턴을 확장하여 사용자 지정 이벤트 버스를 사용할 수 있습니다.
이 패턴은 CodeGuru Reviewer를 애플리케이션 코드에 대한 정적 애플리케이션 보안 테스트 (SAST) 도구로 사용합니다. 이 파이프라인을 Checkmarx와 같은 다른 도구에도 사용할 수 SonarQube 있습니다. 의 스캔 지침 대신 이러한 도구 중 하나에 해당하는 스캔 설정 지침을 추가할 수 있습니다. buildspec/buildspec_secscan.yaml
CodeGuru