본문으로 건너뛰기
  1. Posts/

NCP(Naver Cloud Platform) 를 이용한 인프라 구성하기 1편. Auto Scaling과 Load Balancer 구성

NineKoo9
작성자
NineKoo9
목차

CI/CD 와 무중단 배포 인프라를 NCP을 이용해 구성해보았습니다. 공식문서와 여러 블로그도 참고해 보았지만, NCP 관련 정보가 AWS에 비해 부족함이 많아 NCP을 이용한 인프라를 구성하는 분들께 도움이 되고자 합니다.

특히, Docker 없이 전통적 하이퍼바이저 기반의 인프라를 구성하고자 하는 분들께 참고가 되길 바라며, NCP의 Auto Scaling과 Load Balancer, SourceDeploy, Object Storage CLI을 Jenkins에서 사용하는 방법을 구성해 보겠습니다.

1. VPC 구성.
#

가장 먼저 시작해야할 것은 VPC을 구성하는 것입니다.

VPC의 IP 대역은 임의로 172.16.0.0/16으로 설정했습니다.

VPC를 생성하면 자동으로 Network ACL이 생성됩니다. 일종의 방화벽과 같은 역할을 하며, 기본적으로는 모든 트래픽을 허용하기에 따로 설정을 하지는 않겠습니다.

2. Public Subnet 구성.
#

이제 VPC 를 세분화 하며 서브넷을 만들어줍니다. 보안을 위해 Private 서브넷을 구성해도 되지만 편의를 위해 우선 Public 서브넷을 생성합니다. VPC의 IP 대역 172.16.0.0/16 을 세분화해서 서브넷 영역은 172.16.1.0/24로 설정했습니다.

3. Server 생성.
#

이젠 서버를 생성할 차례이지만… 여기서 생성할 서버는 나중에 Auto Scling Group을 위한 서버의 이미지를 만들기 위해 임시로 서버를 생성합니다.

서버 이미지의 운영체제는 원하시는 것으로 선택하면 됩니다. 저는 여기서 Ubuntu 22.04를 선택했습니다.

VPC와 Subnet은 앞에서 만들었던 것들을 선택합니다.

인증키를 생성해서 다운로드 받습니다.

ACG을 설정하기 위해서, ACG을 생성해줍니다.

저는 이미 만들어놓은 ACG가 존재해서 기존의 것을 사용했습니다.

여기서 중요한 것은 inboud 규칙과 outbound 규칙을 설정해줘야 합니다. ACG의 기본정책은 Network ACL과 다르게 모든 트래픽을 차단합니다. 따라서 허용할 IP 대역을 설정해 줍니다. 저는 Public Subnet 대역인 172.16.0.0/16과 저의 로컬 IP 주소를 Inboud, OutBound 모두 동일하게 설정했습니다.

ACG을 생성하고 선택한 다음 최종적으로 서버를 생성해줍니다.

4. 배포할 프로젝트 준비.
#

@RestController
public class HealthCheckController {
    @GetMapping("/")
    public ResponseEntity<String> healthCheck() {
        return new ResponseEntity<>("OK", HttpStatus.OK);
    }
}

여기서 주의할 점.
#

Spring 프로젝트에서 반드시 로드밸런스의 헬스 체크를 위한 API가 존재해야 합니다. 저는 위의 엔드포인트를 따로 구성했습니다. URL로 설정한 “/” 주소를 기억하고 나중에 로드밸런스를 설정할 때 등록해 주어야 합니다.

본인의 로컬 컴퓨터에서 Spring 프로젝트를 빌드합니다.

이제 빌드한 파일을 생성한 서버로 전달해야하지만… 이때, 생성한 NCP 서버의 관리자 비밀번호가 필요합니다.

NCP의 서버를 생성할 때 다운로드 되었던 ???.pem 파일을 붙여넣습니다.

자, 이제 파일을 전송해 봅시다.

scp ${your_project_path}/${file_name} 관리자이름@공인IP:가상서버에 저장할 위치

위의 명령어를 본인의 상황에 맞게 입력해줍니다. 가상서버의 주소는 프로젝트 생성할 때 만든 공인IP주소입니다.

오른쪽 하단에 100%가 나타나면 정상적으로 전송이 되었고 만약, 아무것도 나타나지 않았다면 전송에 실패한 것이니 다시 한번 살펴보시기 바랍니다.

5. 생성한 서버에 접속
#

이제 생성한 서버의 공인 IP주소를 통해 서버에 접속해 봅니다.

터미널에서 ssh root@${공인IP주소} 를 입력합니다.

파일을 확인해보면 로컬PC에서 전송한 프로젝트 파일이 있는 것을 확인할 수 있습니다.

테스트겸 프로젝트 파일을 실행해 보았으나, 설치된 Java가 없다고 나타납니다. 본인 프로젝트에서 설정한 Java를 설치하고 테스트겸 실행해 봅니다.

아마 스프링 프로젝트면 데이터베이스 연결이 필요할텐데, 이 부분은 따로 설정해주셔야 에러가 안 나타납니다..!

추가로 SourceDeploy을 사용하기 위함.
#

https://guide.ncloud-docs.com/docs/devtools-devtools-4-4#2%EC%84%A4%EC%B9%98%EB%AA%85%EB%A0%B9%EC%96%B4%EC%9E%91%EC%84%B1

나중에 SourceDeploy을 사용할려면 꼭 필요한 부분이라 위의 링크로 접속하셔서 SourceDeploy용 Agent을 설치해줍니다.!

6. 로드밸런스 생성.
#

우리는 프로젝트에서 http을 이용한 통신을 할 것 이기에 애플리케이션 로드밸런서를 선택합니다.

로드밸런스는 기존의 Public 서브넷과 별도의 로드밸런스용 서브넷이 필요합니다. 서브넷 생성버튼을 눌러 앞에서 했던것 처럼 로드밸런스용 서브넷을 생성합니다.

로드밸런스가 처리할 Http 프로토콜의 포트번호인 80번을 열어줍니다.

다음 단계로 넘어가니 Target Group이 필요합니다. 버튼을 클릭해서 Target Group을 생성해 줍니다.

프로토콜은 Http로 설정하고 Spring 프로젝트는 주로 8080포트번호를 사용하니 위와 같이 설정합니다.

이제 헬스 체크를 설정합니다. 헬스 체크 역시 http 프로토콜을 선택하고 spring 프로젝트의 8080 포트를 선택합니다. 여기서 URl Path는 프로젝트의 헬스 체크용 엔드포인트 주소를 입력합니다.

이 글을 따라오셨다면, 아마 생성했던 서버하나가 나타날 것입니다. 하지만 저희는 Auto Scaling Group에 로드밸런스를 설정할 것이기에 선택하지 않고 넘어가도 됩니다. 이 부분은 나중에 Auto Scaling Group을 생성하고 설정하겠습니다.

6. 이제 Auto Sacling 을 적용해 봅시다.
#

6.1 Launch Configuration 생성
#

Java 와 프로젝트 파일이 설정된 NCP 서버를 선택하고 “내 서버 이미지 생성"을 해줍니다.

Auto Scaling을 사용하기 위해서는 템플릿 역할을 하는 Lanuch Configuration을 생성해야합니다.

내 서버 이미지 탭으로 들어가서 방금전 만들었던 서버 이미지를 선택합니다.

이때 스프링 프로젝트를 실행할 init Script가 필요해서 init Script을 생성해줍니다.

nohup java -jar /root/deploy/nutridiary-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod > /root/deploy/output.log 2>&1 &

스프링 프로젝트를 백그라운드에서 실행하도록 스크립트를 작성합니다.

Launch Configuration 까지 생성했다면, 이제 Auto Scaling Group을 생성합니다.

6.2 Auto Scaling Group 생성
#

이름을 설정하고 지금까지 만들었던 VPC, Subnet 그리고 원하는 인스턴의 용량을 설정해 줍니다. 그리고 헬스 체크 유형에는 로드밸런서를 선택하고 앞에서 만들었던 Target Group을 선택합니다.

스케일아웃 정책이나 알림 통보는 원하시는 대로 하셔도 됩니다. 저는 우선 나중에 설정으로 모두 선택했습니다.

7. 로드밸런스 Target Group 연결
#

이제 생성된 Auto Scaling Group의 인스턴스를 로드밸런스 Target Group 설정에 들어가서 추가해 줍니다.

잠시후 헬스체크를 확인했을 때 Target Status와 Target Response가 위와 같이 나타나면 연결이 완료되었습니다.

그리고 로드밸런스의 접속정보를 도메인으로 API요청을 보내면 정상적으로 작동하는 것을 확인할 수 있습니다. (공인 IP 주소로 접근해도 됩니다.)

NCP를 이용한 인프라 구성하기 2편. Jenkins와 SourceDeploy을 이용한 CI/CD와 무중단 배포 구성