반응형

개요

이 포스트는 node.js로 작성되어 있는 AWS 한국 리전 홈페이지의 지속적 전달 파이프라인 생성 예제를 spring boot로 변환해 재 구성해서 포스팅하는 글이다. 이 글에서는 git을 통해 소스를 커밋하게 되면 aws의 CodePipeline을 통해 CodeBuild가 컴파일을 완료하게 되고 이를 다시 Elastic Beanstalk에 배포하는 방식이다. 이때, 필요하다면 사용자 승인을 거쳐야만 배포가 되게 할 수도 있다.

 

 

다루는 내용

1. GitHub 설정

2. 샘플 앱을 배포할 AWS Elastic Beanstalk 환경 생성

3. GitHub의 소스를 빌드하도록 AWS Code Build 구성

4. AWS CodePipeline을 이용한 소스, 빌드 및 지속적 배포 환경 구성

 

 

아키텍처

1. Gradle, Spring Boot, Swagger

2. Github push

3. Spring Boot 코드 --> Github <-- CodePipleline --> CodeBuild --> Approval --> Deploy to Elastic Beanstalk

 

사전 조건

1. PC에 git을 설치해야 하고, git clone, git add, git commit, git push에 대한 기본 개념을 숙지한다.

2. Java Code를 기본적으로는 이해하고 있어야 한다.

3. github 계정을 생성해 둔다.

4. aws 계정을 생성해 둔다.

 

 

Github 레파지토리 구성

본 테스트를 위해 아래의 git repository를 미리 만들어 놓은 본인의 github 계정으로 fork하도록 한다.

https://github.com/sharplee7/basic-codepipeline-demo

fork가 완료되면 https://github.com/[본인계정]/basic-codepipeline-demo 라는 레파지토리가 정상적으로 생성되어 있다.

이 프로그램을 본인의 로컬 PC로 git clone하도록 한다.

 

git clone https://github.com/[본인계정]/basic-codepipeline-demo.git 

basic-codepipleline-demo 응용프로그램은 Spring Boot로 작성된 프로그램으로 2개의 API를 가지고 있다.
/ URL이 호출될 경우 간단한 인사말이 반환되고 /sayHello/{이름} 이 호출될 경우 Hello 이름이 반환된다.
이 프로그램의 호출은 http://ip:5000/ 이다.

지금까지 해서 전체 아키텍처에서 아래 이미지 만큼 구성이 완료되었다.

 

 

Elastic Beanstalk 환경 구성

Elastic Beanstalk은 Salesforce의 heroku와 유사한 AWS의 어플리케이션 배포 서비스이다. Elastic Beanstalk을 사용하게 되면 복잡한 서버구성 없이 단순한 응용프로그램 배포를 통해 코드를 업로드하기만 하면 Elastic Beanstalk가 애플리케이션을 배포, 관리 및 조정하는 서비스이다.

 

AWS 콘솔의 서비스검색에서 elastic beanstalk을 입력해 elastic beanstalk 화면을 오픈하도록 한다.

 

'Create Application'을 클릭해 신규 Beanstalk 애플리케이션을 생성하도록 한다.

Elastic Beanstalk 화면에서 "Create Application"을 클릭해 신규 애플리케이션을 만들도록 한다.

 

웹 앱 생성정보에 아래와 같이 입력하도록 한다.(애플리케이션 이름: BasicCodePipelineDemo)

생성을 클릭하면 아래와 같이 Beanstalk 환경이 구성되기 시작한다.

실제 환경을 준비하는데는 수분이 걸리며 모든 구성이 완료가 되면 아래와 같은 화면을 볼 수 있다.

위 표시된 링크를 클릭해 정상적으로 샘플 프로그램이 배포된 것을 확인하도록 한다.

 

지금까지 작업으로 아래와 같이 Git에 대한 설정이 끝났다.

 

 

AWS CodeBuild 구성

AWS의 CodeBuild는 소스코드를 컴파일하는 기능을 담당한다. Test Code가 있을 경우 Test Code 컴파일 실행의 기능도 담당하게 할수 있다.

1. AWS Console에서 AWS CodeBuild 서비스를 선택해 콘솔을 열도록 한다.

2. '빌드 프로젝트 생성' 버튼을 클릭해 새로운 빌드 프로젝트를 생성하도록 한다.

3. 다음과 같이 입력 혹은 선택하도록 한다. 프로젝트이름 (Build-Basic-Pipeline-Demo)

4. 리포지토리 항목이 OAuth를 사용하여 연결이 선택되어 있는지를 확인하고 GitHub에 연결 버튼을 클릭하도록 한다.
이 의미는 CodeBuild에서 배포할려는 GitHub 계정에 OAuth를 통해 연결하겠다는 의미이다. 선택시 아래와 같은 github 연결을 위한 팝업 창이 뜬다. 'Authorize aws-codesuite'를 클릭한다.

정상적인 인증 절차가 끝나면 아래와 같이 GitHub 레포지토리 URL을 입력하는 화면으로 바뀌게 된다.

 

이때 본인이 github에 fork해서 만든 git repository를 복사해 와서 붙여넣기 한다.(내 경우 https://github.com/sharplee7/basic-codepipleline-demo.git)

5. 환경항목은 아래와 같이 선택하도록 한다.

6. Buildspec 부분을 다음과 같이 작성하도록 한다.

아래의 코드를 복사해 붙여 넣도록 한다.

version: 0.2
phases:
  install:
    runtime-versions:
      java: corretto11
  build:
    commands:
      - ./gradlew build
      - mv build/libs/*.jar app.jar
artifacts:
  files:
    - app.jar

 

7. '빌드 프로젝트 생성' 버튼 클릭

 

지금까지의 작업으로 CodeBuild에 대한 작업이 끝났다.

 

 

CodePipeline 생성

1. AWS의 콘솔창에서 AWS CodePipeline 콘솔을 열도록 한다.

2. '파이프라인 생성' 버튼을 클릭해 파이프라인 생성 화면을 연다.

3. 다음과 같이 입력하도록 한다. (파이프라인 이름: Pipeline-Basic-CodePipeline-Demo)

4. 소스 스테이지 추가 창에서 다음과 같이 선택하도록 한다.

  • 소스 공급자 > GitHub(버전 1) *최근 방식이 변경되어 GitHub(버전2)를 권장하지만 예에선 버전1 방식 사용
  • GitHub에 oAuth 방식을 이용해 로그인해 둘것
  • 리포지토리 선택화면에서 본인이 fork해둔 basic-codepipeline-demo 선택 할 것
  • 브랜치는 master 선택
  • GitHub 웹후크 선택

5. 빌드 스테이지 추가는 다음과 같이 구성할 것

  • 빌드 공급자: AWS CodeBuild
  • 리전 : 서울
  • 프로젝트 이름 : Build-Basic-Pipeline-Demo
  • 빌드 유형: 단일 빌드

6. 배포 스테이지 추가 항목을 다음과 같이 구성하도록 한다.

  • 배포 공급자: AWS Elastic Beanstalk
  • 리전 : 서울
  • 애플리케이션 이름: BasicCodePipelineDemo
  • 환경이름 : 기본값(Basiccodepipelinedemo-env)

7. 리뷰 및 파이프라인 생성

8. 파이프라인 생성 버튼을 클릭하면 파이프라인 구성에 따라 초기 배포가 아래와 같이 진행된다.

 

Pipeline에 의해 모든 상황이 정상적으로 진행완료되면 아래와 같이 모든 값이 all green 상태로 된다.

 

배포된 프로그램 실행해 보기

1. AWS Elastic Beanstatalk 콘솔을 연다.

2. 우리가 만든 어플리케이션 환경(Basiccodepipelinedemo-env)의 URL을 클릭해 프로그램을 실행해 보도록 한다.

3. your beanstalk url/swagger-ui.html을 호출해 api를 테스트해 본다.

4. 만약 502 Bad Gateway 에러를 내면서 정상적인 호출이 되지 않는다면 다음과 같이 Elastic Beanstalk 콘솔에서 환경의 '구성' 메뉴를 클릭하고 아래의 5번과 6번 항목을 진행한다. 단, 화면이 정상 호출되었다면 이 단계는 건너 뛴다.

5. 소프트웨어의 '구성' 버튼을 클릭한다.

6. 환경 속성을 찾아 아래와 같이 SERVER_PORT에 5000을 입력하도록 한다. 그리고 다시 테스트해서 화면이 정상적으로 호출되는 것을 확인한다.

참고) 왜 Spring Boot에서 다른 포트를 지정하면 Bad Gateway 에러가 나는가?

Elastic Beanstalk은 내가 배포한 응용프로그램을 호출하기 위해 앞단에 Nginx가 존재한다. 이Nginx가 호출할때 내부적으로 jar 파일은 5000번으로 애플리케이션을 호출하게 되어 있고 war 파일은 8080으로 호출되게 되어 있다.(아래 그림 참조) 따라서 spring boot에서 jar 파일로 웹 어플리케이션을 만들었다면 5000번으로 포트 번호를 지정하는 것이 맞다. 

 

 

 

파이프라인에 검토 및 승인 단계 생성

위 단계까지 진행만으로 개발자에 의해 코드가 github에 업로드 되면 CodePipeline이 자동으로 webhook을 걸어 변경된 코드를 인지하고 CodeBuild를 통해 컴드를 컴파일 한 후 해당 jar 파일을 Beanstalk에 자동으로 배포할 수 있다.

 

이번 단계에서는 여기에 관리자 승인 프로세스를 추가해 자동으로 배포되는 것이 아니라 관리자에 의한 승인이 있어야 배포하는 단계를 추가하고자 한다.

 

1. CodePipeline 창을 연다.

2. 우리가 생성한 Pipeline-Basic-CodePipeline-Demo를 클릭해 들어가 편집 버튼을 클릭한다.

4. [빌드(Build)] 단계와 [배포(Deploy)] 단계 사이에 있는 흰색 [단계 추가(Add stage)] 버튼을 클릭

5. [단계 이름(Stage name)] 필드에 Review를 입력

6. 주황색 [단계 추가(Add stage)] 버튼을 클릭

7. [검토(Review)] 단계에서 흰색 [작업 그룹 추가(Add action group)] 버튼을 클릭

8.[작업 이름(Action name)] 아래에 Manual_Review를 입력

9. [작업 공급자(Action provider)]에서 [수동 승인(Manual approval)]을 선택

10. 나머지 항목들은 비워두고 완료 버튼 클릭

11. 페이지 상단의 저장 버튼을 클릭해 저장하고 빠져나온다.

12. 로컬 PC의 프로그램 소스에 다음과 같이 수정을 가해보자

원본 소스
수정된 소스

13. 코드 수정이 완료되었다면 다음의 git 명령어를 통해 변경내용을 github에 push 한다.

  • git add .
  • git commit -m "add review"
  • git push origin master

14. 로컬에서 변경한 프로그램 소스를 GitHub에 반영하면 자동으로 Pipe라인이 인식해 소스를 끌고와 빌드를 진행한다.

15. 전체 파이프라인 상에서 빌드까지 완료된 후 Manual_Review 상태에 검토 버튼이 활성화 된것을 볼수 있다.

16. 검토 창이 뜨면 간단한 코맨트를 입력 후 승인 버튼을 클릭한다.

17. 모든 파이프라인이 성공 종료된 것을 볼수 있다.

18. 다시 Elastic Beanstalk 콘솔을 열어 새로 배포된 응용프로그램의 URL호출해 보도록 한다.

 

19. 변경된 페이지가 호출되는 것을 확인한다.

 

 

이것으로 간단히 GitHub와 CodeBuild, CodePipleline을 연동해 Elastic Beanstalk에 배포하는 것을 알아 보았다.

 

이 포스팅에서 사용한 git 의 주소는 다음과 같다.

 

GitHub - sharplee7/basic-codepipeline-demo: simple demo project for aws CodePipeline

simple demo project for aws CodePipeline. Contribute to sharplee7/basic-codepipeline-demo development by creating an account on GitHub.

github.com

 

이번 포스팅은 여기까지 끝!

반응형

+ Recent posts