아마존 웹 서비스를 다루는 기술 23장 4. Elastic Beanstalk 환경 URL 교체로 무중단 배포하기

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

간편하게 사용하는 애플리케이션 플랫폼 서비스 Elastic Beanstalk

이재홍 http://www.pyrasis.com 2014.03.24 ~ 2014.06.30

Elastic Beanstalk 환경 URL 교체로 무중단 배포하기

Elastic Beanstalk의 애플리케이션에는 여러 개의 환경을 만들 수 있습니다. 이러한 특징을 이용하여 서비스를 중단하지 않고 애플리케이션을 최신 버전으로 업데이트할 수 있습니다. 애플리케이션 소스를 업데이트한 뒤 웹 서버를 아무리 빨리 재시작하더라도 약간의 서비스 중단은 피할 수 없습니다. Elastic Beanstalk의 환경 URL 교체(Swap Environment URLs) 기능을 사용하면 약간의 서비스 중단 시간도 없앨 수 있습니다.

환경 URL 교체 기능을 사용하려면 애플리케이션 1개와 환경이 2개 필요합니다. 아직 애플리케이션과 환경을 만들지 않았다면 '23.1 Elastic Beanstalk으로 Node.js 애플리케이션과 환경 생성하기'를 참조하여 애플리케이션과 환경을 생성하기 바랍니다.

Elastic Beanstalk 메인 페이지로 이동합니다. 그림 23-29과 같이 애플리케이션과 환경 목록이 표시됩니다. 오른쪽 위의 Actions 버튼을 클릭하면 팝업 메뉴가 나옵니다. 여기서 Launch New Environment를 클릭합니다.

그림 23-29 Elastic Beanstalk 애플리케이션 및 환경 목록

URL을 교체할 환경(Environment)을 생성합니다(그림 23-30).

  • Environment tier: 환경 종류입니다. Web Server을 선택합니다.
    • Web Server: 인터넷에서 접속할 수 있는 웹 서버입니다.
    • Worker: 백 그라운드 작업을 위한 환경입니다. 이 환경은 인터넷에 연결되어 있지 않습니다. 워커와 웹 서버는 SQS(Simple Queue Service)로 데이터를 주고받아야 합니다.
  • Predefined configuration: 개발 언어입니다. Node.js를 선택합니다.
    • Docker로 서버를 구축하고 배포하려면 Docker를 선택하면 됩니다.
  • Environment Type: 환경의 구성 방식입니다. 기본값 그대로 사용합니다.
    • Load Balancing, autoscaling: 부하 분산과 자동 확장을 사용합니다.
    • Single Instance: EC2 인스턴스 하나만 사용합니다.

설정이 완료되었으면 Next 버튼을 클릭합니다.

그림 23-30 Elastic Beanstalk 환경 설정

실행될 애플리케이션의 소스를 업로드하거나 예제 애플리케이션을 사용합니다. 앞에서 애플리케이션을 만들고 소스를 업로드해보았다면 애플리케이션 버전들이 표시됩니다. 새 소스를 업로드할 것이므로 기본값 그대로 사용합니다(그림 23-31).

  • Existing application version: 기존에 업로드된 애플리케이션 버전입니다
  • Upload your own: 사용자가 업로드한 있는 소스입니다.
  • S3 URL: S3 버킷에 저장된 소스입니다. 설정이 완료되었으면 Next 버튼을 클릭합니다.

그림 23-31 Elastic Beanstalk 애플리케이션 소스 설정

Elastic Beanstalk 환경의 URL을 설정합니다(그림 23-32).

  • Environment name: 환경의 이름입니다. 앞에서 만든 환경과 이름이 겹치면 안 되므로 exampleapp-env2를 입력합니다.
  • Environment URL: 환경의 URL입니다. URL은 유일해야 하므로 Check availability 버튼을 클릭하여 중복 여부를 확인합니다. 중복되면 다른 URL을 입력합니다.
  • Description: 환경의 설명입니다. 입력하지 않아도 상관없습니다.

설정이 완료되었으면 Next 버튼을 클릭합니다.

그림 23-32 Elastic Beanstalk 환경 URL 설정

추가 리소스를 생성하고 설정합니다(그림 23-33).

  • Create an RDS DB Instance with this environment: RDS DB 인스턴스를 생성하는 옵션입니다. 이번에는 DB 인스턴스를 생성하지 않을 것이므로 기본값 그대로 체크하지 않습니다.
  • Create this environment inside a VPC: 환경을 다른 격리된 VPC에 생성하는 옵션입니다. 외부에서 접속할 수 없고 내부에서만 접속해야 할 때 사용합니다. VPC에 VPN으로 연결하여 사내망을 구축할 때 활용하면 됩니다. 이번에는 인터넷에서 접속할 수 있게 할 것이므로 기본값 그대로 체크하지 않습니다.

설정이 완료되었으면 Next 버튼을 클릭합니다.

그림 23-33 Elastic Beanstalk 추가 리소스 생성 및 설정

Elastic Beanstalk 환경의 세부 설정입니다(그림 23-34).

  • Instance Type: EC2 인스턴스의 유형입니다. 기본값 그대로 사용합니다.
  • EC2 key pair: EC2 인스턴스에 접속할 때 사용할 키 쌍입니다. 앞에서 생성한 awskeypair를 선택합니다.
  • Email address: 환경에서 주요 내용이 바뀌면 이메일로 내용을 받아봅니다. 이메일을 입력하지 않아도 상관 없습니다.
  • Application health check URL: ELB에서 웹 서버(Node.js, 아파치 웹 서버, Nginx)가 정상적으로 실행되고 있는지 확인할 URL입니다. 입력하지 않으면 / 경로를 사용합니다. 기본값 그대로 비워둡니다.
  • Enable rolling updates: 단계적 업데이트를 사용하는 옵션입니다. EC2 인스턴스의 유형을 변경하거나 EC2 인스턴스를 교체할 때 EC2 인스턴스가 정지되므로 일시적으로 서비스가 중단됩니다. 서비스가 중단되지 않도록 일부 EC2 인스턴스가 운영 중인 상태에서 부분적으로 업데이트합니다. 업데이트가 완료된 EC2 인스턴스에서 트래픽을 처리하고 남은 EC2 인스턴스도 업데이트합니다. 이 기능은 애플리케이션 배포와는 관련이 없습니다. 이번에는 사용하지 않을 것이므로 기본값 그대로 비워둡니다. 자세한 내용은 다음 링크를 참조하기 바랍니다.
    http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.rollingupdates.html
  • Cross zone load balancing: 여러 가용 영역에 EC2 인스턴스를 생성하여 로드 밸런싱을 하는 옵션입니다. 기본값 그대로 사용합니다.
  • Connection draining: Auto Scaling이 사용자의 요청을 처리 중인 EC2 인스턴스를 바로 삭제하지 못하도록 방지하는 기능입니다. 자세한 내용은 '18장 부하 분산과 고가용성을 제공하는 ELB'을 참조하기 바랍니다. 기본값 그대로 사용합니다.
  • Connection draining timeout: Connection draining 대기 시간입니다. 기본값 그대로 사용합니다.
  • Instance profile: EC2 인스턴스에서 사용할 IAM 역할입니다. 미리 만들어놓은 IAM 역할을 선택할 수도 있고 새로 생성할 수도 있습니다. 기본값 그대로 aws-elasticbeanstalk-ec2-role을 선택합니다.

설정이 완료되었으면 Next 버튼을 클릭합니다.

그림 23-34 Elastic Beanstalk 환경 세부 설정

Elastic Beanstalk의 환경에 태그를 설정합니다. 7개까지 생성할 수 있습니다. Next 버튼을 클릭합니다.

그림 23-35 Elastic Beanstalk 환경 태그 설정

지금까지 설정한 내용에 이상이 없는지 확인합니다. 이상이 없으면 Launch 버튼을 클릭합니다.

그림 23-36 Elastic Beanstalk 애플리케이션 및 환경 설정 내용 확인

Elastic Beanstalk 환경 생성이 시작되었습니다. Health를 보면 Launching이라고 표시됩니다. 완전히 생성되기까지 약 5분 정도 소요됩니다.

그림 23-37 Elastic Beanstalk 환경 생성 중

이제 Node.js 애플리케이션 소스를 수정하여 새로 만든 환경(exampleapp-env2)에 배포합니다.

앞에서 만들었던 app.js를 열고 내용을 수정합니다. app.js와 package.json을 작성하지 않았다면 '23.2 AWS 콘솔에서 Elastic Beanstalk Node.js 애플리케이션 배포하기'를 참조하여 두 파일을 작성하기 바랍니다.

다음 코드의 res.send 함수에서 "- Env2"를 추가합니다.

app.js
var express = require('express')
  , http = require('http')
  , app = express();

app.get(['/', '/index.html'], function (req, res){
    res.send('Hello Elastic Beanstalk - Env2');
});

http.createServer(app).listen(process.env.PORT || 3000);

app.js와 package.json 파일을 exampleapp.zip으로 압축합니다.

방금 생성한 Elastic Beanstalk 환경(exampleapp-env2)의 페이지에서 Upload and Deploy 버튼을 클릭합니다.

그림 23-38 Elastic Beanstalk 환경 페이지

업로드 및 배포 창이 표시됩니다. 파일 선택 버튼을 클릭합니다.

그림 23-39 Elastic Beanstalk 배포

파일 열기 창에서 방금 압축했던 exampleapp.zip 파일을 선택하고 열기 버튼을 클릭합니다.

Git으로 배포
AWS 콘솔에서 zip 파일을 올리지 않고 Git으로 배포해도 됩니다.

그림 23-40 Elastic Beanstalk 배포할 파일 선택

파일을 열면 Version label에 파일명이 그대로 입력됩니다. 애플리케이션을 업로드할 때마다 Version label이 달라져야 합니다. 여기서는 exampleapp2을 입력합니다(다음 번에는 exampleapp3 exampleapp4 등으로 입력합니다). 설정이 완료되었으면 Deploy 버튼을 클릭합니다.

그림 23-41 Elastic Beanstalk 배포

잠시 기다리면 Health가 Updating에서 Green으로 바뀌고, Elastic Beanstalk 애플리케이션 배포가 완료됩니다. 오른쪽 위의 Actions 버튼을 클릭하면 팝업 메뉴가 나옵니다. 여기서 Swap Environment URLs를 클릭합니다.

그림 23-42 Elastic Beanstalk 애플리케이션 배포 완료

이제 Elastic Beanstalk 환경(exampleapp-env2)의 URL을 교체합니다. Select an Environment to Swap의 Environment name에 현재 생성된 환경의 목록이 표시됩니다. 처음에 생성했던 Elastic Beanstalk 환경(exampleapp-env)을 선택하고 Swap 버튼을 클릭합니다.

그림 23-43 Elastic Beanstalk 환경 URL 교체

잠시 기다리면 Health가 Updating에서 Green으로 바뀌고, Elastic Beanstalk 환경 URL이 교체됩니다. 위쪽 환경 URL이 exampleapp-env2.elasticbeanstalk.com에서 exampleapp-env.elasticbeanstalk.com으로 바뀌었습니다. 이제 이 링크를 클릭합니다.

그림 23-44 Elastic Beanstalk 환경 URL 교체 완료

웹 브라우저에서 Elastic Beanstalk 환경 URL에 접속하면 방금 수정했던 app.js의 내용이 표시됩니다.

그림 23-45 Elastic Beanstalk 애플리케이션에 접속

이처럼 Elastic Beanstalk 환경 URL 교체 기능을 사용하면 서비스 중단 없이 애플리케이션을 업데이트할 수 있습니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.