1. 서버 운영의 복잡함

서버를 운영해본 사람들은 알겠지만 서버 하나를 운영하는데는 정말 많은 과정이 필요하다. 예를 들어서 스프링 부트로 웹 애플리케이션을 개발했다면 이를 실행하기 위해서 서버에 자바도 설치해줘야하고, 주기적으로 버전도 업데이트 해줘야한다.

 

또한 배포한 애플리케이션에 버그가 있다면 빠르게 장애를 처리해서 배포하거나, 이전 버전으로 롤백을 해줘야한다. 그리고 서버가 잘 동작하고 있는지도 모니터링을 해야한다.

 

위에서 얘기한 내용만 정리해도 아래와 같은 것들을 개발자가 신경써야한다.

  • install
  • upgrade
  • rollback
  • monitoring

 

이러한 일들을 플랫폼이 알아서 해준다면 개발 생산성을 크게 향상 시킬 수 있을 것 이다.

 

2. AWS Elastic Beanstalk 구축

AWS의 Elastic Beanstalk가 바로 이러한 일들을 도와주는 플랫폼이다. 아래 나열한 플랫폼을 지원한다.

  • Java, .NET, Node.js, Python,Ruby, Go, Docker, php

위의 플랫폼 중에서 하나를 선택하고 만들면 해당 플랫폼이 서버에 자동으로 설치된다.

 

먼저 이해할 개념이 두개가 있다.

  • application : 우리가 만든 앱
  • environment : 환경은 우리가 만든 앱이 돌아갈 환경. (개발, 운영 등)

 

먼저 aws elastic beanstalk 화면으로 들어가자. 그러면 왼쪽에 환경과 애플리케이션이 있을텐데 먼저 애플리케이션을 생성해야한다. create application을 누르자.

 

다음과 같은 화면이 나타나는데 "helloworld-web-app" 이라는 애플리케이션을 만들도록하겠다.

 

이제 플랫폼을 선택한다. 아마존 리눅스 2에서 동작하는 Java 플랫폼을 선택해준다. 

이제 로컬에서 hello world를 출력해주는 웹 애플리케이션을 .jar파일로 만들어서 배포하도록 선택한다. 스프링 부트 기반으로 마는 hello world 애플리케이션의 코드를 간단히 봐보면 애플리케이션 루트로 이동했을 경우 "hello world"를 출력해주고, /profile 경로를 호출하면 현재 실행중인 profile을 반환해주는 간단한 애플리케이션이다. 이 애플리케이션을 만드는 과정은 생략하겠다. 

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {

    @Value("${spring.profiles.active:}")
    private String activeProfile;

    @GetMapping("/")
    public String helloWorld() {
        return "hello world";
    }

    @GetMapping("/profile")
    public String profile() {
        return activeProfile;
    }
}

 

애플리케이션 코드는 코드 업로드를 선택하고, 소스 코드 오리진을 로컬 파일을 선택한 후 파일 선택을 눌러서 내가 만든 .jar 파일을 올려준다. 

 

다음으로 "추가 옵션 구성" 버튼을 클릭한다.

 

우선 구성 사전 설저을 하는데, 단일 인스턴스로 돌릴 수도 있고, 고가용성을 누르면 로드밸런서를 자동으로 만들어준다.

 

다음으로 소프트웨어 편집 버튼을 누른다.

그리고 환경 속성에서 실행한 애플리케이션의 서버 포트를 5000번으로 지정하고 profile이 prod라고 명시 후 저장한다. 서버 포트의 경우 elastic beanstalk로 만들 때 생성되는 nginx가 서버 내부의 5000번 포트와 연결되기 때문이다. 따라서 5000번 포트로 실행해야 우리가 배포할 애플리케이션이 정상적으로 동작된다.

이제 인스턴스를 설정해주겠다. 인스턴스의 편집 버튼을 클릭해준다.

인스턴스의 보안 그룹을 선택 후 저장한다.

 

다음은 용량인데 여기서는 인스턴스 유형을 선택할 수 있다. 이 쪽은 사용하려는 애플리케이션 규모에 따라서 각자 선택해주면 될꺼 같다. 나는 t2.micro와 t2.nano 로 한번 테스트해보려고한다.

 

다음은 롤링 업데이트와 배포쪽인데 여기는 배포 전략을 설정하는 곳 이다. 배포 방식이 "한번에 모두", "변경 불가능"이 있는데 각각이 먼지 공부 후 정리가 필요할꺼 같다.

 

다음은 보안이다. 여기서는 EC2 키 페어를 선택할 수 있는데 ec2 인스턴스에 직접 들어갈 일이 있으면 설정해주면된다.

 

이런식으로 환경 구성을 해보고 맨 아래에 앱 생성을 누른다. 그러면 다음 처럼 환경이 만들어지는 것을 볼 수 있다.

 

환경 구성이 끝나면 다음과 같이 화면이 뜨고 상태 체크도 확인 상태인걸 볼 수 있다.

 

이제 elastic beanstalk를 구성하면서 자동으로 만들어진 url로 접근해보자. 다음과 같이 hello world가 출력되는 것을 볼 수 있다.

 

생성된 url에서 profile을 확인해보면 환경 속성에 prod로 적용한게 잘 반영된 것을 볼 수 있다.

 

새로운 버전을 배포해보고 싶으면 애플리케이션 버전에 .jar 파일을 버전을 명시해서 같이 올려주고 업로드하면 된다. 만약 롤백이 필요하면 이전에 배포한 .jar 파일을 다시 업로드하면 된다.

 

이번 포스팅에서는 .jar 파일로 수기로 배포하는 것을 해봤는데, 배포할 때 마다 .jar 파일을 만들어서 배포하는 것은 엄청나게 번거롭다. 다음 포스팅에서는 github action을 통해서 자동으로 배포되도록 하는 것을 구축해보자

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기