Elastic Beanstalk에서는 .NET, Docker, Go, Java, Node js, PHP. Python, Ruby, Tomcat, GlassFish 와 같은 플랫폼을 지원합니다. 이번 Hands On에서는 Node.js 와 Python(Django)를 사용하여 웹 애플리케이션을 배포해 보도록 하겠습니다.
AWS Console을 활용하여 Elastic Beanstalk를 배포하기 위해서 기본으로 VPC에 대한 이해와
EC2 Instance에 대한 이해가 있으시면 충분히 따라 하실 수 있습니다.
0. 개요
[Node.js 란]
Node.js는 2009년 등장한 자바스크립트 런타임입니다.
JavaScript Everywhere이라는 기조로 자바스크립트를 클라이언트와 서버 모두 개발 가능 하도록 설계되었습니다.
논블로킹(Non-blocking) I/O와 단일 스레드 이벤트 루프를 통해 높은 처리 성능으로 다양한 곳에서 활용되는 소프트웨어 플랫폼입니다.
[Django 란]
django는 Python 기반 웹 프레임워크 입니다.
따라서 Python에서 가능한 모든 동작이 가능하며, 강력한 라이브러리들이 많습니다.
또한 반복적으로 구현해야 하는 부분은 이미 만들어져 있습니다.
예를 들면 로그인, 회원가입, 인증, CORS, data parsing 등은 라이브러리를 이용해 간단하게 사용할 수 있습니다
Hands On에서는 AWS Elastic Beanstalk에서 제공하는 샘플 코드를 활용하여 웹 애플리케이션 배포를 진행해 보도록 하겠습니다.
Hands On에서 사용하는 샘플 코드는 아래 링크에서 받으실 수 있습니다.
[Hands On 실습 환경 구성]
Hands On을 통해 다음과 같은 환경을 구성할 예정입니다.
오토스케일링 그룹을 생성하고 오토스케일링 그룹과 연결된 애플리케이션 로드밸런서를 생성하여 인터넷과 연결되는 구성과 Elastic Beanstalk에서 코드 배포를 진행해 보겠습니다.
1. 애플리케이션 및 환경 생성
Elastic Beanstalk 탭으로 들어가 애플리케이션 → 새 애플리케이션 생성을 선택합니다.
생성하실 애플리케이션의 이름을 설정하시고 애플리케이션 생성을 선택하시면 됩니다.
애플리케이션 태그의 경우 아무것도 넣지 않으셔도 무방합니다.
처음 Beanstalk를 생성하는 경우 다음과 같이 자동으로 웹 애플리케이션 환경을 동시에 생성하게 나옵니다. 환경을 나중에 설정하고 싶으시면 애플리케이션 이름만 작성하신 후 애플리케이션 생성을 누르시면 됩니다.
생성한 애플리케이션을 선택해 애플리케이션에 들어가 새 환경 생성을 선택합니다.
환경 티어를 선택하는 페이지가 나옵니다.
이번 Hands On에서는 웹 애플리케이션을 구성하기 때문에 웹 서버 환경을 선택합니다.
웹 서버 환경 – 80 포트를 통해 HTTP 또는 443 포트를 통해 HTTPS 요청을 처리하는 환경
작업자 환경 – 배치, 스케줄 프로그램을 위한 환경으로 SQS Queue를 통해 메시지를 처리하는 애플리케이션 환경
환경 정보 탭에서 환경 이름을 설정하고 Beanstalk에 연결될 도메인을 설정합니다.
도메인을 공백으로 두 면 자동으로 환경 이름이 도메인으로 들어갑니다.
플랫폼 탭에서는 사용할 플랫폼을 설정합니다.
이번 Hands On에서는 Node.js를 사용할 예정이므로 Node.js 14버전을 선택합니다.
python 또한 환경에 맞는 버전을 선택하시면 되겠습니다.
애플리케이션 코드 탭에서는 코드 업로드를 선택합니다.
로컬 파일을 선택 후 파일 선택을 통해 위의 링크에서 다운로드한 nodejs.zip 파일을 선택합니다.
코드 선택 후 추가 옵션 구성을 선택해 환경 구성을 진행합니다.+
2. 환경 구성
Elastic Beanstalk에서 가장 중요한 부분이 환경 구성이라고 할 수 있습니다.
웹 애플리케이션의 목적에 맞게 환경을 구성하면 이후에는 Beanstalk에서 용량 프로비저닝, 로드 밸런싱, Auto Scaling부터 시작하여 애플리케이션 상태 모니터링에 이르기까지 배포를 자동으로 처리합니다.
이번 Hands On에서는 오토스케일링과 로드밸런서를 사용할 예정이므로 사전 설정에서 고가용성을 선택해 줍니다.
스팟 인스턴스를 사용 시 최대 90% 저렴한 가격에 사용할 수 있지만 항상 중단에 준비되어 있어야 하므로 온디멘드 인스턴스로 Hands On을 진행합니다.
네트워크
가장 먼저 네트워크 설정을 합니다. 편집을 눌러 설정으로 들어갑니다.
먼저 사용할 VPC를 선택을 합니다.
다음으로 로드 밸런서의 네트워크 설정을 합니다. 로드 밸런서는 공개, 내부 두 가지 옵션이 있습니다.
이번 Hands On에서는 공개로 설정 후 가용영역 a, c의 퍼블릭 서브넷에 위치하겠습니다.
다음으로 인스턴스 설정입니다.
이 부분을 잘 설정해 주셔야 환경 생성 시 오류가 나지 않습니다.
먼저 퍼블릭 서브넷에 인스턴스를 위치할 때는 반드시 퍼블릭 IP 주소를 할당해 줘야 합니다.
프라이빗 서브넷에 인스턴스를 위치할 때는 NAT Gatway 혹은 NAT Instance로 외부 통신이 가능하게 설정을 해 주셔야 합니다.
NAT Instance와 관련된 내용은 아래 링크를 참고해 주세요
https://tech.cloud.nongshim.co.kr/2018/10/16/초보자를-위한-aws-웹구축-5-1-nat-서버-생성1/
이번 Hands On에서는 퍼블릭 서브넷에 인스턴스를 생성하겠습니다.
가용영역 a, c의 퍼블릭 서브넷으로 설정하였습니다.
이번 Hands On에서는 데이터베이스를 만들지 않지만, 데이터베이스 서브넷은 데이터베이스를 사용하지 않아도 설정해 주어야 합니다.
설정을 마치고 저장을 눌러 환경 구성 화면으로 넘어갑니다.
인스턴스
다음은 인스턴스 설정입니다. 편집을 눌러 설정 창으로 들어갑니다.
이곳에서 사용할 볼륨의 유형과 크기 IOPS를 설정합니다.
범용 3 10GB 3000IOPS로 설정하겠습니다.
인스턴스 보안그룹을 설정합니다.
이곳에서 보안그룹을 새로 만들지 못하기 때문에 보안그룹을 미리 만드시는 걸 추천합니다.
보안그룹까지 설정이 끝나면 저장을 눌러 환경 구성 창으로 이동합니다.
오토 스케일링
다음으로 용량을 편집합니다.
오토 스케일링 그룹 설정에서 환경 유형은 로드 밸런싱 수행으로 설정합니다.
다음으로 인스턴스입니다. 최소 인스턴스 수와 최대 인스턴스 수를 입력합니다.
다음으로 인스턴스 유형을 선택합니다. 인스턴스 유형은 복수로 설정 가능하며 우선순위는 선택 순으로 부여됩니다.
이번 Hands On에서는 인스턴스 최소 2대 최대 4대 t2.micro 인스턴스로 설정하겠습니다.
다음은 오토 스케일링 조정 트리거입니다.
오토 스케일링을 진행할 조건의 지표를 설정하고 통계치를 선택합니다.
기간과 위반 기간, 임계값을 설정하시면 됩니다.
이번 Hands On에서는 CPU 사용량 평균으로 60%이상일 때 20% 이하 일때 오토 스케일링이 일어나게 설정하였습니다.
*cpu 평균 사용량이 60을 넘으면 스케일 아웃으로 인스턴스가 추가로 생성되고 cpu 평균 사용량이 20% 아래로 내려오면 스케일 인으로 인스턴스가 삭제되는 방식입니다.
로드 밸런서
다음으로 로드 밸런서를 설정하겠습니다. 편집을 누릅니다.
먼저 로드 밸런서 유형, 리스너, 프로세스를 설정할 수 있습니다.
로드 밸런서 유형은 Application Load Balancer에 전용으로 설정하겠습니다.
리스너는 HTTP 80포트 HTTPS 443포트 등을 설정 할 수 있습니다.
프로세스를 통해 인스턴스의 상태 검사를 설정할 수 있습니다.
Django에서는 ‘/’에 대한 응답을 따로 작성해 주지 않으면 해당 URL에 대한 반환값이 없습니다. 때문에 디폴트 값으로 설정 시 상태검사에서 Unhealthy 를 나타내게 됩니다.
다음과 같은 2가지 방법으로 해결이 가능합니다.
- ‘/’ URL에 대한 응답으로 상태코드 200을 반환하는 코드 작성
- 경로를 수정하여 해당 URL에 대한 응답으로 상태코드 200을 반환하는 코드 작성
해당 hands on에서는 2번 방법으로 해결했으며 상태 검사 경로를 ‘/health’로 수정하여 진행하였습니다.
추가적으로 로드 밸런서 규칙과 엑세스 로그 파일 S3 저장이 필요하시면 설정 후 저장하시면 됩니다.
롤링 업데이트와 배포
다음으로 롤링 업데이트와 배포 항목입니다. 편집으로 들어갑니다.
애플리케이션 배포 설정에는 배포 방식과 배치 크기를 설정할 수 있습니다.
배포 방식에는 한 번에 모두, 롤링, 추가 배치를 사용한 롤링, 변경 불가능, 트래픽 분할 총 5가지의 방식이 있습니다.
All at once – 새 버전을 모든 인스턴스에 동시에 배포합니다. 배포가 수행되는 동안 환경에 있는 모든 인스턴스가 잠시 서비스 중지됩니다.
Rolling – 새 버전을 배치로 배포합니다. 각 배치는 배포 단계 동안 서비스에서 제외되므로 배치에 있는 인스턴스의 수만큼 환경의 용량이 감소합니다.
Rolling with additional batch – 새 버전을 배치로 배포하지만, 먼저 새로운 배치의 인스턴스를 시작하여 배포 프로세스 중에 모든 용량이 유지되도록 합니다.
Immutable – 새로운 auto scaling 그룹을 만들어 단일 인스턴스를 배치합니다. 원래 있던 auto scaling 그룹과 같이 트래픽을 처리하며 새로 배치된 인스턴스의 상태가 양호하면 원래 있던 인스턴스의 수만큼 추가하여 배포합니다.
Traffic splitting – 카나리 배포 방식입니다. 새로운 auto scaling 그룹을 만들고 로드밸런서에서 트래픽의 일정 부분을 보내 상태가 양호하다면 모든 트래픽을 새로 업로드한 인스턴스로 처리합니다.참고 : https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/using-features.rolling-version-deploy.html
용도에 맞는 배포 방식을 선택하시면 됩니다.
보안
마지막으로 보안 설정입니다. 편집을 선택합니다.
각 서비스의 IAM 롤을 설정할 수 있고 인스턴스의 키페어 IAM 롤을 설정할 수 있습니다.
Elastic Beanstalk로 만들어진 EC2 인스턴스에 접속하기 위해서는 키페어가 반드시 필요하므로 키페어를 선택해 주시면 됩니다.
환경 생성
추가 필요한 설정을 마치신 후 환경 생성을 눌러 환경을 만드시면 됩니다.
환경을 생성한다는 메시지가 나온 후 몇 분 기다리시면 환경 생성이 완료됩니다.
환경 생성이 완료된 후 환경으로 이동을 선택하시면
다음과 같은 화면이 나오는 것을 확인할 수 있습니다.
환경 구성은 환경이 생성된 이후에도 구성 탭을 통해 수정할 수 있습니다.
3. 배포
환경의 메인 페이지에서 업로드 및 배포를 선택합니다.
소스 코드를 압축한 Zip 파일을 업로드 할 수 있고 버전 레이블을 할 수 있습니다.
환경 구성에서 설정한 배포 방식이 기본값으로 설정되어 있고 추가적으로 배포 방식을 변경하여 배포를 할 수 있습니다.
애플리케이션의 애플리케이션 버전 탭으로 들어가시면 업로드된 애플리케이션 버전과 현재 배포되고 있는 버전이 어떤 버전인지 확인 가능합니다.
Node.js에서는 배포 시 package.json 파일에 애플리케이션의 종속성 항목들이 적혀 있어야 합니다. 또한 zip 파일에는 package-lock.json 파일과 node_module 폴더가 삭제되어 있어야 합니다.
python의 경우 python3 -m pip freeze > requirements.txt 명령어를 통해 설치된 패키지를 requirements.txt에 저장합니다.
4. .ebextention
웹 애플리케이션의 소스 코드에 AWS Elastic Beanstalk 구성 파일(.ebextensions)을 추가하여 환경을 구성하고 환경에 있는 AWS 리소스를 사용자 지정할 수 있습니다. 구성 파일은 .config 파일 확장명을 사용하는 YAML이나 JSON 형식 문서로, .ebextensions 폴더에 놓고 애플리케이션 소스 번들로 배포합니다.
애플리케이션이 구동 되기 전 OS에 설치되어야할 프로세스를 설정하거나, EC2 인스턴스가 생성 후 설정해야 하는 부분을 config 파일에 미리 설정하여 업로드 할 수 있습니다.
config 파일에 옵션은 아래 링크를 참고하시면 됩니다.
https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/command-options-general.html
https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/customize-containers-ec2.html
좀 더 자세한 사항은 다음 포스팅에서 다루도록 하겠습니다.
5. 정리
Hands On 과정으로 AWS Console을 통해 AWS Elastic Beanstalk를 활용한 웹서비스를 구축해 보았습니다.
AWS Elastic Beanstalk는 웹 애플리케이션 및 서비스를 간편하게 배포하고 조정할 수 있는 서비스입니다.
코드를 업로드 하기만 하면 Elastic Beanstalk가 용량 프로비저닝, 로드 밸런싱, Auto Scaling 부터 시작하여 애플리케이션 상태 모니터링에 이르기까지 배포를 자동으로 처리합니다.
다음 포스팅에서 awsebcli를 활용한 Django 배포에 대하여 다뤄보겠습니다.
AWS 서비스에 관해 문의 사항이나 기술 지원이 필요하시면,
NDS Sales 팀으로 연락 주시길 바랍니다.
SA 현지웅