기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
이 자습서와 예제 애플리케이션 nodejs-example-dynamo.zip은 Node.js의 JavaScript용 AWS SDK를 사용하여 Amazon DynamoDB 서비스와 상호 작용하는 Node.js 애플리케이션을 배포하는 프로세스를 안내합니다. AWS Elastic Beanstalk 환경에서 분리되거나 외부인 데이터베이스에 있는 DynamoDB 테이블을 생성합니다. 또한 분리된 데이터베이스를 사용하도록 애플리케이션을 구성해야 합니다. 프로덕션 환경에서는 Elastic Beanstalk 환경과 분리된 데이터베이스를 사용하여 환경의 수명 주기와 독립되도록 하는 것이 가장 좋습니다. 또한 이 방법을 통해 블루/그린 배포를 수행할 수 있습니다.
다음은 예시 애플리케이션을 설명합니다:
-
사용자가 제공한 텍스트 데이터를 저장하는 DynamoDB 테이블입니다.
-
테이블을 생성하기 위한 구성 파일입니다.
-
Amazon Simple Notification Service(Amazon SNS) 주제.
-
package.json 파일을 사용하여 배포 중에 패키지를 설치하는 방법을 보여 줍니다.
Sections
사전 조건
이 튜토리얼의 사전 요구 사항은 다음과 같습니다:
-
Node.js 런타임
-
기본 Node.js 패키지 관리자 소프트웨어인 npm
-
익스프레스 커맨드 라인 생성기
-
Elastic Beanstalk 명령줄 인터페이스(EB CLI)
나열된 처음 세개 구성 요소의 설치 및 로컬 개발 환경 설정에 대한 자세한 내용은 Elastic Beanstalk를 위한 Node.js 개발 환경 설정을 참조하십시오. 이 자습서에서는 AWS SDK for Node.js를 설치할 필요가 없으며, 이는 참조된 주제에도 언급되어 있습니다.
EB CLI 설치 및 구성에 대한 자세한 내용은 Elastic Beanstalk 명령줄 인터페이스 설치 및 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 환경을 생성합니다
-
eb init 명령을 사용하여 리포지토리를 만듭니다.
~/nodejs-example-dynamo$
eb init --platform
node.js
--region<region>
이 명령은 애플리케이션의 환경을 생성하기 위한 설정을 지정하는
.elasticbeanstalk
라는 이름의 폴더에 구성 파일을 만들고 현재 폴더의 이름을 딴 Elastic Beanstalk 애플리케이션을 만듭니다. -
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 경보(Amazon CloudWatch alarms) - 환경의 인스턴스에 대한 로드를 모니터링하는 두 개의 CloudWatch 경보로, 로드가 너무 높거나 너무 낮은 경우 트리거됩니다. 경보가 트리거되면 이에 대한 응답으로 Auto Scaling 그룹이 확장 또는 축소됩니다.
-
AWS CloudFormation 스택 - Elastic Beanstalk는 AWS CloudFormation 를 사용하여 환경에서 리소스를 시작하고 구성 변경 사항을 전파합니다. 리소스는 AWS CloudFormation 콘솔
에서 볼 수 있는 템플릿에서 정의됩니다. -
도메인 이름(Domain name) -
subdomain
.region
.elasticbeanstalk.com 형식으로 웹 앱으로 라우팅되는 도메인 이름입니다.도메인 보안
Elastic Beanstalk 애플리케이션의 보안을 강화하기 위해 elasticbeanstalk.com 도메인이 공개 서픽스 목록(PSL)
에 등록되어 있습니다. Elastic Beanstalk 애플리케이션의 기본 도메인 이름에 민감한 쿠키를 설정해야 하는 경우 보안을 강화하기 위해
__Host-
접두사가 있는 쿠키를 사용하는 것이 좋습니다. 이렇게 쿠키를 설정하면 교차 사이트 요청 위조 시도(CSRF)로부터 도메인이 보호됩니다. 자세한 내용은 Mozilla 개발자 네트워크의 Set-Cookie페이지를 참조하세요.
-
-
환경 생성이 완료되면 eb open 명령을 사용하여 기본 브라우저에서 환경의 URL을 엽니다.
~/nodejs-example-dynamo$
eb open
이제 샘플 애플리케이션을 사용하여 Node.js Elastic Beanstalk 환경을 생성했습니다. 자체 애플리케이션으로 업데이트할 수 있습니다. 다음으로 Express 프레임워크를 사용하도록 샘플 애플리케이션을 업데이트합니다.
환경의 인스턴스에 권한 추가
애플리케이션은 로드 밸런서 이면에서 하나 이상의 EC2 인스턴스에서 실행되며 인터넷의 HTTP 요청을 제공합니다. AWS 서비스를 사용해야 하는 요청을 수신하면 애플리케이션은 실행되는 인스턴스의 권한을 사용하여 해당 서비스에 액세스합니다.
샘플 애플리케이션은 인스턴스 권한을 사용하여 DynamoDB 테이블에 데이터를 쓰고, SDK for JavaScript in Node.js를 사용하여 Amazon SNS 주제에 알림을 보냅니다. 다음 관리형 정책을 기본 인스턴스 프로파일에 추가해 EC2 인스턴스에 환경 권한을 부여하여 DynamoDB 및 Amazon SNS에 액세스합니다.
-
AmazonDynamoDBFullAccess
-
AmazonSNSFullAccess
기본 인스턴스 프로파일에 정책을 추가하려면
-
IAM 콘솔에서 역할(Roles)
페이지를 엽니다. -
aws-elasticbeanstalk-ec2-role을 선택합니다.
-
권한 탭에서 정책 연결을 선택합니다.
-
애플리케이션이 사용하는 추가 서비스의 관리형 정책을 선택합니다. 이 튜토리얼에서는
AmazonSNSFullAccess
및AmazonDynamoDBFullAccess
을 선택합니다. -
정책 연결을 선택합니다.
인스턴스 프로파일 관리에 대한 자세한 내용은 Elastic Beanstalk 인스턴스 프로파일 관리 단원을 참조하세요.
예제 애플리케이션 배포
이제 환경이 이 튜토리얼의 예제 애플리케이션인 nodejs-example-dynamo.zip 를 배포한 다음 실행할 준비가 됩니다.
튜토리얼 예제 애플리케이션을 배포하고 실행하려면
-
현재 작업 디렉터리를 애플리케이션 디렉터리
nodejs-example-dynamo
로 변경합니다.~$
cd nodejs-example-dynamo
-
예제 애플리케이션 소스 번들 nodejs-example-dynamo.zip의 내용을 애플리케이션 디렉터리
nodejs-example-dynamo
에 다운로드하여 압축을 풉니다. -
eb deploy 명령으로 Elastic Beanstalk 환경에 예제 애플리케이션을 배포합니다.
~/nodejs-example-dynamo$
eb deploy
참고
기본적으로
eb deploy
명령은 프로젝트 폴더의 ZIP 파일을 생성합니다. 또한 프로젝트 폴더의 ZIP 파일을 만드는 대신 빌드 프로세스의 결과물을 배포하도록 EB CLI를 구성할 수도 있습니다. 자세한 내용은 프로젝트 폴더 대신 아티팩트 배포 단원을 참조하십시오. -
환경 생성이 완료되면 eb open 명령을 사용하여 기본 브라우저에서 환경의 URL을 엽니다.
~/nodejs-example-dynamo$
eb open
이 사이트는 사용자 연락처 정보를 수집하고 DynamoDB 테이블을 사용하여 데이터를 저장합니다. 항목을 추가하려면 Sign up today(오늘 등록)를 선택하고 이름 및 이메일 주소를 입력한 다음 Sign Up!(등록!)을 선택합니다. 웹 앱이 테이블에 양식 내용을 쓰고 Amazon SNS 이메일 알림을 트리거합니다.

이제, 알림을 위한 자리 표시자 이메일로 Amazon SNS 주제가 구성됩니다. 곧 구성을 업데이트할 예정이지만 그 동안 AWS Management Console에서 DynamoDB 테이블 및 Amazon SNS 주제를 확인할 수 있습니다.
테이블을 보려면
-
DynamoDB 콘솔에서 테이블 페이지
를 엽니다. -
애플리케이션에서 생성한 테이블을 찾습니다. 테이블 이름은 awseb로 시작하며 StartupSignupsTable을 포함합니다.
-
테이블을 선택하고 항목을 선택한 다음 Start search(검색 시작)를 선택하여 테이블의 항목을 모두 볼 수 있습니다.
이 테이블에는 가입 사이트에서 제출한 모든 이메일 주소에 해당하는 항목이 포함되어 있습니다. 테이블에 쓰기 이외에도 애플리케이션은 두 개의 구독이 포함된 Amazon SNS 주제에 메시지를 보냅니다. 두 구독 중 하나는 사용자에게 이메일 알림을 보내기 위한 것이고, 다른 구독은 작업자 애플리케이션에서 요청을 처리하고 관련 고객에게 이메일을 보내기 위해 읽을 수 있는 Amazon Simple Queue Service 대기열을 위한 것입니다.
주제를 보려면
-
Amazon SNS 콘솔에서 주제 페이지
를 엽니다. -
애플리케이션에서 생성한 주제를 찾습니다. 테이블 이름은 awseb로 시작하며 NewSignupTopic을 포함합니다.
-
구독을 보려는 주제를 찾습니다.
애플리케이션(app.js
)은 경로 2개를 정의합니다. 루트 경로(/
)는 사용자가 자신의 이름 및 이메일 주소를 등록하기 위해 작성한 양식과 함께 EJS(Embedded JavaScript) 템플릿에서 렌더링된 웹 페이지를 반환합니다. 이 양식을 제출하면 /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 테이블 생성
-
DynamoDB Management Console에서 테이블 페이지
를 엽니다. -
Create table(테이블 만들기)을 선택합니다.
-
Table name(테이블 이름)과 Primary key(기본 키)를 입력합니다.
-
기본 키 유형을 선택합니다.
-
Create(만들기)를 선택합니다.
애플리케이션별 구성 파일 업데이트
테이블을 하나 생성하는 대신 nodejs-tutorial 테이블을 사용하도록 애플리케이션 원본에서 구성 파일을 업데이트합니다.
프로덕션용으로 예제 애플리케이션을 업데이트하려면
-
현재 작업 디렉터리를 애플리케이션 디렉터리
nodejs-example-dynamo
로 변경합니다.~$
cd nodejs-example-dynamo
-
.ebextensions/options.config
를 열고 다음 설정의 값을 변경합니다.-
NewSignupEmail – 이메일 주소입니다.
-
STARTUP_SIGNUP_TABLE – nodejs-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
.
-
-
.ebextensions/create-dynamodb-table.config
를 제거합니다.~/nodejs-tutorial$
rm .ebextensions/create-dynamodb-table.config
다음에 애플리케이션을 배포할 때 이 구성 파일을 통해 생성한 테이블은 삭제됩니다.
-
eb deploy 명령으로 Elastic Beanstalk 환경에 업데이트된 애플리케이션을 배포합니다.
~/nodejs-example-dynamo$
eb deploy
-
환경 생성이 완료되면 eb open 명령을 사용하여 기본 브라우저에서 환경의 URL을 엽니다.
~/nodejs-example-dynamo$
eb open
배포 시 Elastic Beanstalk는 Amazon SNS 주제의 구성을 업데이트하고 애플리케이션의 첫 번째 버전을 배포할 때 생성한 DynamoDB 테이블을 삭제합니다.
이제, 환경을 종료하더라도 nodejs-tutorial 테이블이 삭제되지 않습니다. 따라서 블루/그린 배포를 수행하거나, 구성 파일을 수정하거나, 데이터 손실 위험 없이 웹사이트를 내릴 수 있습니다.
브라우저에서 사이트를 열고 양식이 예상대로 작동하는지 확인합니다. 몇 가지 항목을 만든 다음 DynamoDB 콘솔에서 테이블을 확인합니다.
테이블을 보려면
-
DynamoDB 콘솔에서 테이블 페이지
를 엽니다. -
nodejs-tutorial 테이블을 찾습니다.
-
테이블을 선택하고 항목을 선택한 다음 Start search(검색 시작)를 선택하여 테이블의 항목을 모두 볼 수 있습니다.
또한 Elastic Beanstalk가 이전에 생성한 테이블을 삭제했음을 알 수 있습니다.
고가용성을 위한 환경 구성
마지막으로, 최소 인스턴스 개수를 좀 더 늘린 상태에서 환경의 Auto Scaling 그룹을 구성합니다. 사용자 환경의 웹 서버가 단일 장애 지점이 되지 않도록 방지하고 사이트의 서비스를 중지하지 않고 변경 사항을 배포할 수 있도록 항상 두 개 이상의 인스턴스를 실행합니다.
고가용성을 위해 환경의 Auto Scaling 그룹을 구성하려면
Elastic Beanstalk 콘솔
을 열고 리전 목록에서를 선택합니다 AWS 리전. -
탐색 창에서 환경을 선택한 다음 목록에서 환경의 이름을 선택합니다.
참고
여러개의 환경을 보유한 경우 검색 창을 통해 환경 목록을 필터링합니다.
탐색 창에서 구성을 선택합니다.
-
[용량] 구성 범주에서 [편집]을 선택합니다.
-
Auto Scaling 그룹 섹션에서 최소 인스턴스를
2
로 설정합니다. -
변경 사항을 저장하려면 페이지 하단에서 적용을 선택합니다.
정리
Elastic Beanstalk 작업을 완료하면 환경을 종료할 수 있습니다. Elastic Beanstalk는 Amazon EC2 인스턴스, 데이터베이스 인스턴스, 로드 밸런서, 보안 그룹, 경보 등 환경과 연결된 모든 AWS 리소스를 종료합니다.
콘솔에서 Elastic Beanstalk 환경을 종료하려면
Elastic Beanstalk 콘솔
을 열고 리전 목록에서를 선택합니다 AWS 리전. -
탐색 창에서 환경을 선택한 다음 목록에서 환경의 이름을 선택합니다.
참고
여러개의 환경을 보유한 경우 검색 창을 통해 환경 목록을 필터링합니다.
-
작업(Actions)을 선택한 후 환경 종료(Terminate Environment)를 선택합니다.
-
화면에 표시되는 대화 상자를 사용하여 환경 종료를 확인합니다.
Elastic Beanstalk로 언제든지 애플리케이션을 위한 새로운 환경을 쉽게 생성할 수 있습니다.
생성한 외부 DynamoDB 테이블을 삭제할 수도 있습니다.
DynamoDB 테이블 삭제
-
DynamoDB 콘솔에서 테이블 페이지
를 엽니다. -
테이블을 선택합니다.
-
작업을 선택한 후 Delete table(테이블 삭제)를 선택합니다.
-
Delete(삭제)를 선택합니다.
다음 단계
예제 애플리케이션은 구성 파일을 사용하여 소프트웨어 설정을 구성하고 환경의 일부로 AWS 리소스를 생성합니다. 구성 파일 및 구성 파일의 사용에 대한 자세한 내용은 구성 파일(.ebextensions)을 사용하여 고급 환경 사용자 지정 단원을 참조하세요.
이 튜토리얼의 예제 애플리케이션에서는 Node.js용 Express 웹 프레임워크를 사용합니다. Express에 대한 자세한 내용은 expressjs.com
마지막으로, 프로덕션 환경에서 애플리케이션을 사용하려는 경우 환경에 대한 사용자 지정 도메인 이름을 구성하고 보안 연결을 위해 HTTPS를 활성화합니다.