본문 바로가기
Etc

Elastic Beanstalk으로 Alpha 개발 환경 빠르게 배포하기(S3, Route53, CloudFront)

by chuckolet 2020. 10. 16.

회사에서 실험 기능들을 확인하기 위한 Alpha 서버를 만들어 달라는 요청이 왔습니다. 기존에 develop 코드를 확인하는 Beta 서버가 이미 존재하고 있어서 해당 서버를 참조하여 빠르게 만들어본 과정을 공유합니다.

EBS(Elastic Beanstalk)을 이용하여 Environment와 application 생성

Elastic Beanstalk은 Apache나, Nginx 같은 서버에서 Java, Nodejs, Python 등 여러 언어로 개발된 웹 어플리케이션을 쉽게 배포하고 확장하기 위한 서비스입니다.

 

1. create a new environment를 클릭

 

2. web server environment 선택 하고 select

 

3. Environment name, Domain, Application name에 원하는 이름을 입력하고

 

앱서버의 플랫폼을 선택해주세요. 저는 AWS에서 제공하는 Nodejs 최신버전을 선택했습니다. Applicaion code는 일단 샘플 앱을 올리고 나중에 원하는 앱을 올리면 됩니다.

 

4. 좀 더 디테일한 설정을 하고 싶으면 최하단의 configure more options를 선택합니다. 저는 나중에 AWS의 route53 서비스를 이용해서 저희 도메인을 적용하고 싶었는데 저희 도메인은 SSL이 적용되어 있어서 적용하려면 Load Balancer의 Listener를 설정해주어야 합니다. 그리고 Load Balancer를 설정하려면 Single instance 외의 다른 옵션을 선택해 주어야합니다. 저는 Custom configuration을 선택하고 시작하겠습니다.

 

Software에서 X-ray 설정, 원하는 환경변수를 세팅하시고, Capacity에서 Single instance와 Load Balancing 중 선택을 할 수 있고, instance의 개수, EC2 instance type을 변경할 수 있습니다. 저는 저희 도메인을 사용하기 위한 것일 뿐 alpha 환경에서 아직 load balancing이 필요하지 않기 때문에 instances는 1로 변경할 겁니다.

 

위에서 말씀드린 route53을 이용한 도메인 적용을 위해 SSL 세팅을 하기 위해서 Load balancer를 설정해주겠습니다. 다른 설정들은 다 디폴트 그대로 두고 Listeners를 추가하겠습니다.

 

Add listener 버튼을 누르고 HTTPS이므로 Port는 443, Protocol은 HTTPS, SSL certificate는 기존에 회사에서 사용하던 것으로 설정, SSL Policy는 AWS에서 권장하는 ELBSecurityPolicy-2016-08로 하겠습니다.

원하는 설정을 마쳤으면 Create environment를 클릭해서 환경과 어플리케이션을 만들어줍시다.

 

조금만 기다리면 아래와 같이 생성한 환경과 어플리케이션을 확인할 수 있습니다. EC2에도 선택한 instance가 생겼을 겁니다.

아래 사진에서 NU-Alpha 밑에 가려진 부분은 생성된 웹서버의 주소입니다. 클릭해보면 샘플 앱이 돌아가고 있는 것을 확인 할 수 있습니다.

Route53을 이용해서 도메인 설정하기

Route53은 가용성과 확장성이 뛰어난 DNS(Domain Name System)와 도메인 이름 등록, health 체크를 제공하는 서비스입니다.

 

기존에 사용하던 nextunicorn.kr이라는 Hosted zone이 있어서 그 안에 Record만 추가해주었습니다.

 

Create record를 누르고 Routing Policy는 Simple routing을 선택해줍니다.

 

Define simple record를 눌러주세요

 

Record name에 원하는 subdomain 이름을 입력해주고, 우리는 EBS를 이용해서 App을 운영하고 있으니 Value/Route traffic to에서 Alias to Elatic Beanstalk environment, region은 EBS가 있는 곳으로 선택해주세요. 가려진 부분은 ebs에서 생성된 App URL을 선택해주시면 됩니다.

Define simple record를 클릭하고 약 5~10분이 지난 후에 설정한 subdomain 이름으로 접속하면 아까 생성된 EBS App URL과 같은 곳으로 이동하는 것을 확인하실 수 있습니다.

Build해서 EBS에 application upload & deploy 하기

이 부분은 웹서버에 배포하고 싶은 앱을 EBS에 업로드하고 배포하는 부분인데, 저희 회사에서는 Jenkins를 이용해서 repository가 업데이트 되면 자동으로 빌드를 하고 beanstalk에 업로드하고 있습니다. Jenkins를 사용하실 줄 안다면 Jenkins를 이용해서 자동 배포를 설정해두셔도 좋고 직접 로컬에서 빌드해서 압축한 zip 파일을 EBS에서 Upload and deploy 버튼을 누르셔도 됩니다.

 

static과 contents 파일용 S3 Bucket을 생성하고 CORS 설정하기

저희 회사에서는 이미지 파일들을 S3 Bucket에 올리고 해당 Bucket을 CloudFront와 연결해서 관리하고 있습니다. 우선 Bucket부터 만들어봅시다.

 

S3에 서비스로 이동 해서 Create bucket 버튼을 눌러주세요

 

원하는 Bucket name과 Region을 정하고 Next를 눌러주세요

 

테스트이니 모든 public access를 풀어줍시다. public access 제한이 필요하신 분은 원하는 부분을 체크해주시면 됩니다. 위에 주황색 경고문의 체크박스에 체크 해주시고 next를 눌러주시고 bucket을 생성합니다.

 

다른 작업을 다 끝낸 뒤 마지막으로 계속 저를 괴롭혔던게 이미지를 업로드하려고 하면 CORS 에러가 뜨면서 업로드가 되지 않는 문제였습니다. 그 문제는 S3 Bucket -> Permissions -> CORS configuration에 CORS 설정을 추가해서 해결할 수 있었습니다.

CORS에 대한 자세한 설명은 여기서 잘 설명해주십니다.

S3에 CloudFront 적용하기

CloudFront란 AWS에서 제공하는 CDN 서비스입니다. 이미지 등의 컨텐츠 파일은 용량이 크기 때문에 CDN(content delivery network)을 적용해놓으면 좋습니다. 또한 Alternate Domain Names(CNAMEs)를 이용하면 원하는 도메인 이름을 사용할 수 있는 것도 장점입니다.

 

RTMP는 곧 지원하지 않는다고 하니 Web을 선택해줍시다.

 

Origin Domain Name은 CloudFront에 캐시된 데이터가 없을 때 데이터를 찾을 original source입니다. 우리는 S3와 연결할 것이니 위에서 생성한 S3 bucket을 선택해줍시다. 저는 SSL을 사용하므로 Viewer Protocol Policy에서 Redirect HTTP to HTTPS를 선택해주었습니다.

 

각 항목에 대한 더 상세한 설명은 여기를 참고해주세요.

 

Price Class는 아시아에서 사용할 것이기 때문에 Use U.S., Canada, Europe, Asia, Middle East and Africa를 선택해주었습니다.

Alternate Domain Names에 원하는 contents 이름을 입력하고 SSL은 클라우드 프론트에서 제공하는 것 대신 기존에 사용하던 SSL을 적용해주었습니다.

CloudFront도 적용되는데 시간이 10분 정도 소요됩니다. 만약 원하는 contents용 subdomain이 있다면, Route53에 추가해주고 value로 CloudFront Domain Name을 적어주고 CloudFront의 CNAMEs에 subdomain을 입력해주면, 해당 subdomain으로 들어온 요청이 CloudFront를 먼저 탄 뒤 캐시된 데이터가 없을 때는 S3 bucket에 접근 할 수 있게 됩니다.

기존에 사용하던 DB 복제하기

alpha서버는 기존에 운영되던 beta 서버를 기반으로 만들기 때문에 DB 구조가 beta와 같습니다. 데이터도 같이 복사하기 위해서 mysqldump를 이용하여 새로운 alpha DB를 생성하는 script를 만들어주었습니다.

References

댓글