AWS

AWS CodeSeries를 활용한 CI/CD 구축

moonganzi 2023. 7. 3. 17:59

CI/CD는 지속적인 통합(Continuous Integration)과 지속적인 배포(Continuous Deployment/Delivery)의 약어입니다.

이는 소프트웨어 개발 프로세스에서 자동화된 방식으로 개발, 테스트, 배포를 수행하는 방법론입니다.

CI/CD를 사용하는 이유는 여러 가지가 있습니다. 가장 중요한 이유 중 하나는 개발 프로세스의 효율성을 높이는 데 있습니다. CI/CD는 코드 변경 사항을 자동으로 통합하고, 테스트하고, 배포하여 개발자들이 더 빠르게 소프트웨어를 개발하고 배포할 수 있게 합니다. 이를 통해 개발자들은 코드 품질을 더 높일 수 있으며, 문제를 더 빨리 식별하고 해결할 수 있습니다.

이 CI/CD를 AWS를 통해 구축하면 다양한 도구와 서비스를 활용할 수 있으며, 클라우드 플랫폼의 확장성과 가용성을 제공합니다.

 

그렇다면 실습을 통해 AWS CodeSeries를 활용한 CI/CD 구축을 진행해보도록 하겠습니다.

 

- 참고 문서 : https://catalog.us-east-1.prod.workshops.aws/workshops/ef1c179d-8097-4f34-8dc3-0e9eb381b6eb/en-US/20-java

 

Workshop Studio

 

catalog.us-east-1.prod.workshops.aws


실습 아키텍처 및 시나리오

AWS CI/CD 아키텍처

  1. 개발자가 CodeCommit에 코드를 푸시하면 CodePipeline에서 이를 트리거로 인식하여 작동합니다.

  2. 코드 변경 사항을 감지하여 CodeBuild에서 배포 가능한 아티팩트로 빌드 후 S3에 저장합니다.

  3. CodeDeploy에서 S3에 저장된 아티팩트를 확인하고 EC2에 배포합니다.

 

실습 진행해보기

Cloud9

Cloud9은 브라우저만으로 코드를 작성, 실행 및 디버깅할 수 있는 클라우드 기반 통합 개발 환경(IDE) 입니다.

널리 사용되는 프로그래밍 언어를 위한 필수 도구와 사전 설치된 AWS 명령줄 인터페이스(CLI)가 사전 패키지로 제공되므로 이번 실습의 개발 환경으로 사용 해보겠습니다.

 

- Cloud9 생성

1. AWS 콘솔에서 Cloud9 대시보드에 접속합니다.

2. 환경 생성을 클릭합니다.

3. 이름을 입력 한 뒤 나머지는 기본값으로 둔 후 생성을 클릭합니다.

 

AWS CDK를 사용한 인프라 생성

AWS Cloud Development Kit(AWS CDK)는 친숙한 프로그래밍 언어를 사용하여 클라우드 애플리케이션 리소스를 모델링하고 프로비저닝하는 오픈 소스 소프트웨어 개발 프레임워크입니다. 이 워크숍에서는 TypeScript를 실행하여 다음 AWS 리소스를 프로비저닝합니다.

 

- CDK 애플리케이션 준비

1. Cloud9 환경에서 터미널 창을 엽니다. CDK 애플리케이션 소스를 다운로드하고 애플리케이션을 개발 환경에 추출합니다.

curl -s https://static.us-east-1.prod.workshops.aws/public/8c4076ba-a416-424d-acc7-06e5cc2de102//static/20-infrastructure/InfrastructureApp.tgz | tar -xzv
cd InfrastructureApp

2. CDK 애플리케이션 종속성을 설치하고 CDK 프로젝트를 빌드합니다.

npm install
npm run build

- CDK 부트스트랩

CDK를 계정 및 지역으로 부트스트랩합니다. 이는 AWS 계정의 CDK 배포를 지정된 리전에 허용하는 데 필요한 리소스를 생성하는 일회성 작업입니다.

 

1. cdk bootstrap 을 입력합니다. 계정과 지역을 부트스트랩했음을 나타내는 CDK의 메시지가 표시되어야 합니다.

- CDK 배포

계정 및 지역에 CDK 애플리케이션을 배포합니다.

 

1. 아래와 같이 입력합니다.

cd ~/environment/InfrastructureApp
cdk deploy

2. 배포 완료 시 아래와 같은 아키텍처의 인프라가 배포된 상태입니다.

 

CodeCommit

CodeCommit은 안전한 GIt 기반의 리포지토리를 클라우드 기반으로 제공하는 완전 관리형 소스 제어 서비스입니다.

CodeCommit을 사용하여 Git 리포지토리를 생성해보겠습니다.

 

- CodeCommit 생성

1. AWS 콘솔에서 CodeCommit 대시보드에 접속합니다.

2. 리포지토리 생성을 클릭합니다.

3. 리포지토리 이름 필드에 원하는 이름을 (ex. DemoApp) 을 입력합니다.

4, 생성 선택합니다.

 

- CodeCommit 리포지토리 연결

로컬 컴퓨터 역할의 Cloud9에 CodeCommit 리포지토리를 연결합니다.

 

1. 생성한 DemoApp 리포지토리 선택 후 URL 복제 버튼을 선택한 다음 HTTPS 복제를 선택합니다.

2. 앞서 생성한 Cloud9에서 터미널 창을 엽니다.

3. 디렉터리를 environment 디렉터리로 변경하고 방금 복사한 복제 URL을 사용하여 Git 리포지토리를 복제합니다.

cd ~/environment
git clone <your repository URL>

4. 빈 리포지토리를 복제했다는 경고 메시지가 표시됩니다. 비어 있는 새 리포지토리를 데모 Java 애플리케이션으로 채웁니다.

curl -s https://static.us-east-1.prod.workshops.aws/public/8c4076ba-a416-424d-acc7-06e5cc2de102//static/30-source/DemoApp.tgz | tar -xzv
cd DemoApp

5. 초기 커밋을 하기 전에 이름과 이메일 주소로 Git을 구성합니다.

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

6. 변경 사항을 로컬 Git 리포지토리에 커밋하고 변경 사항을 CodeCommit 호스팅 리포지토리로 푸시합니다.

git add .
git commit -m "Initial commit"
git push

 

CodeBuild

CodeBuild는 클라우드상의 완전관리형 빌드 서비스입니다. 소스 코드를 컴파일하고 단위 테스트를 실행하며 배포 준비가 완료된 아티팩트를 생성합니다.

실습의 애플리케이션을 배포하기 전에 배포 가능한 아티팩트로 빌드해야 합니다. Java 웹 앱의 경우 해당 아티팩트는 WAR 파일이라고도 하는 웹 애플리케이션 아카이브입니다.

 

- CodeBuild 프로젝트 생성

1. AWS 콘솔에서 CodeBuild 대시보드에 접속합니다.

2. 빌드 프로젝트 생성을 클릭합니다.

3 프로젝트 이름 에 DemoApp을 입력합니다.

4. 소스 에서 아래와 같이 선택합니다.

5. 환경 에서 아래와 같이 선택합니다.

6. 빌드 에서 buildspec 파일 사용을 선택 합니다.

7. 아티팩트 에서 아래와 같이 입력합니다. 사전에 생성한 버킷 이름을 선택합니다.

- BuildSpec 추가

BuildSpec 은 CodeBuild가 빌드를 실행하는 데 사용하는 YAML 형식의 빌드 명령 및 관련 설정의 모음입니다. BuildSpec이 없으면 빌드 입력을 빌드 출력으로 성공적으로 변환하거나 빌드 환경에서 빌드 출력 아티팩트를 찾아 출력 버킷에 업로드할 수 없습니다.

 

1. Cloud9 환경에서 DemoApp 리포지토리에 buildspec.yml 파일을 다음 내용으로생성합니다.

version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto8
  build:
    commands:
      - mvn install
artifacts:
  files:
    - target/javawebdemo.war
    - appspec.yml
    - scripts/**/*
  discard-paths: no

2. 변경 사항을 로컬 Git 리포지토리에 커밋하고 변경 사항을 CodeCommit 호스팅 리포지토리로 푸시합니다.

- BuildSpec 확인

1. CodeBuild 대시보드 접속 후 DemoApp 프로젝트를 선택합니다.

2. 빌드 시작을 클릭합니다.

 

3. 상태가 진행 중에서 성공 으로 진행되는지 확인합니다.

4. 상태가 성공이라면, 버킷에 저장된 아티팩트를 확인할 수 있습니다.

 

CodeDeploy

CodeDeploy는 Amazon EC2 인스턴스, 온프레미스 인스턴스, 서버리스 Lambda 함수 또는 Amazon ECS 서비스로 애플리케이션 배포를 자동화하는 배포 서비스입니다.

빌드가 성공하여 WAR 파일이 있으므로 테스트 EC2 인스턴스에서 실행되는 서버에 애플리케이션을 배포할 수 있습니다.

 

- 애플리케이션 및 배포 그룹 만들기

1. CodeDeploy 대시보드에 접속합니다.

2. 애플리케이션 생성 을 클릭합니다.

3. 애플리케이션 구성을 아래와 같이 입력 후 애플리케이션 생성 을 클릭합니다.

4. 생성 된 DemoApp 애플리케이션 선택 후 배포 그룹 생성 을 클릭합니다.

5. 배포 그룹 이름Development 를 입력합니다.

6. 서비스 역할AWS CodeDeploy가 대상 인스턴스에 액세스하도록 허용하는 CodeDeploy 권한이 있는 서비스 역할을 입력해야 합니다. IAM 대시보드에 접속합니다.

7. 좌측의 역할 선택 후 역할 만들기를 클릭합니다.

8. 신뢰할 수 있는 엔터티 선택에서 아래와 같이 선택 후 다음을 클릭합니다.

9. 권한 추가 페이지에는 사용 사례에 대한 올바른 권한 정책이 표시됩니다. 다음을 선택합니다.

10. 역할 이름을 DemoApp-CodeDeployServiceRole 와 같이 설정하고 역할 생성 을 클릭합니다.

11. 배포 그룹 생성 으로 돌아와 서비스 역할에 방금 생성한 DemoApp-CodeDeployServiceRole 을 선택합니다.

12. 배포 유형 에서 현재 위치 를 선택합니다.

13. 환경 구성 에서 Amazon EC2 인스턴스 체크, 키와 값에 EC2에 설정돼있는 App, DemoApp을 각각 입력합니다.

14. AWS Systems Manager를 사용한 에이전트 구성배포 설정은 그대로 둔 후 로드 밸런서 에서 로드 밸런싱 활성화 를 체크 해제 합니다. 그 후 배포 그룹 생성을 클릭합니다.

 

AppSpec 추가

AppSpec 은 CodeDeploy에서 배포를 관리하는 데 사용하는 YAML 형식 또는 JSON 형식의 파일입니다.

 

1. Cloud9 환경에서 DemoApp 리포지토리에 다음 콘텐츠로 appspec.yml 파일을 생성합니다.

version: 0.0
os: linux
files:
  - source: /target/javawebdemo.war
    destination: /tmp/codedeploy-deployment-staging-area/
  - source: /scripts/configure_http_port.xsl
    destination: /tmp/codedeploy-deployment-staging-area/
hooks:
  ApplicationStop:
    - location: scripts/stop_application
      timeout: 300
  BeforeInstall:
    - location: scripts/install_dependencies
      timeout: 300
  ApplicationStart:
    - location: scripts/write_codedeploy_config.sh
    - location: scripts/start_application
      timeout: 300
  ValidateService:
    - location: scripts/basic_health_check.sh

2. 변경 사항을 로컬 Git 리포지토리에 커밋하고 변경 사항을 CodeCommit 호스팅 리포지토리로 푸시합니다.

3. 배포를 테스트할 준비가 되었을 때 S3에 저장된 배포 아티팩트에 appspec.yml 파일이 포함되도록 애플리케이션의 새 빌드를 트리거합니다. CodeBuild 대시보드에 접속합니다.

4. DemoApp 프로젝트 선택 후 빌드 시작을 클릭합니다.

 

배포 확인

CodeDeploy 콘솔을 사용하여 배포를 시작하여 애플리케이션 및 사양을 확인합니다.

 

1. CodeDeploy 대시보드에 접속합니다.

2. 애플리케이션  선택한 다음 DemoApp 을 선택한 다음 Deployment 배포 그룹을 선택합니다.

3. 배포 생성 을 클릭합니다.

4. 배포 설정 에서 개정 위치 에 CodeBuild 프로젝트 생성 단계에서 설정한 아티팩트 위치를 입력합니다,

5. 나머지는 기본값으로 둔 후 배포 만들기 를 클릭합니다.

6. 배포 상태가 성공이 된 것을 확인 후, 브라우저에서 웹 애플리케이션을 로드하여 배포를 확인합니다.

 

CodePipeline

CodePipeline은 소프트웨어 릴리스에 필요한 단계를 모델링, 시각화 및 자동화하는 데 사용할 수 있는 지속적 전달 서비스입니다.

빌드 프로젝트 및 배포를 빌드하고 확인했으므로 소스 리포지토리에서 테스트 서버로 변경 사항을 이동하는 파이프라인을 구성할 준비가 되었습니다. 바로 생성해보겠습니다.

 

- Pipeline 생성

1. CodePipeline 대시보드에 접속합니다.

2. 파이프라인 생성 을 클릭합니다.

3. 파이프라인 이름에 DemoApp 을 입력합니다.

4. 서비스 역할 에서 새 서비스 역할 선택 후 다음을 클릭합니다.

5. 소스 스테이지 추가 에서 앞서 만든 CodeCommit 을 선택 후 다음을 클릭합니다.

6. 빌드 스테이지 추가 에서 앞서 만든 CodeBuild 를 선택 후 다음을 클릭합니다.

7. 배포 스테이지 추가 에서 앞서 만든 CodeDeploy 를 선택 후 다음을 클릭합니다.

8. 항목을 검토하고 파이프라인 생성을 선택합니다 .

 

- 파이프라인 확인

브라우저에서 웹 애플리케이션을 로드하여 배포를 확인합니다. 

 

1. Cloud9 IDE를 열고 편집기에서 DemoApp/src/main/webapp/WEB-INF/pages/index.jsp를 엽니다. 제목을 알아볼 수 있는 것으로 변경하고 파일을 저장합니다.

2. 변경 사항을 로컬 Git 리포지토리에 커밋하고 변경 사항을 CodeCommit 호스팅 리포지토리로 푸시합니다.

cd ~/environment/DemoApp
git add .
git commit -m "Change title"
git push

3. 파이프라인이 새 개정을 감지하고 파이프라인 단계를 진행하는지 확인하십시오. 배포가 성공하면 브라우저를 다시 로드하고 업데이트된 제목을 확인합니다.


이상으로 AWS CodeSeries를 활용한 CI/CD 구축을 해보았습니다.

 

AWS WorkShop이 잘돼있어 무리없이 따라할 수 있었습니다.

 

Jenkins, Github Action 과 같은 다른 CI/CD 툴도 AWS 환경에서 사용 가능하니 원하는 프로그램을 사용하여 CI/CD 구축을 진행해보시는 것도 좋을 듯 합니다.

 

감사합니다.