Elastic Beanstalk에 DynamoDB를 사용하는 Node.js 애플리케이션 배포 - AWS Elastic Beanstalk

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Elastic Beanstalk에 DynamoDB를 사용하는 Node.js 애플리케이션 배포

이 자습서와 예제 애플리케이션 nodejs-example-dynamo.zip은 Node.js 용 AWS JavaScript SDK를 사용하여 Amazon DynamoDB 서비스와 상호 작용하는 Node.js 애플리케이션을 배포하는 프로세스를 안내합니다. 환경과 분리되거나 외부 데이터베이스에 있는 DynamoDB 테이블을 생성합니다. AWS Elastic Beanstalk 또한 분리된 데이터베이스를 사용하도록 애플리케이션을 구성해야 합니다. 프로덕션 환경에서는 Elastic Beanstalk 환경과 분리된 데이터베이스를 사용하여 환경의 수명 주기와 독립되도록 하는 것이 가장 좋습니다. 또한 이 방법을 통해 블루/그린 배포를 수행할 수 있습니다.

다음은 예시 애플리케이션을 설명합니다:

  • 사용자가 제공한 텍스트 데이터를 저장하는 DynamoDB 테이블입니다.

  • 테이블을 생성하기 위한 구성 파일입니다.

  • Amazon Simple Notification Service(Amazon SNS) 주제.

  • package.json 파일을 사용하여 배포 중에 패키지를 설치하는 방법을 보여 줍니다.

필수 조건

이 튜토리얼의 사전 요구 사항은 다음과 같습니다:

  • Node.js 런타임

  • 기본 Node.js 패키지 관리자 소프트웨어인 npm

  • 익스프레스 커맨드 라인 생성기

  • Elastic Beanstalk 명령줄 인터페이스(EB CLI)

나열된 처음 세개 구성 요소의 설치 및 로컬 개발 환경 설정에 대한 자세한 내용은 Node.js 개발 환경 설정을 참조하십시오. 이 자습서에서는 참조된 항목에서도 언급한 Node.js AWS SDK를 설치할 필요가 없습니다.

EB CLI 설치 및 구성에 대한 자세한 내용은 EB CLI 설치EB CLI 구성 단원을 참조하세요.

Elastic Beanstalk 환경 생성

귀하의 애플리케이션 디렉터리

이 튜토리얼에서는 애플리케이션 소스nodejs-example-dynamo 번들용으로 호출되는 디렉터리를 사용합니다. 이 튜토리얼을 위한nodejs-example-dynamo 디렉토리를 만드세요.

~$ mkdir nodejs-example-dynamo
참고

이 장의 각 튜토리얼에서는 애플리케이션 소스 번들용 자체 디렉토리를 사용합니다. 디렉터리 이름은 튜토리얼에서 사용하는 샘플 응용 프로그램의 이름과 일치합니다.

현재 작업 디렉터리를 nodejs-example-dynamo로 변경합니다.

~$ cd nodejs-example-dynamo

이제 Node.js 플랫폼과 샘플 애플리케이션을 실행하는 Elastic Beanstalk 환경을 설정합니다. Elastic Beanstalk 명령줄 인터페이스(EB CLI)를 사용할 것입니다.

애플리케이션용 EB CLI 리포지토리를 구성하기 위해 Node.js 플랫폼을 실행하는 Elastic Beanstalk 환경을 생성합니다
  1. eb init 명령을 사용하여 리포지토리를 만듭니다.

    ~/nodejs-example-dynamo$ eb init --platform node.js --region <region>

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

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

    ~/nodejs-example-dynamo$ eb create --sample nodejs-example-dynamo

    이 명령은 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 alarms — 환경 내 인스턴스의 부하를 모니터링하고 부하가 너무 높거나 낮을 경우 트리거되는 두 개의 CloudWatch 경보입니다. 경보가 트리거되면 이에 대한 응답으로 Auto Scaling 그룹이 스케일 업 또는 축소됩니다.

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

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

      참고

      Elastic Beanstalk 애플리케이션의 보안을 강화하기 위해 elasticbeanstalk.com 도메인이 공개 서픽스 목록(PSL)에 등록되어 있습니다. 보안 강화를 위해 Elastic Beanstalk 애플리케이션 기본 도메인 이름에 민감한 쿠키를 설정해야 하는 경우 __Host- 접두사가 있는 쿠키를 사용하는 것이 좋습니다. 이렇게 쿠키를 설정하면 교차 사이트 요청 위조 시도(CSRF)로부터 도메인을 보호하는 데 도움이 됩니다. 자세한 내용은 Mozilla 개발자 네트워크의 Set-Cookie 페이지를 참조하세요.

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

    ~/nodejs-example-dynamo$ eb open

이제 샘플 애플리케이션을 사용하여 Node.js Elastic Beanstalk 환경을 생성했습니다. 자체 애플리케이션으로 업데이트할 수 있습니다. 다음으로 Express 프레임워크를 사용하도록 샘플 애플리케이션을 업데이트합니다.

환경의 인스턴스에 권한 추가

애플리케이션은 로드 밸런서 이면에서 하나 이상의 EC2 인스턴스에서 실행되며 인터넷의 HTTP 요청을 제공합니다. 서비스를 사용해야 하는 요청을 받으면 애플리케이션은 실행되는 인스턴스의 권한을 사용하여 해당 AWS 서비스에 액세스합니다.

샘플 애플리케이션은 인스턴스 권한을 사용하여 DynamoDB 테이블에 데이터를 쓰고, Node.js 형식의 SDK를 JavaScript 사용하여 Amazon SNS 주제에 알림을 보냅니다. 다음 관리형 정책을 기본 인스턴스 프로파일에 추가해 EC2 인스턴스에 환경 권한을 부여하여 DynamoDB 및 Amazon SNS에 액세스합니다.

  • AmazonDynamoDB FullAccess

  • 아마존 SNS FullAccess

기본 인스턴스 프로파일에 정책을 추가하려면
  1. IAM 콘솔에서 역할(Roles) 페이지를 엽니다.

  2. 역할 2개를 선택하세요aws-elasticbeanstalk-ec.

  3. 권한 탭에서 정책 연결을 선택합니다.

  4. 애플리케이션이 사용하는 추가 서비스의 관리형 정책을 선택합니다. 이 튜토리얼에서는AmazonSNSFullAccessAmazonDynamoDBFullAccess을 선택합니다.

  5. 정책 연결을 선택합니다.

인스턴스 프로파일 관리에 대한 자세한 내용은 Elastic Beanstalk 인스턴스 프로파일 관리 단원을 참조하세요.

예제 애플리케이션 배포

이제 이 자습서의 예제 nodejs-example-dynamo애플리케이션인.zip을 배포하고 실행할 수 있는 환경이 준비되었습니다.

튜토리얼 예제 애플리케이션을 배포하고 실행하려면
  1. 현재 작업 디렉터리를 애플리케이션 디렉터리 nodejs-example-dynamo로 변경합니다.

    ~$ cd nodejs-example-dynamo
  2. 예제 애플리케이션 소스 nodejs-example-dynamo번들.zip의 콘텐츠를 다운로드하여 애플리케이션 디렉터리에 추출합니다. nodejs-example-dynamo

  3. eb deploy 명령으로 Elastic Beanstalk 환경에 예제 애플리케이션을 배포합니다.

    ~/nodejs-example-dynamo$ eb deploy
    참고

    기본적으로 이 eb deploy 명령은 프로젝트 폴더의 ZIP 파일을 만듭니다. 또한 프로젝트 폴더의 ZIP 파일을 만드는 대신 빌드 프로세스의 결과물을 배포하도록 EB CLI를 구성할 수도 있습니다. 자세한 설명은 프로젝트 폴더 대신 아티팩트 배포 섹션을 참조하세요.

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

    ~/nodejs-example-dynamo$ eb open

이 사이트는 사용자 연락처 정보를 수집하고 DynamoDB 테이블을 사용하여 데이터를 저장합니다. 항목을 추가하려면 Sign up today(오늘 등록)를 선택하고 이름 및 이메일 주소를 입력한 다음 Sign Up!(등록!)을 선택합니다. 웹 앱이 테이블에 양식 내용을 쓰고 Amazon SNS 이메일 알림을 트리거합니다.

이제, 알림을 위한 자리 표시자 이메일로 Amazon SNS 주제가 구성됩니다. 곧 구성을 업데이트할 예정이지만 그 동안 AWS Management Console에서 DynamoDB 테이블 및 Amazon SNS 주제를 확인할 수 있습니다.

테이블을 보려면
  1. DynamoDB 콘솔에서 테이블 페이지를 엽니다.

  2. 애플리케이션에서 생성한 테이블을 찾습니다. 이름은 awseb로 시작하며 다음을 포함합니다. StartupSignupsTable

  3. 테이블을 선택하고 항목을 선택한 다음 Start search(검색 시작)를 선택하여 테이블의 항목을 모두 볼 수 있습니다.

이 테이블에는 가입 사이트에서 제출한 모든 이메일 주소에 해당하는 항목이 포함되어 있습니다. 테이블에 쓰기 이외에도 애플리케이션은 두 개의 구독이 포함된 Amazon SNS 주제에 메시지를 보냅니다. 두 구독 중 하나는 사용자에게 이메일 알림을 보내기 위한 것이고, 다른 구독은 작업자 애플리케이션에서 요청을 처리하고 관련 고객에게 이메일을 보내기 위해 읽을 수 있는 Amazon Simple Queue Service 대기열을 위한 것입니다.

주제를 보려면
  1. Amazon SNS 콘솔에서 주제 페이지를 엽니다.

  2. 애플리케이션에서 생성한 주제를 찾습니다. 이름은 awseb로 시작하고 다음을 포함합니다. NewSignupTopic

  3. 구독을 보려는 주제를 찾습니다.

애플리케이션(app.js)은 경로 2개를 정의합니다. root path (/) 는 Embedded JavaScript (EJS) 템플릿에서 렌더링된 웹 페이지를 반환합니다. 이 양식은 사용자가 이름과 이메일 주소를 등록하기 위해 작성하는 양식입니다. 이 양식을 제출하면 /signup 경로에 양식 데이터와 함께 POST 요청을 보냅니다. 그러면 DynamoDB 테이블에 항목이 기록되고 Amazon SNS 주제에 메시지를 게시해 가입 소유자에게 알립니다.

샘플 애플리케이션에는 애플리케이션에서 사용하는 DynamoDB 테이블, Amazon SNS 주제 및 Amazon SQS 대기열을 생성하는 구성 파일이 포함되어 있습니다. 이 구성 파일을 사용해 새 환경을 생성하고, 기능을 즉시 테스트할 수 있지만 DynamoDB 테이블을 환경에 구속하는 단점이 있습니다. 프로덕션 환경의 경우 환경 외부에 DynamoDB 테이블을 생성해 환경을 종료하거나 환경의 구성을 업데이트할 때 테이블이 손실되지 않도록 해야 합니다.

DynamoDB 테이블 생성

Elastic Beanstalk에서 실행 중인 애플리케이션에서 외부 DynamoDB 테이블을 사용하려면 먼저 DynamoDB에서 테이블을 생성합니다. Elastic Beanstalk 외부에서 생성한 테이블은 Elastic Beanstalk 및 Elastic Beanstalk 환경과 무관하며 Elastic Beanstalk에서 종료하지 않습니다.

다음 설정을 사용하여 테이블을 생성합니다.

  • 테이블 이름nodejs-tutorial

  • 기본 키email

  • 기본 키 유형 – 문자열

DynamoDB 테이블 생성
  1. DynamoDB Management Console에서 테이블 페이지를 엽니다.

  2. Create table(테이블 만들기)을 선택합니다.

  3. Table name(테이블 이름)Primary key(기본 키)를 입력합니다.

  4. 기본 키 유형을 선택합니다.

  5. Create(만들기)를 선택합니다.

애플리케이션별 구성 파일 업데이트

테이블을 하나 생성하는 대신 nodejs-tutorial 테이블을 사용하도록 애플리케이션 원본에서 구성 파일을 업데이트합니다.

프로덕션용으로 예제 애플리케이션을 업데이트하려면
  1. 현재 작업 디렉터리를 애플리케이션 디렉터리 nodejs-example-dynamo로 변경합니다.

    ~$ cd nodejs-example-dynamo
  2. .ebextensions/options.config를 열고 다음 설정의 값을 변경합니다.

    • NewSignupEmail— 이메일 주소.

    • STARTUP_SIGNUP_TABLEnodejs-tutorial

    예 .ebextensions/options.config
    option_settings: aws:elasticbeanstalk:customoption: NewSignupEmail: you@example.com aws:elasticbeanstalk:application:environment: THEME: "flatly" AWS_REGION: '`{"Ref" : "AWS::Region"}`' STARTUP_SIGNUP_TABLE: nodejs-tutorial NEW_SIGNUP_TOPIC: '`{"Ref" : "NewSignupTopic"}`' aws:elasticbeanstalk:container:nodejs: ProxyServer: nginx aws:elasticbeanstalk:container:nodejs:staticfiles: /static: /static aws:autoscaling:asg: Cooldown: "120" aws:autoscaling:trigger: Unit: "Percent" Period: "1" BreachDuration: "2" UpperThreshold: "75" LowerThreshold: "30" MeasureName: "CPUUtilization"

    이는 애플리케이션에 다음 컨피그레이션을 적용합니다:

    • Amazon SNS 주제에서 알림에 사용할 이메일 주소는 사용자 주소 또는options.config 파일에 입력한 주소로 설정됩니다.

    • 에서 만든 테이블 대신 nodejs-튜토리얼 테이블이 사용됩니다.ebextensions/create-dynamodb-table.config.

  3. .ebextensions/create-dynamodb-table.config를 제거합니다.

    ~/nodejs-tutorial$ rm .ebextensions/create-dynamodb-table.config

    다음에 애플리케이션을 배포할 때 이 구성 파일을 통해 생성한 테이블은 삭제됩니다.

  4. eb deploy 명령으로 Elastic Beanstalk 환경에 업데이트된 애플리케이션을 배포합니다.

    ~/nodejs-example-dynamo$ eb deploy
  5. 환경 생성이 완료되면 eb open 명령을 사용하여 기본 브라우저에서 환경의 URL을 엽니다.

    ~/nodejs-example-dynamo$ eb open

배포 시 Elastic Beanstalk는 Amazon SNS 주제의 구성을 업데이트하고 애플리케이션의 첫 번째 버전을 배포할 때 생성한 DynamoDB 테이블을 삭제합니다.

이제, 환경을 종료하더라도 nodejs-tutorial 테이블이 삭제되지 않습니다. 따라서 블루/그린 배포를 수행하거나, 구성 파일을 수정하거나, 데이터 손실 위험 없이 웹사이트를 내릴 수 있습니다.

브라우저에서 사이트를 열고 양식이 예상대로 작동하는지 확인합니다. 몇 가지 항목을 만든 다음 DynamoDB 콘솔에서 테이블을 확인합니다.

테이블을 보려면
  1. DynamoDB 콘솔에서 테이블 페이지를 엽니다.

  2. nodejs-tutorial 테이블을 찾습니다.

  3. 테이블을 선택하고 항목을 선택한 다음 Start search(검색 시작)를 선택하여 테이블의 항목을 모두 볼 수 있습니다.

또한 Elastic Beanstalk가 이전에 생성한 테이블을 삭제했음을 알 수 있습니다.

고가용성을 위한 환경 구성

마지막으로, 최소 인스턴스 개수를 좀 더 늘린 상태에서 환경의 Auto Scaling 그룹을 구성합니다. 사용자 환경의 웹 서버가 단일 장애 지점이 되지 않도록 방지하고 사이트의 서비스를 중지하지 않고 변경 사항을 배포할 수 있도록 항상 두 개 이상의 인스턴스를 실행합니다.

고가용성을 위해 환경의 Auto Scaling 그룹을 구성하려면
  1. Elastic Beanstalk 콘솔을 열고 지역 목록에서 원하는 지역을 선택합니다. AWS 리전

  2. 탐색 창에서 환경을 선택한 다음 목록에서 환경 이름을 선택합니다.

    참고

    여러개의 환경을 보유한 경우 검색 창을 통해 환경 목록을 필터링합니다.

  3. 탐색 창에서 구성을 선택합니다.

  4. [용량] 구성 범주에서 [편집]을 선택합니다.

  5. Auto Scaling 그룹 섹션에서 최소 인스턴스2로 설정합니다.

  6. 변경 사항을 저장하려면 페이지 하단에서 적용을 선택합니다.

정리

Elastic Beanstalk 작업을 완료하면 환경을 종료할 수 있습니다. Elastic Beanstalk는 Amazon EC2 인스턴스, 데이터베이스 인스턴스, 로드 밸런서, 보안 그룹, 경보 등 사용자 환경과 관련된 모든 리소스를 AWS 종료합니다.

Elastic Beanstalk 환경을 종료하려면
  1. Elastic Beanstalk 콘솔을 열고 지역 목록에서 원하는 지역을 선택합니다. AWS 리전

  2. 탐색 창에서 환경을 선택한 다음 목록에서 환경 이름을 선택합니다.

    참고

    여러개의 환경을 보유한 경우 검색 창을 통해 환경 목록을 필터링합니다.

  3. 작업(Actions)을 선택한 후 환경 종료(Terminate Environment)를 선택합니다.

  4. 화면에 표시되는 대화 상자를 사용하여 환경 종료를 확인합니다.

Elastic Beanstalk로 언제든지 애플리케이션을 위한 새로운 환경을 쉽게 생성할 수 있습니다.

생성한 외부 DynamoDB 테이블을 삭제할 수도 있습니다.

DynamoDB 테이블 삭제
  1. DynamoDB 콘솔에서 테이블 페이지를 엽니다.

  2. 테이블을 선택합니다.

  3. 작업을 선택한 후 Delete table(테이블 삭제)를 선택합니다.

  4. 삭제를 선택합니다.

다음 단계

예제 애플리케이션은 구성 파일을 사용하여 소프트웨어 설정을 구성하고 환경의 일부로 AWS 리소스를 생성합니다. 구성 파일 및 구성 파일의 사용에 대한 자세한 내용은 구성 파일(.ebextensions)을 사용하여 고급 환경 사용자 지정 단원을 참조하세요.

이 튜토리얼의 예제 애플리케이션에서는 Node.js용 Express 웹 프레임워크를 사용합니다. Express에 대한 자세한 내용은 expressjs.com에서 공식 문서를 참조하십시오.

마지막으로, 프로덕션 환경에서 애플리케이션을 사용하려는 경우 환경에 대한 사용자 지정 도메인 이름을 구성하고 보안 연결을 위해 HTTPS를 활성화합니다.