AWS Elastic Beanstalk을 사용해서 웹 애플리케이션 배포하기

본 기사에서는 AWS Elastic Beanstalk 서비스의 개요 설명 후, Node.js의 웹 프레임워크인 Express 애플리케이션을 AWS Elastic Beanstalk을 이용해 배포하고 업데이트하는 실습을 해보도록 하겠습니다.
2021.08.30

안녕하세요, 클래스메서드의 정현재입니다.

이번 블로그에서는 AWS Elastic Beanstalk에 대해서 이야기해보려고 합니다.

온-프레미스 환경에서 하나의 웹 애플리케이션을 개발한다고 가정해보겠습니다. 이 때, 개발자들은 OS의 설치부터 시작해서 각종 네트워크 구성, 웹 애플리케이션 개발, 배포, 유지보수 및 관리까지 모든 작업들을 직접 수행해야합니다. 매우 많은 시간과 수고가 필요하겠죠.

이번에는 클라우드 환경인 Amazon EC2에서 웹 애플리케이션을 개발한다고 가정해보겠습니다. Amazon EC2를 사용하게 되면 OS 설치 등을 할 필요가 없고, 네트워크 구성 작업도 비교적 쉽게 수행할 수 있습니다. 온-프레미스 환경보다 훨씬 효율적으로 작업을 할 수 있겠죠. Amazon EC2를 이용한 작업도 충분히 효율적이라고 할 수 있지만, 여전히 사용할 서버, 플랫폼, 인터프리터 등을 결정하고 설치할 필요가 있습니다.

이러한 작업들까지도 대신 해주어 개발자의 부담을 비약적으로 줄일 수 있는 서비스가 바로 AWS Elastic Beanstalk입니다.

AWS Elastic Beanstalk란?

AWS의 공식 문서에서는 AWS Elastic Beanstalk을 다음과 같이 설명하고 있습니다.

AWS Elastic Beanstalk는 Java, .NET, PHP, Node.js, Python, Ruby, Go 및 Docker를 사용하여 개발된 웹 애플리케이션 및 서비스를 Apache, Nginx, Passenger 및 IIS와 같은 친숙한 서버에서 손쉽게 배포하고 확장할 수 있는 서비스

개발자가 웹 애플리케이션, 모바일 백엔드 등을 개발한 후, Elastic Beanstalk에 코드를 업로드 하기만 하면 그 후의 배포 작업들은 자동으로 처리가 됩니다. 여기서 말하는 배포 작업에는 다음과 같은 작업들이 포함됩니다.

  • 애플리케이션의 배포를 위해 필요한 AWS 리소스들을 생성(EC2, 로드밸런서, 오토스케일링 그룹 등)
  • 애플리케이션의 가동을 위해 필요한 구성 요소 설치 (운영체제, 웹 혹은 애플리케이션 서버, 인터프리터 등)
  • 애플리케이션 모니터링 구성

위와 같은 작업들을 대신해 주기 때문에 개발자는 애플리케이션을 실행하는 인프라에 대해 자세히 알 필요 없이 코드에만 집중하여 개발을 진행할 수 있습니다. 또한, Elastic Beanstalk에 대한 추가 요금이 없고 생성되는 AWS 리소스들에 대한 요금만 지불하면 되기 때문에 비용에 대한 부담도 전혀 없습니다.

Elastic Beanstalk의 워크 플로입니다. 우선, 개발자가 Elastic Beanstalk에 개발한 코드를 업로드 합니다. 그러면 Elastic Beanstalk는 자동으로 필요한 AWS 리소스를 생성하고 애플리케이션을 실행합니다. 이렇게 애플리케이션 실행이 완료되면 개발자는 환경을 직접 관리하고 애플리케이션의 새로운 버전을 배포할 수 있습니다.

그럼 Elastic Beanstalk을 사용하여 웹 애플리케이션을 배포하는 간단한 실습을 해보며 이해를 높여보도록 하겠습니다.

Express 웹 애플리케이션 배포해보기

Express 웹 애플리케이션 생성

우선, Node.js의 Express 웹 프레임워크를 사용해 웹 애플리케이션을 하나 생성합니다. (npm과 node가 설치 되어있는 것을 가정합니다)

npm install -g express-generator

express [project-name]   ## 웹 애플리케이션 프로젝트 생성

cd [project-name]
npm install   ## 의존성 패키지 설치

이렇게 Express 웹 애플리케이션의 생성이 완료되었습니다.

npm start

확인을 위해 위의 커맨드로 웹 서버를 실행시킨 후 http://localhost:3000에 접속해봅니다.

위와 같이 Express 웹 애플리케이션의 기본 화면이 나옵니다.

EB CLI 설치

웹 애플리케이션을 배포하는 작업에서는 EB CLI라는 Elastic Beanstalk 전용 CLI를 사용합니다.

brew install awsebcli

macOS를 사용하시는 분들은 Homebrew를 설치한 후, 위의 명령으로 간단히 EB CLI를 설치할 수 있습니다. macOS를 사용하고 있지 않은 분들은 밑의 링크를 참조하여 EB CLI의 설치를 진행해주시기 바랍니다.

Elastic Beanstalk에 웹 애플리케이션 배포

EB CLI를 사용하면 애플리케이션 배포 작업을 굉장히 간단하게 수행할 수 있습니다.

우선 아까 만든 Express 프로젝트 폴더로 이동한 후, Elastic Beanstalk 환경의 초기화 작업을 진행합니다.

eb init

위의 커맨드를 입력하면 리전, 애플리케이션 이름, 플랫폼, EC2의 SSH 연결 여부 등의 설정 항목들이 나옵니다. 자신이 원하는대로 설정을 해줍니다.

초기화 작업을 완료했다면 이제 Elastic Beanstalk 환경을 생성 후, 애플리케이션을 실행해보겠습니다.

eb create [환경 이름]

환경 생성이 진행되는 동안의 이벤트 로그들이 나오고 조금 기다리면 생성이 완료됩니다.

Elastic Beanstalk 콘솔로 이동하면 다음과 같이 정상적으로 생성이 완료된 것을 확인할 수 있습니다. 생성된 환경의 DNS 주소로 접속해보겠습니다.

정상적으로 Express 애플리케이션의 배포가 완료된 것을 확인할 수 있습니다.

새로운 버전의 애플리케이션 배포

웹 애플리케이션의 코드를 조금 수정해서 새로운 버전을 배포해보도록 하겠습니다. 현재 애플리케이션 버전의 소스코드를 zip 파일로 다운 받아 수정한 후, 다시 zip 파일로 압축을 해서 업로드 하는 방식으로 새로운 버전의 애플리케이션을 배포할 수 있습니다.

Elastic Beanstalk 콘솔에서 현재 실행하고 있는 애플리케이션 버전의 소스코드를 zip 파일로 다운 받습니다. 다운 받은 zip 파일의 압축을 풀고 routes/index.js파일을 다음과 같이 수정합니다.

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Version2' }); /*title을 Express에서 Version2로 수정*/
});

module.exports = router;

Express 애플리케이션의 기본 화면에서의 title을 수정하였습니다. 수정이 완료된 프로젝트를 다시 zip 파일로 압축을 합니다.

Elastic Beanstalk 콘솔에서 현재 실행 중인 환경을 클릭해 대시보드 화면에 접속합니다. 그리고 실행 버전 항목에서 업로드 및 배포 버튼을 누릅니다.

수정한 프로젝트의 zip 파일을 업로드 하고 배포 버튼을 클릭하면 새로운 버전의 애플리케이션이 배포되기 시작합니다. 새로운 버전의 애플리케이션이 제대로 배포 되었는지 확인하기 위해 DNS 주소로 접속해보겠습니다.

다음과 같이 title이 Express에서 Version2로 제대로 바뀌어 있는 것을 확인할 수 있습니다.

마무리

이번 블로그에서는 Elastic Beanstalk에 대해서 이야기해보았습니다.

Elastic Beanstalk에서 애플리케이션의 새 버전을 배포할 때, 다음과 같은 방식을 사용할 수 있습니다.

  • 한 번에 모두
  • 롤링
  • 추가 배치를 사용한 롤링
  • 변경 불가능

그리고 한 번쯤은 들어봤을 법한 Blue/Green 배포 방식도 물론 사용할 수 있습니다. 사실 이번 블로그에서 각 배포 방식에 대한 설명도 쓰려고 했으나...블로그가 너무 길어지고 복잡해질 것 같아서 분할하여 쓰기로 하였습니다!! 다음 블로그에서는 Elastic Beanstalk에서 사용할 수 있는 각 배포 방식에 대한 설명을 드리도록 하겠습니다.

블로그는 이상입니다. 감사합니다