Elastic Beanstalk에 Express 애플리케이션 배포 - AWS Elastic Beanstalk

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

이 단원에서는 Elastic Beanstalk 명령줄 인터페이스(EB CLI) 및 Git를 사용하여 샘플 애플리케이션을 Elastic Beanstalk에 배포한 후, Express 프레임워크를 사용하도록 애플리케이션을 업데이트하는 절차를 살펴봅니다.

사전 조건

이 자습서에는 Node.js 언어, npm이라는 패키지 관리자 및 Express 웹 애플리케이션 프레임워크가 필요합니다. 이러한 구성 요소 설치 및 로컬 개발 환경 설정에 대한 자세한 내용은 Node.js 개발 환경 설정 단원을 참조하십시오.

참고

이 자습서에서는 Node.js 용 AWS SDK를 설치할 필요가 없습니다. Node.js 개발 환경 설정에서도 언급됩니다.

또한 자습서에는 Elastic Beanstalk 명령줄 인터페이스(EB CLI)가 필요합니다. EB CLI 설치 및 구성에 대한 자세한 내용은 EB CLI 설치EB CLI 구성 단원을 참조하세요.

Git 초기화

전제 조건 Node.js 및 Express 설정으로 인해 node-express 폴더에 Express 프로젝트 구조가 생성됩니다. 아직 Express 프로젝트를 생성하지 않은 경우, 다음 명령을 실행하십시오. 자세한 내용은 Express 설치 섹션을 참조하세요.

~/node-express$ express && npm install

이제 이 폴더에 Git 리포지토리를 설정합니다.

Git 리포지토리를 설정하려면

  1. Git 리포지토리를 초기화합니다. Git을 설치하지 않은 경우 Git 다운로드 사이트에서 이를 다운로드합니다.

    ~/node-express$ git init
  2. .gitignore라는 파일을 만들고 여기에 다음 파일과 디렉터리를 추가합니다. 이러한 파일은 리포지토리에 추가되지 않고 제외됩니다. 이 단계는 필수는 아니지만 강력한 권장 사항입니다.

    node-express/.gitignore

    node_modules/ .gitignore .elasticbeanstalk/

Elastic Beanstalk 환경 생성

애플리케이션용 EB CLI 리포지토리를 구성하고 Node.js 플랫폼을 실행하는 Elastic Beanstalk 환경을 생성합니다.

  1. eb init 명령을 사용하여 리포지토리를 만듭니다.

    ~/node-express$ eb init --platform node.js --region us-east-2 Application node-express has been created.

    이 명령은 애플리케이션의 환경을 생성하기 위한 설정을 지정하는 .elasticbeanstalk라는 이름의 폴더에 구성 파일을 만들고 현재 폴더의 이름을 딴 Elastic Beanstalk 애플리케이션을 만듭니다.

  2. eb create 명령을 사용하여 샘플 애플리케이션을 실행하는 환경을 생성합니다.

    ~/node-express$ eb create --sample node-express-env

    이 명령은 Node.js 플랫폼의 기본 설정과 다음 리소스를 사용하여 로드 밸런싱 수행 환경을 만듭니다.

    • EC2 인스턴스(EC2 instance) - 선택한 플랫폼에서 웹 앱을 실행하도록 구성된 Amazon Elastic Compute Cloud(Amazon EC2) 가상 머신입니다.

      특정 언어 버전, 프레임워크, 웹 컨테이너 또는 그 조합을 지원하도록 각 플랫폼마다 특정 소프트웨어, 구성 파일 및 스크립트 세트를 실행합니다. 대부분의 플랫폼에서는 웹 앱 앞에 위치해 웹 앱으로 요청을 전달하고, 정적 자산을 제공하고, 액세스 및 오류 로그를 생성하는 역방향 프록시로 Apache 또는 NGINX를 사용합니다.

    • 인스턴스 보안 그룹(Instance security group) - 포트 80에서 인바운드 트래픽을 허용하도록 구성된 Amazon EC2 보안 그룹입니다. 이 리소스를 통해 로드 밸런서의 HTTP 트래픽이 웹 앱을 실행하는 EC2 인스턴스에 도달할 수 있습니다. 기본적으로 다른 포트에서는 트래픽이 허용되지 않습니다.

    • 로드 밸런서(Load balancer) - 애플리케이션을 실행하는 인스턴스로 요청을 분산하도록 구성된 Elastic Load Balancing 로드 밸런서입니다. 또한 로드 밸런서가 있으면 인터넷에 인스턴스를 직접 노출할 필요가 없습니다.

    • 로드 밸런서 보안 그룹(Load balancer security group) - 포트 80에서 인바운드 트래픽을 허용하도록 구성된 Amazon EC2 보안 그룹입니다. 이 리소스를 통해 인터넷의 HTTP 트래픽이 로드 밸런서에 도달할 수 있습니다. 기본적으로 다른 포트에서는 트래픽이 허용되지 않습니다.

    • Auto Scaling 그룹(Auto Scaling group) - 인스턴스가 종료되거나 사용할 수 없게 될 경우 인스턴스를 대체하도록 구성된 Auto Scaling 그룹입니다.

    • Amazon S3 버킷(Amazon S3 bucket) - Elastic Beanstalk 사용 시 생성된 소스 코드, 로그 및 기타 아티팩트의 스토리지 위치입니다.

    • Amazon CloudWatch 경보(Amazon CloudWatch alarms) - 환경의 인스턴스에 대한 로드를 모니터링하는 두 개의 CloudWatch 경보로, 로드가 너무 높거나 너무 낮은 경우 트리거됩니다. 경보가 트리거되면 이에 대한 응답으로 Auto Scaling 그룹이 확장 또는 축소됩니다.

    • AWS CloudFormation 스택 – Elastic Beanstalk은 AWS CloudFormation을 사용하여 환경의 리소스를 시작하고 구성 변경 사항을 전파합니다. 리소스는 AWS CloudFormation 콘솔에서 볼 수 있는 템플릿에서 정의됩니다.

    • 도메인 이름(Domain name) - subdomain.region.elasticbeanstalk.com 형식으로 웹 앱으로 라우팅되는 도메인 이름입니다.

  3. 환경 생성이 완료되면 eb open 명령을 사용하여 기본 브라우저에서 환경의 URL을 엽니다.

    ~/node-express$ eb open

애플리케이션 업데이트

샘플 애플리케이션이 있는 환경을 생성한 후 이를 자체 애플리케이션으로 업데이트할 수 있습니다. 이 단계에서 Express 프레임워크를 사용하도록 샘플 애플리케이션을 업데이트합니다.

Express를 사용하도록 애플리케이션을 업데이트하려면

  1. 로컬 컴퓨터에서 소스 번들의 최상위 디렉터리에 .ebextensions 디렉터리를 생성합니다. 이 예제에서는 [node-express/.ebextensions]을 사용합니다.

  2. 노드 명령을 "npm start"로 설정하는 구성 파일을 추가합니다.

    node-express/.ebextensions/nodecommand.config

    option_settings: aws:elasticbeanstalk:container:nodejs: NodeCommand: "npm start"

    자세한 내용은 구성 파일(.ebextensions)을 사용하여 고급 환경 사용자 지정을(를) 참조하세요.

  3. 파일을 스테이징합니다.

    ~/node-express$ git add . ~/node-express$ git commit -m "First express app"
  4. 변경 사항을 배포합니다.

    ~/node-express$ eb deploy
  5. 환경이 녹색이고 준비되면 URL을 새로 고쳐서 작동하는지 확인합니다. Welcome to Express라는 웹 페이지가 보일 것입니다.

다음으로 정적 파일을 제공하고 새 페이지를 추가하도록 Express 애플리케이션을 업데이트하겠습니다.

정적 파일을 구성하고 Express 애플리케이션에 새 페이지를 추가하려면

  1. 다음 콘텐츠가 포함된 두 번째 구성 파일을 추가합니다.

    node-express/.ebextensions/staticfiles.config

    option_settings: aws:elasticbeanstalk:container:nodejs:staticfiles: /public: /public

    이 설정은 애플리케이션의 public 경로에서 /public 폴더에 있는 파일을 제공하도록 프록시 서버를 구성합니다. 프록시 서버에서 정적으로 파일을 제공하면 애플리케이션의 부하가 감소합니다.

  2. node-express/app.js에서 정적 매핑을 주석으로 처리합니다. 이 단계는 필수는 아니나 정적 매핑이 올바르게 구성되었는지 확인하기 위한 좋은 테스트입니다.

    // app.use(express.static(path.join(__dirname, 'public')));
  3. 로컬 리포지토리에 업데이트된 파일을 추가하고 변경 사항을 커밋합니다.

    ~/node-express$ git add .ebextensions/ app.js ~/node-express$ git commit -m "Serve stylesheets statically with nginx."
  4. node-express/routes/hike.js를 추가합니다. 다음을 입력합니다.

    exports.index = function(req, res) { res.render('hike', {title: 'My Hiking Log'}); }; exports.add_hike = function(req, res) { };
  5. 새로운 세 줄을 포함하도록 node-express/app.js를 업데이트합니다.

    먼저 다음 줄을 추가하여 이 경로에 require를 추가합니다.

    var hike = require('./routes/hike');

    파일은 다음 조각과 비슷해야 합니다.

    var express = require('express'); var path = require('path'); var hike = require('./routes/hike');

    그런 다음 node-express/app.js에 다음 두 줄을 추가하여 var app = express(); 뒤에 놓습니다.

    app.get('/hikes', hike.index); app.post('/add_hike', hike.add_hike);

    파일은 다음 조각과 비슷해야 합니다.

    var app = express(); app.get('/hikes', hike.index); app.post('/add_hike', hike.add_hike);
  6. node-express/views/index.jadenode-express/views/hike.jade에 복사합니다.

    ~/node-express$ cp views/index.jade views/hike.jade
  7. 로컬 리포지토리에 파일을 추가하고 변경 사항을 커밋한 후 업데이트된 애플리케이션을 배포합니다.

    ~/node-express$ git add . ~/node-express$ git commit -m "Add hikes route and template." ~/node-express$ eb deploy
  8. 몇 분 후 환경이 업데이트됩니다. 환경이 녹색이고 준비되면 브라우저를 새로 고치고 URL의 끝에 hikes를 추가하여(예: http://node-express-env-syypntcz2q.elasticbeanstalk.com/hikes) 작동하는지 확인합니다.

    My Hiking Log라는 제목의 웹 페이지가 보일 것입니다.

정리

Elastic Beanstalk 작업을 완료한 경우 환경을 종료할 수 있습니다.

eb terminate 명령을 사용하여 환경과 환경에 있는 모든 리소스를 종료합니다.

~/node-express$ eb terminate The environment "node-express-env" and all associated instances will be terminated. To confirm, type the environment name: node-express-env INFO: terminateEnvironment is starting. ...