

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

# Elastic Beanstalk로 Node.js 애플리케이션 배포
<a name="create_deploy_nodejs"></a>

이 장에서는 Node.js 웹 애플리케이션을 구성하고 배포하는 방법에 대한 지침을 제공합니다 AWS Elastic Beanstalk. 또한 데이터베이스 통합 및 Express 프레임워크 작업과 같은 일반적인 작업에 대한 연습도 제공합니다. Elastic Beanstalk를 통해 Amazon Web Services를 사용하는 Node.js 웹 애플리케이션을 손쉽게 배포, 관리 및 규모 조정할 수 있습니다.

Elastic Beanstalk 명령줄 인터페이스(EB CLI)를 사용하거나 Elastic Beanstalk 콘솔을 사용하여 단 몇 분 만에 애플리케이션을 배포할 수 있습니다. Elastic Beanstalk 애플리케이션을 배포한 후 EB CLI를 계속 사용하여 애플리케이션 및 환경을 관리하거나 AWS CLI Elastic Beanstalk 콘솔 또는 APIs를 사용할 수 있습니다.

[Node.js에 대한 QuickStart](nodejs-quickstart.md) 단계별 지침에 따라 EB CLI를 사용하여 *Hello World* Node.js 웹 애플리케이션을 생성하고 배포합니다.

**Topics**
+ [QuickStart: Elastic Beanstalk에 Node.js 애플리케이션 배포](nodejs-quickstart.md)
+ [Elastic Beanstalk를 위한 Node.js 개발 환경 설정](nodejs-devenv.md)
+ [Elastic Beanstalk Node.js 플랫폼 사용](create_deploy_nodejs.container.md)
+ [더 많은 Node.js용 Elastic Beanstalk 예제 애플리케이션 및 자습서](nodejs-getstarted.md)
+ [Elastic Beanstalk에 Node.js Express 애플리케이션 배포](create_deploy_nodejs_express.md)
+ [Elastic Beanstalk에 대한 클러스터링을 사용하여 Node.js Express 애플리케이션 배포](nodejs-express-clustering.md)
+ [Elastic Beanstalk에 DynamoDB를 사용하는 Node.js 애플리케이션 배포](nodejs-dynamodb-tutorial.md)
+ [Node.js Elastic Beanstalk 환경에 Amazon RDS DB 인스턴스 추가](create-deploy-nodejs.rds.md)
+ [Node.js 도구 및 리소스](create_deploy_nodejs.resources.md)

# QuickStart: Elastic Beanstalk에 Node.js 애플리케이션 배포
<a name="nodejs-quickstart"></a>

이 QuickStart 자습서에서는 Node.js 애플리케이션을 생성하고 AWS Elastic Beanstalk 환경에 배포하는 프로세스를 안내합니다.

**프로덕션용으로 사용 불가**  
예제는 설명용으로만 제공됩니다. 예제 애플리케이션을 프로덕션 환경에서 사용하지 마세요.

**Topics**
+ [AWS 계정](#nodejs-quickstart-aws-account)
+ [사전 조건](#nodejs-quickstart-prereq)
+ [1단계: Node.js 애플리케이션 생성](#nodejs-quickstart-create-app)
+ [2단계: 로컬에서 애플리케이션 실행](#nodejs-quickstart-run-local)
+ [3단계: EB CLI를 사용하여 Node.js 애플리케이션 배포](#nodejs-quickstart-deploy)
+ [4단계: Elastic Beanstalk에서 애플리케이션 실행](#nodejs-quickstart-run-eb-ap)
+ [5단계: 정리](#go-tutorial-cleanup)
+ [AWS 애플리케이션을 위한 리소스](#nodejs-quickstart-eb-resources)
+ [다음 단계](#nodejs-quickstart-next-steps)
+ [Elastic Beanstalk 콘솔을 사용하여 배포](#nodejs-quickstart-console)

## AWS 계정
<a name="nodejs-quickstart-aws-account"></a>

아직 AWS 고객이 아닌 경우 AWS 계정을 생성해야 합니다. 가입하면 Elastic Beanstalk 및 필요한 기타 AWS 서비스에 액세스할 수 있습니다.

이미 AWS 계정이 있는 경우 로 이동할 수 있습니다[사전 조건](#nodejs-quickstart-prereq).

### AWS 계정 생성
<a name="nodejs-quickstart-aws-account-procedure"></a>

#### 에 가입 AWS 계정
<a name="sign-up-for-aws"></a>

이 없는 경우 다음 단계를 AWS 계정완료하여 생성합니다.

**에 가입하려면 AWS 계정**

1. [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup)을 엽니다.

1. 온라인 지시 사항을 따르세요.

   등록 절차 중 전화 또는 텍스트 메시지를 받고 전화 키패드로 확인 코드를 입력하는 과정이 있습니다.

   에 가입하면 AWS 계정*AWS 계정 루트 사용자*이 생성됩니다. 루트 사용자에게는 계정의 모든 AWS 서비스 및 리소스에 액세스할 권한이 있습니다. 보안 모범 사례는 사용자에게 관리 액세스 권한을 할당하고, 루트 사용자만 사용하여 [루트 사용자 액세스 권한이 필요한 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)을 수행하는 것입니다.

AWS 는 가입 프로세스가 완료된 후 확인 이메일을 보냅니다. 언제든지 [https://aws.amazon.com/](https://aws.amazon.com/)으로 이동하고 **내 계정**을 선택하여 현재 계정 활동을 확인하고 계정을 관리할 수 있습니다.

#### 관리자 액세스 권한이 있는 사용자 생성
<a name="create-an-admin"></a>

에 가입한 후 일상적인 작업에 루트 사용자를 사용하지 않도록 관리 사용자를 AWS 계정보호 AWS IAM Identity Center, AWS 계정 루트 사용자활성화 및 생성합니다.

**보안 AWS 계정 루트 사용자**

1.  **루트 사용자를** 선택하고 AWS 계정 이메일 주소를 입력하여 계정 소유자[AWS Management Console](https://console.aws.amazon.com/)로에 로그인합니다. 다음 페이지에서 비밀번호를 입력합니다.

   루트 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS Sign-In 사용 설명서*의 [루트 사용자로 로그인](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)을 참조하세요.

1. 루트 사용자의 다중 인증(MFA)을 활성화합니다.

   지침은 *IAM 사용 설명서*의 [AWS 계정 루트 사용자(콘솔)에 대한 가상 MFA 디바이스 활성화를 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html).

**관리자 액세스 권한이 있는 사용자 생성**

1. IAM Identity Center를 활성화합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [AWS IAM Identity Center설정](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)을 참조하세요.

1. IAM Identity Center에서 사용자에게 관리 액세스 권한을 부여합니다.

   를 자격 증명 소스 IAM Identity Center 디렉터리 로 사용하는 방법에 대한 자습서는 사용 *AWS IAM Identity Center 설명서*[의 기본값으로 사용자 액세스 구성을 IAM Identity Center 디렉터리](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html) 참조하세요.

**관리 액세스 권한이 있는 사용자로 로그인**
+ IAM IDentity Center 사용자로 로그인하려면 IAM Identity Center 사용자를 생성할 때 이메일 주소로 전송된 로그인 URL을 사용합니다.

  IAM Identity Center 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS Sign-In 사용 설명서*[의 AWS 액세스 포털에 로그인](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)을 참조하세요.

**추가 사용자에게 액세스 권한 할당**

1. IAM Identity Center에서 최소 권한 적용 모범 사례를 따르는 권한 세트를 생성합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [Create a permission set](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)를 참조하세요.

1. 사용자를 그룹에 할당하고, 그룹에 Single Sign-On 액세스 권한을 할당합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [그룹 추가](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)를 참조하세요.

## 사전 조건
<a name="nodejs-quickstart-prereq"></a>

이 설명서의 절차를 수행하기 위해서는 실행 명령줄을 입력할 쉘 또는 터미널이 필요합니다. 명령은 프롬프트 기호(\$1)와 해당하는 경우 현재 디렉터리 이름 뒤에 리스트로 표시됩니다.

```
~/eb-project$ this is a command
this is output
```

Linux 및 macOS의 경우 선호하는 쉘과 패키지 관리자를 사용할 수 있습니다. Windows의 경우 [Linux용 Windows Subsystem을 설치](https://docs.microsoft.com/en-us/windows/wsl/install-win10)하여 Ubuntu 및 Bash의 Windows 통합 버전을 가져옵니다.

### EB CLI
<a name="nodejs-quickstart-prereq.ebcli"></a>

또한 본 자습서는 Elastic Beanstalk 명령줄 인터페이스(EB CLI)를 사용합니다. EB CLI 설치 및 구성에 대한 자세한 내용은 [설정 스크립트를 사용하여 EB CLI 설치(권장)](eb-cli3.md#eb-cli3-install) 및 [EB CLI 구성](eb-cli3-configuration.md) 단원을 참조하세요.

### Node.js
<a name="nodejs-quickstart-prereq.runtime"></a>

Node.js 웹 사이트에 [Node.js를 설치하는 방법](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs)을 따라 로컬 시스템에 Node.js를 설치합니다.

다음 명령을 실행하여 Node.js 설치를 확인합니다.

```
~$ node -v
```

## 1단계: Node.js 애플리케이션 생성
<a name="nodejs-quickstart-create-app"></a>

프로젝트 디렉터리를 만듭니다.

```
~$ mkdir eb-nodejs
~$ cd eb-nodejs
```

그 다음 Elastic Beanstalk를 사용하여 배포할 애플리케이션을 만듭니다. "Hello World" RESTful 웹 서비스를 만듭니다.

**Example `~/eb-nodejs/server.js`**  

```
const http = require('node:http');

const hostname = '127.0.0.1';
const port = 8080;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello Elastic Beanstalk!\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});
```

이 애플리케이션은 포트 8080에서 리스너를 엽니다. Elastic Beanstalk는 Node.js에 대해 기본적으로 포트 8080의 애플리케이션에 요청을 전달합니다.

## 2단계: 로컬에서 애플리케이션 실행
<a name="nodejs-quickstart-run-local"></a>

애플리케이션을 로컬로 배포하려면 다음 명령을 입력합니다.

```
~/eb-nodejs$ node server.js
```

다음과 같은 텍스트가 표시됩니다.

```
Server running at http://127.0.0.1:8080/
```

브라우저에 URL 주소 `http://127.0.0.1:8080/`을 입력합니다. 브라우저에 ‘Hello Elastic Beanstalk\$1’가 표시됩니다.

## 3단계: EB CLI를 사용하여 Node.js 애플리케이션 배포
<a name="nodejs-quickstart-deploy"></a>

다음 명령을 실행하여 이 애플리케이션에 대한 Elastic Beanstalk 환경을 생성합니다.

**환경을 생성하고 Node.js 애플리케이션을 배포하려면**

1. **eb init** 명령으로 EB CLI 리포지토리를 초기화합니다.

   ```
   ~/eb-nodejs$ eb init -p node.js nodejs-tutorial --region us-east-2
   ```

   이 명령은 `nodejs-tutorial`이라는 애플리케이션을 생성하고 최신 Node.js 플랫폼 버전을 통해 환경을 생성하도록 로컬 리포지토리를 구성합니다.

1. (선택 사항) SSH를 통해 애플리케이션을 실행하는 EC2 인스턴스에 연결할 수 있도록 **eb init**를 다시 실행하여 기본 키 페어를 구성합니다.

   ```
   ~/eb-nodejs$ eb init
   Do you want to set up SSH for your instances?
   (y/n): y
   Select a keypair.
   1) my-keypair
   2) [ Create new KeyPair ]
   ```

   키 페어가 이미 있는 경우 이를 선택하거나, 프롬프트에 따라 키 페어를 생성합니다. 프롬프트가 보이지 않거나 나중에 설정을 변경해야 하는 경우 **eb init -i**를 실행합니다.

1. 환경을 만들고 **eb create**로 해당 환경에 애플리케이션을 배포합니다. Elastic Beanstalk는 애플리케이션의 zip 파일을 자동으로 빌드하여 환경의 EC2 인스턴스에 배포합니다. 애플리케이션을 배포한 후 Elastic Beanstalk가 포트 8080에서 이 애플리케이션을 시작합니다.

   ```
   ~/eb-nodejs$ eb create nodejs-env
   ```

   Elastic Beanstalk에서 환경을 생성하는 데 약 5분이 걸립니다.

## 4단계: Elastic Beanstalk에서 애플리케이션 실행
<a name="nodejs-quickstart-run-eb-ap"></a>

환경 생성 프로세스가 완료되면 **eb open**으로 웹 사이트를 엽니다.

```
~/eb-nodejs$ eb open
```

축하합니다\$1 Elastic Beanstalk를 사용하여 Node.js 애플리케이션을 배포했습니다\$1 그러면 애플리케이션에 대해 생성된 도메인 이름을 사용하여 브라우저 창이 열립니다.

## 5단계: 정리
<a name="go-tutorial-cleanup"></a>

애플리케이션 작업을 완료하면 환경을 종료할 수 있습니다. Elastic Beanstalk는 환경과 연결된 모든 AWS 리소스를 종료합니다.

EB CLI를 사용하여 Elastic Beanstalk 환경을 종료하려면 다음 명령을 실행하세요.

```
~/eb-nodejs$ eb terminate
```

## AWS 애플리케이션을 위한 리소스
<a name="nodejs-quickstart-eb-resources"></a>

단일 인스턴스 애플리케이션을 생성했습니다. 이 애플리케이션은 단일 EC2 인스턴스를 사용하는 간단한 샘플 애플리케이션 역할을 하므로 로드 밸런싱이나 오토 스케일링이 필요하지 않습니다. 단일 인스턴스 애플리케이션의 경우 Elastic Beanstalk는 다음 AWS 리소스를 생성합니다.
+ **EC2 인스턴스** - 선택한 플랫폼에서 웹 앱을 실행하도록 구성된 Amazon EC2 가상 머신입니다.

  특정 언어 버전, 프레임워크, 웹 컨테이너 또는 조합을 지원하도록 각 플랫폼마다 실행하는 소프트웨어, 구성 파일 및 스크립트 세트가 다릅니다. 대부분의 플랫폼에서는 웹 앱 앞의 웹 트래픽을 처리하고, 웹 앱으로 요청을 전달하고, 정적 자산을 제공하고, 액세스 및 오류 로그를 생성하는 역방향 프록시로 Apache 또는 nginx를 사용합니다.
+ **인스턴스 보안 그룹** - 포트 80에서 수신 트래픽을 허용하도록 구성된 Amazon EC2 보안 그룹입니다. 이 리소스를 통해 로드 밸런서의 HTTP 트래픽이 웹 앱을 실행하는 EC2 인스턴스에 도달할 수 있습니다. 기본적으로 다른 포트에서는 트래픽이 허용되지 않습니다.
+ **Amazon S3 버킷(Amazon S3 bucket)** - Elastic Beanstalk 사용 시 생성된 소스 코드, 로그 및 기타 아티팩트의 스토리지 위치입니다.
+ **Amazon CloudWatch 경보** - 환경의 인스턴스에 대한 로드를 모니터링하는 두 개의 CloudWatch 경보로, 로드가 너무 높거나 너무 낮은 경우 트리거됩니다. 경보가 트리거되면 이에 대한 응답으로 Auto Scaling 그룹이 스케일 업 또는 축소됩니다.
+ **CloudFormation 스택** - Elastic Beanstalk는 CloudFormation 를 사용하여 환경에서 리소스를 시작하고 구성 변경 사항을 전파합니다. 리소스는 [CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation)에서 볼 수 있는 템플릿에서 정의됩니다.
+  **도메인 이름(Domain name)** - **subdomain*.*region*.elasticbeanstalk.com* 형식으로 웹 앱으로 라우팅되는 도메인 이름입니다.

이러한 모든 리소스는 Elastic Beanstalk에서 관리합니다. 사용자가 환경을 종료하면 Elastic Beanstalk는 환경에 있는 모든 리소스를 종료합니다.

## 다음 단계
<a name="nodejs-quickstart-next-steps"></a>

애플리케이션을 실행하는 환경이 있으면 언제든 다른 애플리케이션 또는 애플리케이션의 새 버전을 배포할 수 있습니다. EC2 인스턴스를 프로비저닝하거나 다시 시작할 필요가 없기 때문에 새 애플리케이션 버전을 매우 빠르게 배포할 수 있습니다. Elastic Beanstalk 콘솔을 사용하여 새로운 환경을 탐색할 수도 있습니다. 자세한 단계는 이 가이드의 *시작하기* 장의 [환경 탐색](GettingStarted.md#GettingStarted.Explore)을 참조하세요.

**더 많은 자습서 보기**  
다른 예제 애플리케이션으로 다른 자습서를 사용하려는 경우 [더 많은 Node.js용 Elastic Beanstalk 예제 애플리케이션 및 자습서](nodejs-getstarted.md) 단원을 참조하세요.

샘플 애플리케이션을 하나 이상 배포하고 Node.js 애플리케이션을 로컬로 개발하고 실행할 준비가 되면 [Elastic Beanstalk를 위한 Node.js 개발 환경 설정](nodejs-devenv.md) 단원을 참조하세요.

## Elastic Beanstalk 콘솔을 사용하여 배포
<a name="nodejs-quickstart-console"></a>

Elastic Beanstalk 콘솔을 사용하여 샘플 애플리케이션을 시작할 수도 있습니다. 자세한 단계는 이 가이드의 *시작하기* 장의 [예제 애플리케이션 생성](GettingStarted.md#GettingStarted.CreateApp)을 참조하세요.

# Elastic Beanstalk를 위한 Node.js 개발 환경 설정
<a name="nodejs-devenv"></a>

이 주제에서는 AWS Elastic Beanstalk로 배포하기 전 로컬 컴퓨터에서 애플리케이션을 테스트하기 위해 Node.js 개발 환경을 설정하는 지침을 제공합니다. 또한 유용한 도구에 대한 설치 지침을 제공하는 웹 사이트도 알려줍니다.

**Topics**
+ [Node.js를 설치합니다.](#nodejs-devenv-nodejs)
+ [npm 설치 확인](#nodejs-devenv-npm)
+ [AWS SDK for Node.js 설치](#nodejs-devenv-awssdk)
+ [익스프레스 제너레이터 설치](#nodejs-devenv-express)
+ [익스프레스 프레임워크 및 서버 설정](#nodejs-devenv-express-framework)

## Node.js를 설치합니다.
<a name="nodejs-devenv-nodejs"></a>

Node.js를 설치하여 Node.js 애플리케이션을 로컬에서 실행합니다. 기본 설정이 없다면 Elastic Beanstalk에서 지원하는 최신 버전을 가져옵니다. 지원되는 버전 목록은 *AWS Elastic Beanstalk 플랫폼* 문서의 [Node.js](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)를 참조하세요.

[nodejs.org](https://nodejs.org/en/)에서 Node.js를 다운로드하십시오.

## npm 설치 확인
<a name="nodejs-devenv-npm"></a>

Node.js는 npm 패키지 관리자를 사용하여 애플리케이션에서 사용할 도구와 프레임워크의 설치를 도와줍니다. npm은 Node.js와 함께 배포되기 때문에 Node.js를 다운로드하고 설치할 때 자동으로 설치됩니다. npm이 설치되어 있는지 확인하려면 다음 명령을 실행할 수 있습니다.

```
$ npm -v
```

npm에 대한 자세한 내용은 [npmjs](https://www.npmjs.com/get-npm) 웹 사이트를 참조하세요.

## AWS SDK for Node.js 설치
<a name="nodejs-devenv-awssdk"></a>

애플리케이션 내에서 AWS 리소스를 관리해야 하는 경우 Node.js에 JavaScript용 AWS SDK를 설치합니다. npm을 사용하여 SDK를 설치합니다.

```
$ npm install aws-sdk
```

자세한 내용은 [AWS SDK for JavaScript in Node.js](https://aws.amazon.com/sdk-for-node-js/) 홈페이지를 참조하세요.

## 익스프레스 제너레이터 설치
<a name="nodejs-devenv-express"></a>

Express는 Node.js에서 실행되는 웹 애플리케이션 프레임워크입니다. 이를 사용하려면 먼저 Express 생성기 명령줄 애플리케이션을 설치하십시오. Express 생성기가 설치되면**express** 명령을 실행하여 웹 애플리케이션의 기본 프로젝트 구조를 생성할 수 있습니다. 기본 프로젝트, 파일 및 종속성이 설치되면 개발 컴퓨터에서 로컬 Express 서버를 시작할 수 있습니다.

 

**참고**  
다음은 Linux 운영 체제에서 Express를 설정하는 과정을 안내합니다.
시스템 디렉터리에 대한 권한 수준에 따라 이러한 명령 일부의 접두사를 `sudo`로 입력해야 할 수도 있습니다.

**개발 환경에 익스프레스 제너레이터를 설치하려면**

1. Express 프레임워크 및 서버의 작업 디렉터리를 생성합니다.

   ```
   ~$ mkdir node-express
   ~$ cd node-express
   ```

1. `express` 명령에 액세스할 수 있도록 Express를 전역으로 설치합니다.

   ```
   ~/node-express$ npm install -g express-generator
   ```

1. 운영 체제에 따라 `express` 명령을 실행할 경로를 설정해야 할 수 있습니다. 경로 변수를 설정해야 한다면 이전 단계의 출력을 사용합니다. 다음은 Linux의 예제입니다.

   ```
   ~/node-express$ export PATH=$PATH:/usr/local/share/npm/bin/express
   ```

   이 장의 튜토리얼을 따라가려면 다른 디렉터리에서**express** 명령을 실행해야 합니다. 각 튜토리얼은 자체 디렉터리에 기본 Express 프로젝트 구조를 설정합니다.

이제 Express 명령줄 생성기가 설치되었습니다. 이를 사용하여 웹 애플리케이션의 프레임워크 디렉터리를 만들고, 종속성을 설정하고, 웹 앱 서버를 시작할 수 있습니다. 다음으로 생성한`node-express` 디렉터리에서 이 작업을 수행하는 단계를 살펴보겠습니다.

## 익스프레스 프레임워크 및 서버 설정
<a name="nodejs-devenv-express-framework"></a>

다음 단계에 따라 기본 Express 프레임워크 디렉터리와 콘텐츠를 생성하십시오. 이 장의 자습서에는 각 자습서의 응용 프로그램 디렉터리에서 기본 Express 프레임워크를 설정하는 다음 단계도 포함되어 있습니다.

**익스프레스 프레임워크 및 서버 설정하려면**

1. `express` 명령을 실행합니다. 이는 `package.json`, `app.js` 및 몇 개의 디렉터리를 생성합니다.

   ```
   ~/node-express$ express
   ```

   계속할지 여부를 묻는 메시지가 표시되면 **y**를 입력합니다.

1. 로컬 종속 항목을 설정합니다.

   ```
   ~/node-express$ npm install
   ```

1. 웹 앱 서버가 시작되는지 확인합니다.

   ```
   ~/node-express$ npm start
   ```

   다음과 유사한 출력 화면이 표시되어야 합니다.

   ```
   > nodejs@0.0.0 start /home/local/user/node-express
   > node ./bin/www
   ```

   서버는 기본적으로 포트 3000에서 실행됩니다. 테스트하려면 다른 터미널에서 `curl http://localhost:3000`을 실행하거나 로컬 컴퓨터에서 브라우저를 열고 `http://localhost:3000`으로 이동하십시오.

   **Ctrl\$1C**를 눌러 서버를 중지합니다.

# Elastic Beanstalk Node.js 플랫폼 사용
<a name="create_deploy_nodejs.container"></a>

이 주제에서는 Elastic Beanstalk에서 Node.js 애플리케이션을 구성, 빌드 및 실행하는 방법을 설명합니다.

AWS Elastic Beanstalk 는 다양한 버전의 Node.js 프로그래밍 언어에 대해 여러 플랫폼 브랜치를 지원합니다. 전제 목록은 *AWS Elastic Beanstalk 플랫폼* 문서의 [Node.js](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)를 참조하세요.

Elastic Beanstalk에서는 Elastic Beanstalk 환경의 EC2 인스턴스에서 실행하는 소프트웨어를 사용자 지정하는 데 사용할 수 있는 [구성 옵션](command-options.md)을 제공합니다. 애플리케이션에 필요한 [환경 변수를 구성](environments-cfg-softwaresettings.md#environments-cfg-softwaresettings-console)하고, Amazon S3에 대한 로그 교체를 활성화하며, 정적 파일이 포함된 애플리케이션 소스의 폴더를 프록시 서버에서 제공하는 경로로 매핑할 수 있습니다.

[실행 환경 구성을 수정](environment-configuration-methods-after.md)하기 위해 Elastic Beanstalk 콘솔의 구성 옵션을 사용할 수 있습니다. [저장된 구성](environment-configuration-savedconfig.md)을 사용해 설정을 저장하면 환경 종료 시 구성이 훼손되지 않도록 할 수 있으며, 추후 기타 환경에서도 적용할 수 있습니다.

소스 코드에 설정을 저장하려면 [구성 파일](ebextensions.md)을 포함시킬 수 있습니다. 구성 파일 설정은 환경을 생성하거나 애플리케이션을 배포할 때마다 적용됩니다. 구성 파일을 사용하여 패키지를 설치하거나, 스크립트를 실행하거나, 배포 중 기타 인스턴스 사용자 지정 작업을 수행할 수 있습니다.

배포 중에 패키지를 설치하고 시작 명령을 제공하고 애플리케이션이 사용할 Node.js 버전을 지정하기 위해 소스 번들에 [`Package.json` 파일을 포함](nodejs-platform-dependencies.md#nodejs-platform-packagejson)할 수 있습니다. 종속성 버전을 잠그는 [`npm-shrinkwrap.json` 파일](nodejs-platform-shrinkwrap.md)을 포함할 수 있습니다.

Node.js 플랫폼은 정적 자산을 제공하고, 애플리케이션에 트래픽을 전달하며, 응답을 압축하는 프록시 서버를 포함합니다. 고급 시나리오를 위한 [기본 프록시 구성을 확장하거나 재정의](nodejs-platform-proxy.md)할 수 있습니다.

애플리케이션을 시작하는 데는 몇 가지 옵션이 있습니다. 소스 번들에 [Procfile](nodejs-configuration-procfile.md)을 추가하여 애플리케이션을 시작하는 명령을 지정할 수 있습니다. `Procfile`을 제공하지 않고 `package.json` 파일을 제공할 경우 Elastic Beanstalk가 `npm start`를 실행합니다. 둘 중 하나를 제공하지 않으면 Elastic Beanstalk에서 `app.js` 또는 `server.js` 파일을 이 순서대로 찾아서 스크립트를 실행합니다.

Elastic Beanstalk 콘솔에 적용된 설정이 구성 파일에 적용된 동일한 설정(있는 경우)을 덮어씁니다. 이렇게 함으로써 구성 파일은 기본 설정을 갖는 동시에 콘솔에서 환경 특정 설정으로 설정을 덮어 쓸 수 있습니다. 우선 적용 및 설정을 변경하는 다른 방법에 대한 자세한 내용은 [구성 옵션](command-options.md) 단원을 참조하십시오.

Elastic Beanstalk Linux 기반 플랫폼을 확장할 수 있는 다양한 방법에 대한 자세한 내용은 [Elastic Beanstalk Linux 플랫폼 확장](platforms-linux-extend.md) 단원을 참조하세요.

## Node.js 환경 구성
<a name="nodejs-platform-console"></a>

Node.js 플랫폼 설정을 사용하여 Amazon EC2 인스턴스의 동작을 미세 조정할 수 있습니다. Elastic Beanstalk 콘솔을 사용하여 Elastic Beanstalk 환경의 Amazon EC2 인스턴스 구성을 편집할 수 있습니다.

Elastic Beanstalk 콘솔을 사용하여 Amazon S3에 대한 로그 교체를 활성화하고, 애플리케이션에서 읽을 수 있도록 환경 변수를 구성합니다.

**Elastic Beanstalk 콘솔에서 Node.js 환경을 구성하려면**

1. [Elastic Beanstalk 콘솔](https://console.aws.amazon.com/elasticbeanstalk)을 열고 **리전** 목록에서를 선택합니다 AWS 리전.

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

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

1. **업데이트, 모니터링 및 로깅** 구성 범주에서 **편집**을 선택합니다.

### 컨테이너 옵션
<a name="nodejs-platform-console-settings"></a>

다음과 같은 플랫폼별 옵션을 지정할 수 있습니다.
+ **프록시 서버** – 환경 인스턴스에서 사용할 프록시 서버입니다. 기본적으로 NGINX가 사용됩니다.

### 로그 옵션
<a name="nodejs-platform-console-logging"></a>

**로그 옵션** 섹션에는 다음 두 가지 설정이 있습니다.
+ **인스턴스 프로파일** – 애플리케이션과 연결된 Amazon S3 버킷에 액세스할 권한이 있는 인스턴스 프로파일을 지정합니다.
+ **Amazon S3에 대한 로그 파일 교체 활성화(Enable log file rotation to Amazon S3)** – 애플리케이션과 연결된 Amazon S3 버킷에 애플리케이션의 Amazon EC2 인스턴스에 대한 로그 파일을 복사하는지 여부를 지정합니다.

### 정적 파일
<a name="nodejs-platform-console-staticfiles"></a>

성능을 증진하려면 **정적 파일(Static files)** 섹션에서 프록시 서버를 구성하여 웹 애플리케이션 내부 디렉터리 집합으로 정적 파일(예: HTML 또는 이미지)을 제공할 수 있습니다. 각 디렉터리의 디렉터리 매핑 가상 경로를 설정합니다. 지정된 경로에서 프록시 서버가 파일 요청을 수신받으면 요청을 애플리케이션으로 라우팅하지 않고 파일을 직접 제공합니다.

구성 파일 또는 Elastic Beanstalk 콘솔을 사용하여 정적 파일을 구성하는 방법에 대한 자세한 내용은 [정적 파일 제공](environment-cfg-staticfiles.md) 단원을 참조하세요.

### 환경 속성
<a name="nodejs-platform-console-envprops"></a>

**환경 속성** 섹션을 사용하여 애플리케이션을 실행하는 Amazon EC2 인스턴스의 환경 속성 설정을 지정할 수 있습니다. 이 설정은 키 값 페어로 애플리케이션에 전달됩니다.

가 실행되는 Node.js 환경 내에서를 실행하여 환경 변수에 액세스할 AWS Elastic Beanstalk수 있습니다`process.env.ENV_VARIABLE`.

```
var endpoint = process.env.API_ENDPOINT
```

Node.js 플랫폼은 PORT 환경 변수를 프록시 서버가 트래픽을 전달할 포트로 설정합니다. 자세한 내용은 [프록시 서버 구성](nodejs-platform-proxy.md) 단원을 참조하십시오.

자세한 정보는 [환경 변수 및 기타 소프트웨어 설정](environments-cfg-softwaresettings.md)을 참조하세요.

### Amazon Linux AMI(이전 Amazon Linux 2) Node.js 환경 구성
<a name="nodejs-platform-console.alami"></a>

다음 콘솔 소프트웨어 구성 범주는 Amazon Linux AMI 플랫폼 버전(이전 Amazon Linux 2)을 사용하는 Elastic Beanstalk Node.js 환경에서만 지원됩니다.

**참고**  
이 주제의 정보는 Amazon Linux AMI(AL1) 기반 플랫폼 브랜치에만 적용됩니다. AL2023/AL2 플랫폼 브랜치는 이전 Amazon Linux AMI(AL1) 플랫폼 버전과 호환되지 않으며 *다른 구성 설정이 필요*합니다.
 [2022년 7월 18일](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html), Elastic Beanstalk는 Amazon Linux AMI(AL1)에 기반한 모든 플랫폼 브랜치의 상태를 **사용 중지**로 설정했습니다. 완전 지원이 가능한 현재 Amazon Linux 2023 플랫폼 브랜치로 마이그레이션하는 방법에 대한 자세한 내용은 [Elastic Beanstalk Linux 애플리케이션을 Amazon Linux 2023 또는 Amazon Linux 2로 마이그레이션](using-features.migration-al.md)을(를) 참조하세요.

#### 컨테이너 옵션 — Amazon Linux AMI(AL1)
<a name="nodejs-platform-console-settings"></a>

구성 페이지에서 다음을 지정합니다.
+ **프록시 서버(Proxy server)** – Node.js 연결에 프록시하는 데 사용할 웹 서버를 지정합니다. 기본적으로 NGINX가 사용됩니다. **없음(none)**을 선택하면 정적 파일 매핑이 적용되지 않으며 GZIP 압축이 비활성화됩니다.
+ **Node.js 버전( version)** – Node.js의 버전을 지정합니다. 지원되는 Node.js 버전 목록은 *AWS Elastic Beanstalk 플랫폼* 안내서의 [https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)를 참조하세요.
+ **GZIP 압축( compression)** – GZIP 압축의 활성화 여부를 지정합니다. GZIP 압축은 기본적으로 활성화되어 있습니다.
+ **노드 명령(Node command)** – Node.js 애플리케이션을 시작할 때 사용하는 명령을 입력할 수 있습니다. 빈 문자열(기본값)은 Elastic Beanstalk에서 `app.js`와 `server.js`를 사용한 후 `npm start`를 사용합니다.

## Node.js 구성 네임스페이스
<a name="nodejs-namespaces"></a>

[구성 파일](ebextensions.md)을 사용하여 구성 옵션을 설정하고 배포 중 다른 인스턴스 구성 작업을 수행할 수 있습니다. 구성 옵션은 [플랫폼별](command-options-specific.md)로 다르거나 Elastic Beanstalk 서비스의 [모든 플랫폼](command-options-general.md)에 전체적으로 적용될 수 있습니다. 구성 옵션은 *네임스페이스*로 구성됩니다.

`aws:elasticbeanstalk:environment:proxy` 네임스페이스를 사용하여 환경 인스턴스에서 사용할 프록시를 선택할 수 있습니다. 다음 예제에서는 Apache HTTPD 프록시 서버를 사용하도록 환경을 구성합니다.

**Example .ebextensions/nodejs-settings.config**  

```
option_settings:
  aws:elasticbeanstalk:environment:proxy:
    ProxyServer: apache
```

`aws:elasticbeanstalk:environment:proxy:staticfiles` 네임스페이스를 사용하여 정적 파일을 제공하도록 프록시를 구성할 수 있습니다. 자세한 내용과 예제는 [정적 파일 제공](environment-cfg-staticfiles.md) 섹션을 참조하세요.

Elastic Beanstalk는 사용자가 환경을 맞춤형으로 지정할 수 있는 다양한 구성 옵션을 제공합니다. 구성 파일 외에 콘솔, 저장된 구성, EB CLI 또는 AWS CLI를 통해 구성 옵션을 설정할 수도 있습니다. 자세한 정보는 [구성 옵션](command-options.md)을 참조하세요.

## Amazon Linux AMI(이전 Amazon Linux 2) Node.js 플랫폼
<a name="nodejs.alami"></a>

Elastic Beanstalk Node.js 환경에서 Amazon Linux AMI 플랫폼 버전(이전 Amazon Linux 2)을 사용하는 경우, 이 섹션의 구체적인 구성 및 권장 사항을 고려하세요.

**참고**  
이 주제의 정보는 Amazon Linux AMI(AL1) 기반 플랫폼 브랜치에만 적용됩니다. AL2023/AL2 플랫폼 브랜치는 이전 Amazon Linux AMI(AL1) 플랫폼 버전과 호환되지 않으며 *다른 구성 설정이 필요*합니다.
 [2022년 7월 18일](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html), Elastic Beanstalk는 Amazon Linux AMI(AL1)에 기반한 모든 플랫폼 브랜치의 상태를 **사용 중지**로 설정했습니다. 완전 지원이 가능한 현재 Amazon Linux 2023 플랫폼 브랜치로 마이그레이션하는 방법에 대한 자세한 내용은 [Elastic Beanstalk Linux 애플리케이션을 Amazon Linux 2023 또는 Amazon Linux 2로 마이그레이션](using-features.migration-al.md)을(를) 참조하세요.

### Node.js 플랫폼별 구성 옵션 — Amazon Linux AMI(AL1)
<a name="nodejs.alami.options"></a>

Elastic Beanstalk는 Amazon Linux AMI Node.js 플랫폼 버전에 대한 일부 플랫폼별 구성 옵션을 지원합니다. 애플리케이션보다 먼저 실행되는 프록시 서버, 실행할 Node.js의 특정 버전, 애플리케이션 실행 명령을 선택할 수 있습니다.

프록시 서버의 경우 NGINX 또는 Apache 프록시 서버를 사용할 수 있습니다. `none` 값을 `ProxyServer` 옵션으로 설정할 수 있습니다. 이 설정을 사용하면 Elastic Beanstalk는 프록시 서버 뒤가 아닌 독립 실행형으로 애플리케이션을 실행합니다. 사용자 환경에서 독립 실행형 애플리케이션을 실행하는 경우 NGINX가 트래픽을 전달하는 포트를 수신하도록 코드를 업데이트합니다.

```
var port = process.env.PORT || 8080;

app.listen(port, function() {
  console.log('Server running at http://127.0.0.1:%s', port);
});
```

### Node.js 언어 버전 — Amazon Linux AMI(AL1)
<a name="nodejs.alami.versions"></a>

지원되는 언어 버전의 측면에서 Node.js Amazon Linux AMI 플랫폼은 다른 Elastic Beanstalk 관리형 플랫폼과 다릅니다. 이는 각 Node.js 플랫폼 버전이 일부 Node.js 언어 버전만 지원하기 때문입니다. 지원되는 Node.js 버전 목록은 *AWS Elastic Beanstalk 플랫폼* 안내서의 [https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)를 참조하세요.

플랫폼별 구성 옵션을 사용하여 언어 버전을 설정할 수 있습니다. 지침은 [Node.js 환경 구성](#nodejs-platform-console) 섹션을 참조하세요. 또는 Elastic Beanstalk 콘솔을 사용하여 플랫폼 버전 업데이트의 일부로 환경에서 사용하는 Node.js 버전을 업데이트합니다.

**참고**  
현재 사용 중인 Node.js 버전에 대한 지원이 플랫폼에서 제거되면 [플랫폼 업데이트](using-features.platform.upgrade.md)를 수행하기 전에 버전 설정을 변경하거나 제거해야 합니다. 하나 이상의 Node.js 버전에 대해 보안 취약성이 발견된 경우 이러한 상황이 발생할 수 있습니다.  
이러한 상황이 발생하면 구성된 [NodeVersion](command-options-specific.md#command-options-nodejs)을 지원하지 않는 새 플랫폼 버전으로 업데이트할 수 없습니다. 새 환경을 생성할 필요가 없도록 하기 위해 *NodeVersion* 구성 옵션을 이전 플랫폼 버전과 새 플랫폼 버전에서 모두 지원하는 Node.js 버전으로 변경하거나 [옵션 설정을 제거](environment-configuration-methods-after.md)한 후 플랫폼 업데이트를 수행합니다.

**Elastic Beanstalk 콘솔에서 환경의 Node.js 버전을 구성하려면**

1. [Elastic Beanstalk 콘솔](https://console.aws.amazon.com/elasticbeanstalk)을 열고 **리전** 목록에서를 선택합니다 AWS 리전.

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

1. 환경 개요 페이지의 [**플랫폼**]에서 [**변경**]을 선택합니다.

1. **플랫폼 버전 업데이트(Update platform version)** 대화 상자에서 Node.js 버전을 선택합니다.  
![\[Elastic Beanstalk 업데이트 플랫폼 버전 확인\]](http://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/images/platform-nodejs-update-node-version.png)

1. **저장**을 선택합니다.

### Node.js 구성 네임스페이스 — Amazon Linux AMI(AL1)
<a name="nodejs.alami.namespaces"></a>

Node.js Amazon Linux AMI 플랫폼은 `aws:elasticbeanstalk:container:nodejs:staticfiles` 및 `aws:elasticbeanstalk:container:nodejs` 네임스페이스에서 추가 옵션을 정의합니다.

다음 구성 파일은 Elastic Beanstalk에 애플리케이션을 실행할 때 `npm start`을(를) 사용하도록 알려줍니다. 또한 프록시 유형을 Apache로 설정하고 압축을 활성화합니다. 마지막으로 두 개의 소스 디렉터리에서 정적 파일을 제공하도록 프록시를 구성합니다. 한 소스는 `statichtml` 소스 디렉터리의 웹 사이트 루트 아래 `html` 경로에 있는 HTML  파일입니다. 다른 소스는 `staticimages` 소스 디렉토리의 웹 사이트 루트 아래 `images` 경로에 있는 이미지 파일입니다.

**Example .ebextensions/node-settings.config**  

```
option_settings:
  aws:elasticbeanstalk:container:nodejs: 
    NodeCommand: "npm start"
    ProxyServer: apache
    GzipCompression: true
  aws:elasticbeanstalk:container:nodejs:staticfiles:
    /html: statichtml
    /images: staticimages
```

Elastic Beanstalk는 사용자가 환경을 맞춤형으로 지정할 수 있는 다양한 구성 옵션을 제공합니다. 구성 파일 외에 콘솔, 저장된 구성, EB CLI 또는 AWS CLI를 통해 구성 옵션을 설정할 수도 있습니다. 자세한 정보는 [구성 옵션](command-options.md)을 참조하세요.

# Elastic Beanstalk에서 Procfile을 사용하여 사용자 지정 시작 명령 구성
<a name="nodejs-configuration-procfile"></a>

애플리케이션을 시작하는 명령을 지정하려면 소스 번들의 루트에 `Procfile`이라는 파일을 포함합니다.

**Example Procfile**  

```
web: node index.js
```

`Procfile` 사용에 대한 자세한 내용은 [Buildfile 및 Procfile](platforms-linux-extend.build-proc.md) 단원을 참조하세요.

**참고**  
이 기능은 `aws:elasticbeanstalk:container:nodejs` 네임스페이스의 레거시 `NodeCommand` 옵션을 대체합니다.

# Elastic Beanstalk에서 애플리케이션 종속성 구성
<a name="nodejs-platform-dependencies"></a>

애플리케이션에는 `require()` 문에서 지정하는 모듈과 같이 일부 Node.js 모듈에 종속성이 있을 수 있습니다. 이러한 모듈은 `node_modules` 디렉터리에 저장됩니다. 애플리케이션이 실행될 경우 Node.js가 이 디렉터리에서 모듈을 로드합니다. 자세한 내용은 Node.js 문서의 [Loading from node\$1modules folders](https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders)를 참조하세요.

`package.json` 파일을 사용하여 이러한 모듈 종속성을 지정할 수 있습니다. Elastic Beanstalk가 이 파일을 감지하고 `node_modules` 디렉터리가 존재하지 않을 경우에 Elastic Beanstalk은 `npm install`를 *웹 앱*유저로 실행합니다. 이 `npm install` 명령은 Elastic Beanstalk가 미리 만드는 `node_modules` 디렉터리에 종속성을 설치합니다. 이 `npm install` 명령은 퍼블릭 npm 레지스트리 또는 기타 위지 `package.json` 파일에 나열되어 있는 패키지에 액세스합니다. 자세한 내용은 [npm Docs](https://docs.npmjs.com/about-the-public-npm-registry) 웹 사이트를 참조하세요.

Elastic Beanstalk가 `node_modules` 디렉터리를 감지할 경우, Elastic Beanstalk는 `package.json` 파일이 존재하더라도 `npm install`을 실행하지 않습니다. Elastic Beanstalk는 Node.js가 액세스하고 로드할 수 있도록 `node_modules` 디렉터리에서 종속성 패키지를 사용할 수 있다고 가정합니다.

다음 섹션에서는 해당 애플리케이션에 대한 Node.js 모듈 종속성을 설정하는 방법에 대한 추가 정보를 제공합니다.

**참고**  
.Elastic Beanstalk가 `npm install`을 실행 중일 때 배포 문제가 발생할 경우 다른 접근 방식을 고려하세요. 애플리케이션 소스 번들에 종속성 모듈과 함께 `node_modules` 디렉터리를 포함하세요. 이 작업을 수행할 경우 문제를 조사하는 동안 퍼블릭 npm 레지스트리에서 종속성을 설치하는 문제를 방지할 수 있습니다. 종속성 모듈은 로컬 디렉터리에서 제공되기 때문에 이 작업을 수행하면 배포 시간 단축에도 도움이 될 수도 있습니다. 자세한 내용은 [node\$1modules 디렉터리에 Node.js 종속성 포함](#nodejs-platform-nodemodules) 섹션을 참조하세요.

## package.json 파일로 Node.js 종속성 지정
<a name="nodejs-platform-packagejson"></a>

프로젝트 소스의 루트에 있는 `package.json` 파일을 포함하여 종속성 패키지를 지정하고 start 명령을 제공합니다. `package.json` 파일이 존재하고 프로젝트 소스의 루트에 `node_modules` 디렉터리가 없는 경우에는 Elastic Beanstalk가 `npm install`을 *웹 앱* 사용자로 실행하여 퍼블릭 npm 레지스트리의 종속성을 설치합니다. 또한 Elastic Beanstalk는 `start` 명령을 사용하여 애플리케이션을 시작합니다. `package.json` 파일에 대한 자세한 내용은 *npm Docs* 웹 사이트의 [Specifying dependencies in a `package.json` file](https://docs.npmjs.com/specifying-dependencies-and-devdependencies-in-a-package-json-file)을 참조하세요.

`scripts` 키워드를 사용하여 start 명령을 제공합니다. 현재 `aws:elasticbeanstalk:container:nodejs` 네임스페이스의 레거시 `NodeCommand` 옵션 대신 `scripts` 키워드가 사용됩니다.

**Example package.json – Express**  

```
{
    "name": "my-app",
    "version": "0.0.1",
    "private": true,
    "dependencies": {
      "ejs": "latest",
      "aws-sdk": "latest",
      "express": "latest",
      "body-parser": "latest"
    },
    "scripts": {
      "start": "node app.js"
    }
  }
```

**프로덕션 모드 및 개발 종속성**  
`package.json`파일에 종속성을 지정하려면 종속성 및 **DevDependencies** 특성을 사용하십시오. *dependencies* 속성은 프로덕션 환경에서 애플리케이션에 필요한 패키지를 지정합니다. *devDependencies* 속성은 로컬 개발 및 테스트에만 필요한 패키지를 지정합니다.

*DevDependencies* 패키지를 설치해야 하는 경우 NPM\$1USE\$1PRODUCTION 환경 속성을 `false`로 설정하십시오. 이 설정을 사용하면 npm install을 실행할 때 위의 옵션을 사용하지 않습니다. 그러면 *DevDependencies* 패키지가 설치됩니다.

## node\$1modules 디렉터리에 Node.js 종속성 포함
<a name="nodejs-platform-nodemodules"></a>

애플리케이션 코드와 함께 환경 인스턴스에 종속성 패키지를 배포하려면 프로젝트 소스의 루트에 있는 `node_modules`이라는 디렉터리에 종속성 패키지를 포함시킵니다. 자세한 내용은 *npm Docs* 웹 사이트의 [Downloading and installing packages locally](https://docs.npmjs.com/downloading-and-installing-packages-locally)를 참조하세요.

`node_modules` 디렉터리를 AL2023/AL2 Node.js 플랫폼 버전으로 배포하는 경우 Elastic Beanstalk에서는 사용자가 자체 종속성 패키지를 제공하고 있다고 가정하며 [package.json](#nodejs-platform-packagejson) 파일에 지정된 종속성을 설치하지 않습니다. Node.js는 `node_modules` 디렉터리에서 종속성을 찾습니다. 자세한 내용은 Node.js 문서의 [Loading from node\$1modules Folders](https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders)를 참조하세요.

**참고**  
Elastic Beanstalk에서 `npm install`을 실행 중일 때 배포 문제가 발생하면 해당 문제를 조사하는 동안 이 주제에서 해결 방법으로 설명된 접근 방식을 사용하는 것이 좋습니다.  
 

### Amazon Linux 2의 Node.js 고려 사항
<a name="nodejs-al2-considerations"></a>

*Amazon Linux 2*에서 실행되는 *Node.js* 플랫폼 브랜치를 사용하는 경우이 섹션을 읽어보세요.

#### Amazon Linux 2의 Node.js 고려 사항
<a name="nodejs-al2-considerations-detail"></a>

**참고**  
이 주제의 정보는 Amazon Linux 2에서 실행되는 Node.js 플랫폼 브랜치에 적용됩니다. 여기의 내용은 AL2-specific 기능 및 동작을 설명합니다. AL2023

**명령 변형**  
명령 옵션은 애플리케이션이 실행되는 Amazon Linux 2 플랫폼 브랜치에 포함된 npm 버전에 따라 달라집니다.
+ npm v6 - Elastic Beanstalk는 기본적으로 종속 항목을 프로덕션 모드에서 설치합니다. `npm install --production`명령을 사용합니다.
+ npm v7 이상 — Elastic Beanstalk는 *개발 종속성을* 생략합니다. `npm install --omit=dev`명령을 사용합니다.

위에 나열된 두 명령 모두 *DevDependencies* 패키지를 설치하지 않습니다.

**Git 종속성을 위한 SSH 및 HTTPS 프로토콜**  
2023년 3월 7일 Amazon Linux 2 플랫폼 릴리스부터 SSH 및 HTTPS 프로토콜을 사용하여 Git 리포지토리에서 패키지를 검색할 수 있습니다. 플랫폼 브랜치Node.js 16은 SSH 및 HTTPS 프로토콜을 모두 지원합니다. Node.js14는 HTTPS 프로토콜만 지원합니다.

**Example package.json —Node.js 16은 HTTPS와 SSH를 모두 지원합니다**  

```
    ...
    "dependencies": {
      "aws-sdk": "https://github.com/aws/aws-sdk-js.git",
      "aws-chime": "git+ssh://git@github.com:aws/amazon-chime-sdk-js.git"
    }
```

**버전 및 버전 범위**  
`package.json` 파일에서 `engines` 키워드를 사용하여 애플리케이션에서 사용할 Node.js 버전을 지정합니다. npm 표기법을 사용하여 버전 범위를 지정할 수도 있습니다. 버전 범위 구문에 대한 자세한 내용은 Node.js 웹 사이트에서 [Semantic Versioning using npm](https://nodejs.dev/learn/semantic-versioning-using-npm)를 참조하세요. Node.js `package.json` 파일의 `engines` 키워드는 `aws:elasticbeanstalk:container:nodejs` 네임스페이스의 레거시 `NodeVersion` 옵션을 대체합니다.

**중요**  
AL2023에서 실행되는 Node.js 플랫폼 브랜치에서는 버전 범위를 지정하는 기능을 사용할 수 없습니다. AL2023 기반의 특정 Node.js 브랜치 내에서는 하나의 Node.js 버전만 지원합니다. `package.json` 파일이 버전 범위를 지정하는 경우, 이것을 무시하고 기본적으로 Node.js의 플랫폼 브랜치 버전을 사용합니다.

**Example `package.json` – 단일 Node.js 버전**  

```
{
    ...
    "engines": { "node" : "14.16.0" }
  }
```

**Example `package.json` – Node.js 버전 범위**  

```
{
    ...
    "engines": { "node" : ">=10 <11" }
  }
```

버전 범위가 표시되면 Elastic Beanstalk는 해당 범위 내에서 플랫폼을 사용할 수 있는 최신 Node.js 버전을 설치합니다. 이 예에서 범위는 버전이 버전 10보다 크거나 같고 버전 11보다 작아야 함을 나타냅니다. 따라서 Elastic Beanstalk는 [지원되는 플랫폼](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)에서 사용할 수 있는 최신 Node.js 버전 10.x.y를 설치합니다.

플랫폼 브랜치에 해당하는 Node.js 버전만 지정할 수 있습니다. 예를 들어 Node.js 16 플랫폼 브랜치를 사용하는 경우 16.x.y Node.js 버전만 지정할 수 있습니다. npm에서 지원하는 버전 범위 옵션을 사용하여 유연성을 높일 수 있습니다. 각 플랫폼 브랜치에 유효한 Node.js 버전은 *AWS Elastic Beanstalk 플랫폼* 안내서의 [https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)를 참조하세요.

**참고**  
현재 사용 중인 Node.js 버전에 대한 지원이 플랫폼에서 제거되면 [플랫폼 업데이트](using-features.platform.upgrade.md)를 수행하기 전에 Node.js 버전 설정을 변경하거나 제거해야 합니다. 하나 이상의 Node.js 버전에 대해 보안 취약성이 발견된 경우 이러한 상황이 발생할 수 있습니다.  
이러한 상황이 발생하면 구성된 Node.js 버전을 지원하지 않는 새 플랫폼 버전으로 업데이트할 수 없습니다. 새 환경을 만들 필요가 없도록 하려면 `package.json`의 Node.js 버전 설정을 이전 플랫폼 버전과 새 버전 모두에서 지원하는 Node.js 버전으로 변경합니다. 이 항목의 앞부분에서 설명한 대로 지원되는 버전을 포함하는 Node.js 버전 범위를 지정할 수 있습니다. 설정을 제거한 후 새 소스 번들을 배포할 수도 있습니다.

# Elastic Beanstalk에서 npm shrinkwrap를 사용하여 종속성 잠금
<a name="nodejs-platform-shrinkwrap"></a>

배포할 때마다 Node.js 플랫폼은 `npm install`를 *웹 앱* 사용자로 실행합니다. 종속성의 새 버전이 있으면 애플리케이션을 배포할 때 해당 버전이 설치되며, 이로 인해 배포 시간이 더 오래 걸릴 수 있습니다.

애플리케이션의 종속 항목을 잠그는 `npm-shrinkwrap.json` 파일을 생성하여 종속 항목을 현재 버전으로 업그레이드하지 않을 수 있습니다.

```
$ npm install
$ npm shrinkwrap
wrote npm-shrinkwrap.json
```

소스 번들이 이 파일을 포함하여 종속 항목이 단 한 번만 설치되도록 합니다.

# 프록시 서버 구성
<a name="nodejs-platform-proxy"></a>

Elastic Beanstalk는 NGINX 또는 Apache HTTPD를 역방향 프록시로 사용하여 애플리케이션을 포트 80의 Elastic Load Balancing 로드 밸런서에 매핑합니다. 기본값은 NGINX입니다. Elastic Beanstalk는 확장하거나 자체 구성으로 완전히 재정의할 수 있는 기본 프록시 구성을 제공합니다.

기본적으로 Elastic Beanstalk는 요청을 포트 5,000의 애플리케이션에 전달하도록 프록시를 구성합니다. `PORT` [환경 속성](create_deploy_nodejs.container.md#nodejs-platform-console)을 기본 애플리케이션이 수신 대기하는 포트로 설정하여 기본 포트를 재정의할 수 있습니다.

**참고**  
애플리케이션이 수신 대기하는 포트는 NGINX 서버가 로드 밸런서에서 요청을 받기 위해 수신 대기하는 포트에 영향을 주지 않습니다.

**플랫폼 버전에서 프록시 서버 구성**  
모든 AL2023/AL2 플랫폼은 균일한 프록시 구성 기능을 지원합니다. AL2023/AL2를 실행하는 플랫폼 버전에서 프록시 서버를 구성하는 방법에 대한 자세한 내용은 [역방향 프록시 구성](platforms-linux-extend.proxy.md) 단원을 참조하세요.

## Amazon Linux AMI(이전 Amazon Linux 2)에서 프록시 구성
<a name="nodejs-platform-proxy.alami"></a>

Elastic Beanstalk Node.js 환경에서 Amazon Linux AMI 플랫폼 버전(이전 Amazon Linux 2)을 사용하는 경우 이 섹션의 정보를 읽어 보세요.

**참고**  
이 주제의 정보는 Amazon Linux AMI(AL1) 기반 플랫폼 브랜치에만 적용됩니다. AL2023/AL2 플랫폼 브랜치는 이전 Amazon Linux AMI(AL1) 플랫폼 버전과 호환되지 않으며 *다른 구성 설정이 필요*합니다.
 [2022년 7월 18일](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html), Elastic Beanstalk는 Amazon Linux AMI(AL1)에 기반한 모든 플랫폼 브랜치의 상태를 **사용 중지**로 설정했습니다. 완전 지원이 가능한 현재 Amazon Linux 2023 플랫폼 브랜치로 마이그레이션하는 방법에 대한 자세한 내용은 [Elastic Beanstalk Linux 애플리케이션을 Amazon Linux 2023 또는 Amazon Linux 2로 마이그레이션](using-features.migration-al.md)을(를) 참조하세요.

### 기본 프록시 구성 확장 및 재정의 — Amazon Linux AMI (AL1)
<a name="nodejs-platform-proxy.alami.extending"></a>

Node.js 플랫폼은 역방향 프록시를 사용하여 인스턴스에서 포트 80의 요청을 포트 8081에서 수신 중인 애플리케이션으로 전달합니다. Elastic Beanstalk는 확장하거나 자체 구성으로 완전히 재정의할 수 있는 기본 프록시 구성을 제공합니다.

기본 구성을 확장하려면 구성 파일로 `.conf`에 `/etc/nginx/conf.d` 파일을 추가합니다. 구체적인 예제는 [Node.js를 실행하는 EC2 인스턴스에서 HTTPS 종료](https-singleinstance-nodejs.md) 단원을 참조하세요.

Node.js 플랫폼은 PORT 환경 변수를 프록시 서버가 트래픽을 전달할 포트로 설정합니다. 이 코드 변수를 읽고 애플리케이션의 포트를 구성합니다.

```
    var port = process.env.PORT || 3000;

    var server = app.listen(port, function () {
        console.log('Server running at http://127.0.0.1:' + port + '/');
    });
```

기본 NGINX 구성은 `127.0.0.1:8081`의 `nodejs`라는 업스트림 서버로 트래픽을 전달합니다. 기본 구성을 제거하고 [구성 파일](ebextensions.md)에 사용자 지정으로 구성할 수 있습니다.

**Example .ebextensions/proxy.config**  
다음은 기본 구성을 제거하고 트래픽을 8081 대신 포트 5000으로 전달하도록 사용자 지정한 구성을 추가하는 예제입니다.  

```
files:
  /etc/nginx/conf.d/proxy.conf:
    mode: "000644"
    owner: root
    group: root
    content: |
      upstream nodejs {
        server 127.0.0.1:5000;
        keepalive 256;
      }

      server {
        listen 8080;

        if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
            set $year $1;
            set $month $2;
            set $day $3;
            set $hour $4;
        }
        access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
        access_log  /var/log/nginx/access.log  main;

        location / {
            proxy_pass  http://nodejs;
            proxy_set_header   Connection "";
            proxy_http_version 1.1;
            proxy_set_header        Host            $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        gzip on;
        gzip_comp_level 4;
        gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        location /static {
            alias /var/app/current/static;
        }

      }

  /opt/elasticbeanstalk/hooks/configdeploy/post/99_kill_default_nginx.sh:
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash -xe
      rm -f /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf
      service nginx stop 
      service nginx start

container_commands:
  removeconfig:
    command: "rm -f /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf"
```
예제 구성(`/etc/nginx/conf.d/proxy.conf`)은 `/etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf`의 기본 구성을 토대로 기본 서버 블록과 압축 및 로그 설정, 정적 파일 매핑을 포함합니다.  
`removeconfig` 명령은 프록시 서버가 사용자 지정 구성을 사용하도록 컨테이너의 기본 구성을 제거합니다. Elastic Beanstalk는 각 구성이 배포될 때 기본 구성을 다시 만듭니다. 이 문제를 설명하기 위해 다음 예에서는 post-configuration-deployment hook(`/opt/elasticbeanstalk/hooks/configdeploy/post/99_kill_default_nginx.sh`)가 추가됩니다. 이렇게 하면 기본 구성이 제거되고 프록시 서버가 다시 시작됩니다.

**참고**  
기본 구성은 이후 Node.js 플랫폼 버전에서 바뀔 수 있습니다. 사용자 지정할 때는 호환성이 보장되도록 최신 버전의 구성을 사용하십시오.

기본 구성을 재정의하는 경우 정적 파일 매핑과 GZIP 압축을 정의해야 합니다. 이는 플랫폼이 [표준 설정](create_deploy_nodejs.container.md#nodejs-namespaces)을 적용할 수 없기 때문입니다.

# 더 많은 Node.js용 Elastic Beanstalk 예제 애플리케이션 및 자습서
<a name="nodejs-getstarted"></a>

이 섹션에서는 추가 애플리케이션 및 자습서를 제공합니다. 이 [Node.js에 대한 QuickStart](nodejs-quickstart.md) 주제의 앞부분에 있는 주제에서는 EB CLI를 사용하여 샘플 Node.js 애플리케이션을 시작하는 방법을 안내합니다.

 Node.js 애플리케이션을 시작하려면 첫 번째 애플리케이션 버전으로 업로드하고 환경에 배포할 애플리케이션 [소스 번들](applications-sourcebundle.md) AWS Elastic Beanstalk만 있으면 됩니다.

## 샘플 Node.js 애플리케이션이 있는 환경 시작
<a name="nodejs-getstarted-samples"></a>

Elastic Beanstalk는 각 플랫폼에 대한 단일 페이지 샘플 애플리케이션과 Amazon RDS 및 언어 또는 플랫폼별 기능 및 APIs와 같은 추가 AWS 리소스 사용을 보여주는 보다 복잡한 예제를 제공합니다.

**참고**  
소스 번들`README.md` 파일의 단계를 따라 배포합니다.


**샘플**  

|  환경 유형  |  소스 번들  |  설명  | 
| --- | --- | --- | 
|  웹 서버  |   [nodejs.zip](samples/nodejs.zip)   |  단일 페이지 애플리케이션. EB CLI를 사용하여 샘플 애플리케이션을 시작하려면 [Node.js에 대한 QuickStart](nodejs-quickstart.md) 단원을 참조하세요. Elastic Beanstalk 콘솔을 사용하여 샘플 애플리케이션을 시작할 수도 있습니다. 자세한 단계는 이 가이드의 **시작하기 장의 [예제 애플리케이션 생성](GettingStarted.md#GettingStarted.CreateApp)을 참조하세요.  | 
|  Amazon RDS 기반 웹 서버  |  [nodejs-example-express-rds.zip](samples/nodejs-example-express-rds.zip)  |  Express 프레임워크 및 Amazon 관계형 데이터베이스 서스비스 (RDS)를 사용하는 하이킹 로그 애플리케이션입니다. [자습서](create_deploy_nodejs_express.md)  | 
|  Amazon ElastiCache 기반 웹 서버  |  [nodejs-example-express-elasticache.zip](samples/nodejs-example-express-elasticache.zip)  |  클러스터링용 Amazon ElastiCache를 사용하는 Express 웹 애플리케이션. 클러스터링은 웹 애플리케이션의 고가용성, 성능 및 보안을 개선합니다. [자습서](nodejs-express-clustering.md)  | 
|  DynamoDB, Amazon SNS 및 Amazon SQS 기반 웹 서버  |  [nodejs-example-dynamo.zip](samples/nodejs-example-dynamo.zip)  |  새 회사의 마케팅 캠페인을 위해 사용자 연락처 정보를 수집하는 Express 웹 사이트입니다. Node.js의 JavaScript용 AWS SDK를 사용하여 DynamoDB 테이블에 항목을 쓰고, Elastic Beanstalk 구성 파일을 사용하여 DynamoDB, Amazon SNS 및 Amazon SQS에서 리소스를 생성합니다. [자습서](nodejs-dynamodb-tutorial.md)  | 

## 다음 단계
<a name="nodejs-getstarted-next"></a>

애플리케이션을 실행하는 환경이 있으면 언제든 완전히 다른 애플리케이션 또는 애플리케이션의 새 버전을 배포할 수 있습니다. EC2 인스턴스를 프로비저닝하거나 다시 시작할 필요가 없기 때문에 새 애플리케이션 버전을 매우 빠르게 배포할 수 있습니다. 애플리케이션 배포에 대한 자세한 내용은 [새 버전의 애플리케이션 배포](GettingStarted.md#GettingStarted.DeployApp)를 참조하십시오.

샘플 애플리케이션을 한두 개 배포하고 Node.js 애플리케이션을 로컬에서 개발 및 실행할 준비가 되면 [Elastic Beanstalk를 위한 Node.js 개발 환경 설정](nodejs-devenv.md) 단원을 참조하여 필요한 모든 도구로 Node.js 개발 환경을 설정하세요.

# Elastic Beanstalk에 Node.js Express 애플리케이션 배포
<a name="create_deploy_nodejs_express"></a>

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

## 사전 조건
<a name="create_deploy_nodejs_express.prerequisites"></a>

이 튜토리얼의 사전 요구 사항은 다음과 같습니다:
+ Node.js 런타임
+ 기본 Node.js 패키지 관리자 소프트웨어인 npm
+ 익스프레스 커맨드 라인 생성기
+ Elastic Beanstalk 명령줄 인터페이스(EB CLI)

나열된 처음 세개 구성 요소의 설치 및 로컬 개발 환경 설정에 대한 자세한 내용은 [Elastic Beanstalk를 위한 Node.js 개발 환경 설정](nodejs-devenv.md)을 참조하십시오. 이 자습서에서는 참조된 주제에도 언급된 Node.js용 AWS SDK를 설치할 필요가 없습니다.

EB CLI 설치 및 구성에 대한 자세한 내용은 [설정 스크립트를 사용하여 EB CLI 설치(권장)](eb-cli3.md#eb-cli3-install) 및 [EB CLI 구성](eb-cli3-configuration.md) 단원을 참조하세요.

## Elastic Beanstalk 환경 생성
<a name="create_deploy_nodejs_express.eb_init-rds"></a>

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

```
~$ mkdir nodejs-example-express-rds
```

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

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

```
~$ cd nodejs-example-express-rds
```

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

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

1. **[**eb init**](eb3-init.md)** 명령을 사용하여 리포지토리를 만듭니다.

   ```
   ~/nodejs-example-express-rds$ eb init --platform node.js --region <region>
   ```

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

1. **[**eb create**](eb3-create.md)** 명령을 사용하여 샘플 애플리케이션을 실행하는 환경을 생성합니다.

   ```
   ~/nodejs-example-express-rds$ eb create --sample nodejs-example-express-rds
   ```

   이 명령은 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 그룹이 확장 또는 축소됩니다.
   + **CloudFormation 스택** - Elastic Beanstalk는 CloudFormation 를 사용하여 환경에서 리소스를 시작하고 구성 변경 사항을 전파합니다. 리소스는 [CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation)에서 볼 수 있는 템플릿에서 정의됩니다.
   + **도메인 이름(Domain name)** - **subdomain*.*region*.elasticbeanstalk.com* 형식으로 웹 앱으로 라우팅되는 도메인 이름입니다.
**도메인 보안**  
Elastic Beanstalk 애플리케이션의 보안을 강화하기 위해 *elasticbeanstalk.com* 도메인이 [공개 서픽스 목록(PSL)](https://publicsuffix.org/)에 등록되어 있습니다.  
Elastic Beanstalk 애플리케이션의 기본 도메인 이름에 민감한 쿠키를 설정해야 하는 경우 보안을 강화하기 위해 `__Host-` 접두사가 있는 쿠키를 사용하는 것이 좋습니다. 이렇게 쿠키를 설정하면 교차 사이트 요청 위조 시도(CSRF)로부터 도메인이 보호됩니다. 자세한 내용은 Mozilla 개발자 네트워크의 [Set-Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes) 페이지를 참조하세요.

1. 환경 생성이 완료되면 [**eb open**](eb3-open.md) 명령을 사용하여 기본 브라우저에서 환경의 URL을 엽니다.

   ```
   ~/nodejs-example-express-rds$ eb open
   ```

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

## Express를 사용하도록 애플리케이션을 업데이트하려면
<a name="create_deploy_nodejs_express.update"></a>

샘플 애플리케이션이 있는 환경을 생성한 후 이를 자체 애플리케이션으로 업데이트할 수 있습니다. 이 절차에서는 먼저**express** 및**npm install** 명령을 실행하여 애플리케이션 디렉터리에 Express 프레임워크를 설정합니다. EB CLI를 사용하여 Elastic Beanstalk 환경에 업데이트된 애플리케이션을 배포합니다.

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

1. `express` 명령을 실행합니다. 이는 `package.json`, `app.js` 및 몇 개의 디렉터리를 생성합니다.

   ```
   ~/nodejs-example-express-rds$ express
   ```

   계속할지 여부를 묻는 메시지가 표시되면 **y**를 입력합니다.
**참고**  
**express**명령이 작동하지 않는 경우 이전 *사전 요구 사항* 섹션에 설명된 대로 Express 명령줄 생성기를 설치하지 않았기 때문일 수 있습니다. 또는**express** 명령을 실행하려면 로컬 시스템의 디렉터리 경로 설정을 설정해야 할 수 있습니다. 개발 환경 설정에 대한 자세한 단계는 *필수 조건* 섹션을 참조하십시오. 그러면 이 자습서를 계속 진행할 수 있습니다.

1. 로컬 종속 항목을 설정합니다.

   ```
   ~/nodejs-example-express-rds$ npm install
   ```

1. (선택) 웹 앱 서버가 시작되는지 확인합니다.

   ```
   ~/nodejs-example-express-rds$ npm start
   ```

   다음과 유사한 출력 화면이 표시되어야 합니다.

   ```
   > nodejs@0.0.0 start /home/local/user/node-express
   > node ./bin/www
   ```

   서버는 기본적으로 포트 3000에서 실행됩니다. 테스트하려면 다른 터미널에서 `curl http://localhost:3000`을 실행하거나 로컬 컴퓨터에서 브라우저를 열고 `http://localhost:3000`으로 이동하십시오.

   **Ctrl\$1C**를 눌러 서버를 중지합니다.

1. [**eb deploy**](eb3-deploy.md) 명령으로 Elastic Beanstalk 환경으로 변경된 애플리케이션을 배포합니다.

   ```
   ~/nodejs-example-express-rds$ eb deploy
   ```

1. 환경이 녹색이고 준비되면 URL을 새로 고쳐서 작동하는지 확인합니다. **Welcome to Express**라는 웹 페이지가 보일 것입니다.

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

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

1. [`.ebextensions`](ebextensions.md) 폴더에 다음 콘텐츠가 포함된 두 번째 구성 파일을 추가합니다:

   **`nodejs-example-express-rds/.ebextensions/staticfiles.config`**

   ```
   option_settings:
       aws:elasticbeanstalk:environment:proxy:staticfiles:
           /stylesheets: public/stylesheets
   ```

   이 설정은 애플리케이션의 `public` 경로에서 `/public` 폴더에 있는 파일을 제공하도록 프록시 서버를 구성합니다. 프록시 서버에서 정적으로 파일을 제공하면 애플리케이션의 부하가 감소합니다. 자세한 내용은 이 장의 앞부분에 있는 [Stic 파일을](create_deploy_nodejs.container.md#nodejs-platform-console-staticfiles) 참조하십시오.

1. (선택 사항) 정적 매핑이 올바르게 구성되었는지 확인하려면 에서 정적 매핑 구성을 주석`nodejs-example-express-rds/app.js` 처리하십시오. 이렇게 하면 노드 애플리케이션에서 매핑이 제거됩니다.

   ```
   //  app.use(express.static(path.join(__dirname, 'public'))); 
   ```

   이전 단계의 파일에 있는 정적`staticfiles.config` 파일 매핑은 이 줄을 주석 처리한 후에도 여전히 스타일시트를 성공적으로 로드할 것입니다. 정적 파일 매핑이 익스프레스 응용 프로그램이 아닌 프록시 정적 파일 구성을 통해 로드되었는지 확인하려면 다음 값을 제거하십시오`option_settings:`. 정적 파일 구성과 노드 응용 프로그램 모두에서 스타일시트를 제거한 후에는 스타일시트를 로드할 수 없습니다.

   테스트가`staticfiles.config` 끝나면`nodejs-example-express-rds/app.js` 및 의 콘텐츠를 모두 재설정해야 합니다.

1. `nodejs-example-express-rds/routes/hike.js`를 추가합니다. 다음을 입력합니다.

   ```
   exports.index = function(req, res) {
    res.render('hike', {title: 'My Hiking Log'});
   };
   
   exports.add_hike = function(req, res) {
   };
   ```

1. 새로운 세 줄을 포함하도록 `nodejs-example-express-rds/app.js`를 업데이트합니다.

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

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

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

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

   그런 다음 `nodejs-example-express-rds/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);
   ```

1. `nodejs-example-express-rds/views/index.jade`를 `nodejs-example-express-rds/views/hike.jade`에 복사합니다.

   ```
   ~/nodejs-example-express-rds$ cp views/index.jade views/hike.jade
   ```

1. [**eb deploy**](eb3-deploy.md)명령을 사용하여 변경 내용을 배포합니다.

   ```
   ~/nodejs-example-express-rds$ eb deploy
   ```

1. 몇 분 후 환경이 업데이트됩니다. 환경이 녹색이고 준비되면 브라우저를 새로 고치고 URL의 끝에 **hikes**를 추가하여(예: `http://node-express-env-syypntcz2q.elasticbeanstalk.com/hikes`) 작동하는지 확인합니다.

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

Express 프레임워크 를 사용하는 웹 애플리케이션을 생성합니다. 다음 섹션에서는 Amazon 관계형 데이터베이스 서비스(RDS) 를 사용하여 하이킹 로그를 저장하도록 애플리케이션을 수정하겠습니다.

## Amazon RDS를 사용할 수 있도록 애플리케이션을 업데이트합니다
<a name="create_deploy_nodejs_express.add_rds"></a>

다음 단계에서는 Amazon RDS for MySQL RDS를 사용하도록 애플리케이션을 업데이트합니다.

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

1. Elastic Beanstalk 환경에 연결된 MySQL용 RDS 데이터베이스를 생성하려면 이 장 뒷부분에 포함된 [데이터베이스 추가](create-deploy-nodejs.rds.md) 항목의 지침을 따르십시오. 데이터베이스 인스턴스를 추가하는 데 약 10분이 걸립니다.

1.  `package.json`에서 종속성 섹션을 다음 내용으로 업데이트하십시오: 

   ```
   "dependencies": {
       "async": "^3.2.4",
       "express": "4.18.2",
       "jade": "1.11.0",
       "mysql": "2.18.1",
       "node-uuid": "^1.4.8",
       "body-parser": "^1.20.1",
       "method-override": "^3.0.0",
       "morgan": "^1.10.0",
       "errorhandler": "^1.5.1"
     }
   ```

1. **npm install**를 실행합니다.

   ```
   ~/nodejs-example-express-rds$ npm install
   ```

1. `app.js`업데이트하여 데이터베이스에 연결하고, 테이블을 생성하고, 단일 기본 하이킹 로그를 삽입하세요. 이 앱을 배포할 때마다 이전 hikes 테이블을 삭제하고 다시 생성합니다.

   ```
   /**
    * Module dependencies.
    */
   
    const express = require('express')
    , routes = require('./routes')
    , hike = require('./routes/hike')
    , http = require('http')
    , path = require('path')
    , mysql = require('mysql')
    , async = require('async')
    , bodyParser = require('body-parser')
    , methodOverride = require('method-override')
    , morgan = require('morgan')
    , errorhandler = require('errorhandler');
   
   const { connect } = require('http2');
   
   const app = express()
   
   app.set('views', __dirname + '/views')
   app.set('view engine', 'jade')
   app.use(methodOverride())
   app.use(bodyParser.json())
   app.use(bodyParser.urlencoded({ extended: true }))
   app.use(express.static(path.join(__dirname, 'public')))
   
   
   app.set('connection', mysql.createConnection({
   host: process.env.RDS_HOSTNAME,
   user: process.env.RDS_USERNAME,
   password: process.env.RDS_PASSWORD,
   port: process.env.RDS_PORT}));  
   
   function init() {
    app.get('/', routes.index);
    app.get('/hikes', hike.index);
    app.post('/add_hike', hike.add_hike);
   }
   
   const client = app.get('connection');
   async.series([
    function connect(callback) {
      client.connect(callback);
      console.log('Connected!');
    },
    function clear(callback) {
      client.query('DROP DATABASE IF EXISTS mynode_db', callback);
    },
    function create_db(callback) {
      client.query('CREATE DATABASE mynode_db', callback);
    },
    function use_db(callback) {
      client.query('USE mynode_db', callback);
    },
    function create_table(callback) {
       client.query('CREATE TABLE HIKES (' +
                           'ID VARCHAR(40), ' +
                           'HIKE_DATE DATE, ' +
                           'NAME VARCHAR(40), ' +
                           'DISTANCE VARCHAR(40), ' +
                           'LOCATION VARCHAR(40), ' +
                           'WEATHER VARCHAR(40), ' +
                           'PRIMARY KEY(ID))', callback);
    },
    function insert_default(callback) {
      const hike = {HIKE_DATE: new Date(), NAME: 'Hazard Stevens',
            LOCATION: 'Mt Rainier', DISTANCE: '4,027m vertical', WEATHER:'Bad', ID: '12345'};
      client.query('INSERT INTO HIKES set ?', hike, callback);
    }
   ], function (err, results) {
    if (err) {
      console.log('Exception initializing database.');
      throw err;
    } else {
      console.log('Database initialization complete.');
      init();
    }
   });
   
   module.exports = app
   ```

1. 다음 콘텐츠를 `routes/hike.js`에 추가합니다. 이렇게 하면 경로에서 새 하이킹 로그를 *HIKES* 데이터베이스에 삽입할 수 있습니다.

   ```
   const uuid = require('node-uuid');
   exports.index = function(req, res) {
     res.app.get('connection').query( 'SELECT * FROM HIKES', function(err,
   rows) {
       if (err) {
         res.send(err);
       } else {
         console.log(JSON.stringify(rows));
         res.render('hike', {title: 'My Hiking Log', hikes: rows});
     }});
   };
   exports.add_hike = function(req, res){
     const input = req.body.hike;
     const hike = { HIKE_DATE: new Date(), ID: uuid.v4(), NAME: input.NAME,
     LOCATION: input.LOCATION, DISTANCE: input.DISTANCE, WEATHER: input.WEATHER};
     console.log('Request to log hike:' + JSON.stringify(hike));
     req.app.get('connection').query('INSERT INTO HIKES set ?', hike, function(err) {
         if (err) {
           res.send(err);
         } else {
           res.redirect('/hikes');
         }
      });
   };
   ```

1. `routes/index.js`의 내용을 다음으로 바꿉니다:

   ```
   /*
    * GET home page.
    */
   
   exports.index = function(req, res){
     res.render('index', { title: 'Express' });
   };
   ```

1. 다음 jade 템플릿을 추가하여 하이킹 로그를`views/hike.jade` 추가하기 위한 사용자 인터페이스를 제공합니다.

   ```
   extends layout
   
   block content
     h1= title
     p Welcome to #{title}
   
     form(action="/add_hike", method="post")
       table(border="1")
         tr
           td Your Name
           td
             input(name="hike[NAME]", type="textbox")
         tr
           td Location
           td
             input(name="hike[LOCATION]", type="textbox")
         tr
           td Distance
           td
             input(name="hike[DISTANCE]", type="textbox")
         tr
           td Weather
           td
             input(name="hike[WEATHER]", type="radio", value="Good")
             | Good
             input(name="hike[WEATHER]", type="radio", value="Bad")
             | Bad
             input(name="hike[WEATHER]", type="radio", value="Seattle", checked)
             | Seattle
         tr
           td(colspan="2")
             input(type="submit", value="Record Hike")
   
     div
       h3 Hikes
       table(border="1")
         tr
           td Date
           td Name
           td Location
           td Distance
           td Weather
         each hike in hikes
           tr
             td #{hike.HIKE_DATE.toDateString()}
             td #{hike.NAME}
             td #{hike.LOCATION}
             td #{hike.DISTANCE}
             td #{hike.WEATHER}
   ```

1. [**eb deploy**](eb3-deploy.md)명령을 사용하여 변경 내용을 배포합니다.

   ```
   ~/nodejs-example-express-rds$ eb deploy
   ```

## 정리
<a name="create_deploy_nodejs_express.delete"></a>

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

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

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

# Elastic Beanstalk에 대한 클러스터링을 사용하여 Node.js Express 애플리케이션 배포
<a name="nodejs-express-clustering"></a>

이 자습서에서는 Elastic Beanstalk 명령줄 인터페이스(EB CLI)를 사용하여 Elastic Beanstalk로 샘플 애플리케이션을 배포한 후, 애플리케이션을 업데이트하여 [Express](http://expressjs.com/) 프레임워크, [Amazon ElastiCache](https://aws.amazon.com/elasticache/), 클러스터링을 사용하는 절차를 살펴봅니다. 클러스터링은 웹 애플리케이션의 고가용성, 성능 및 보안을 개선합니다. Amazon ElastiCache에 대한 자세한 내용은 *Amazon ElastiCache for Memcached 사용 설명서(Memcached)*의 [Amazon ElastiCache(Memcached)란 무엇인가요?](https://docs.aws.amazon.com/AmazonElastiCache/latest/mem-ug/Introduction.html)를 참조하세요.

**참고**  
이 예제에서는 요금이 부과될 수 있는 AWS 리소스를 생성합니다. AWS 요금에 대한 자세한 내용은 섹션을 참조하세요[https://aws.amazon.com/pricing/](https://aws.amazon.com/pricing/). 일부 서비스는 AWS 프리 티어의 일부입니다. 신규 고객은 무료로 이 서비스를 시험 사용할 수 있습니다. 자세한 정보는 [https://aws.amazon.com/free/](https://aws.amazon.com/free/)을 참조하세요.

## 사전 조건
<a name="nodejs-express-clustering.prereq"></a>

이 튜토리얼의 사전 요구 사항은 다음과 같습니다:
+ Node.js 런타임
+ 기본 Node.js 패키지 관리자 소프트웨어인 npm
+ 익스프레스 커맨드 라인 생성기
+ Elastic Beanstalk 명령줄 인터페이스(EB CLI)

나열된 처음 세개 구성 요소의 설치 및 로컬 개발 환경 설정에 대한 자세한 내용은 [Elastic Beanstalk를 위한 Node.js 개발 환경 설정](nodejs-devenv.md)을 참조하십시오. 이 자습서에서는 참조된 주제에도 언급된 Node.js용 AWS SDK를 설치할 필요가 없습니다.

EB CLI 설치 및 구성에 대한 자세한 내용은 [설정 스크립트를 사용하여 EB CLI 설치(권장)](eb-cli3.md#eb-cli3-install) 및 [EB CLI 구성](eb-cli3-configuration.md) 단원을 참조하세요.

## Elastic Beanstalk 환경 생성
<a name="nodejs-express-clustering.create"></a>

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

```
~$ mkdir nodejs-example-express-elasticache
```

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

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

```
~$ cd nodejs-example-express-elasticache
```

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

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

1. **[**eb init**](eb3-init.md)** 명령을 사용하여 리포지토리를 만듭니다.

   ```
   ~/nodejs-example-express-elasticache$ eb init --platform node.js --region <region>
   ```

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

1. **[**eb create**](eb3-create.md)** 명령을 사용하여 샘플 애플리케이션을 실행하는 환경을 생성합니다.

   ```
   ~/nodejs-example-express-elasticache$ eb create --sample nodejs-example-express-elasticache
   ```

   이 명령은 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 그룹이 확장 또는 축소됩니다.
   + **CloudFormation 스택** - Elastic Beanstalk는 CloudFormation 를 사용하여 환경에서 리소스를 시작하고 구성 변경 사항을 전파합니다. 리소스는 [CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation)에서 볼 수 있는 템플릿에서 정의됩니다.
   + **도메인 이름(Domain name)** - **subdomain*.*region*.elasticbeanstalk.com* 형식으로 웹 앱으로 라우팅되는 도메인 이름입니다.
**도메인 보안**  
Elastic Beanstalk 애플리케이션의 보안을 강화하기 위해 *elasticbeanstalk.com* 도메인이 [공개 서픽스 목록(PSL)](https://publicsuffix.org/)에 등록되어 있습니다.  
Elastic Beanstalk 애플리케이션의 기본 도메인 이름에 민감한 쿠키를 설정해야 하는 경우 보안을 강화하기 위해 `__Host-` 접두사가 있는 쿠키를 사용하는 것이 좋습니다. 이렇게 쿠키를 설정하면 교차 사이트 요청 위조 시도(CSRF)로부터 도메인이 보호됩니다. 자세한 내용은 Mozilla 개발자 네트워크의 [Set-Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes) 페이지를 참조하세요.

1. 환경 생성이 완료되면 [**eb open**](eb3-open.md) 명령을 사용하여 기본 브라우저에서 환경의 URL을 엽니다.

   ```
   ~/nodejs-example-express-elasticache$ eb open
   ```

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

## Express를 사용하도록 애플리케이션을 업데이트하려면
<a name="nodejs-express-clustering.update"></a>

Express 프레임워크를 사용하도록 Elastic Beanstalk 환경에서 샘플 애플리케이션을 업데이트합니다.

[nodejs-example-express-elasticache.zip](samples/nodejs-example-express-elasticache.zip)에서 최종 소스 코드를 다운로드 할 수 있습니다.

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

샘플 애플리케이션이 있는 환경을 생성한 후 이를 자체 애플리케이션으로 업데이트할 수 있습니다. 이 절차에서는 먼저**express** 및**npm install** 명령을 실행하여 애플리케이션 디렉터리에 Express 프레임워크를 설정합니다.

1. `express` 명령을 실행합니다. 이는 `package.json`, `app.js` 및 몇 개의 디렉터리를 생성합니다.

   ```
   ~/nodejs-example-express-elasticache$ express
   ```

   계속할지 여부를 묻는 메시지가 표시되면 **y**를 입력합니다.
**참고**  
**express**명령이 작동하지 않는 경우 이전 *사전 요구 사항* 섹션에 설명된 대로 Express 명령줄 생성기를 설치하지 않았기 때문일 수 있습니다. 또는**express** 명령을 실행하려면 로컬 시스템의 디렉터리 경로 설정을 설정해야 할 수 있습니다. 개발 환경 설정에 대한 자세한 단계는 *필수 조건* 섹션을 참조하십시오. 그러면 이 자습서를 계속 진행할 수 있습니다.

1. 로컬 종속 항목을 설정합니다.

   ```
   ~/nodejs-example-express-elasticache$ npm install
   ```

1. (선택) 웹 앱 서버가 시작되는지 확인합니다.

   ```
   ~/nodejs-example-express-elasticache$ npm start
   ```

   다음과 유사한 출력 화면이 표시되어야 합니다.

   ```
   > nodejs@0.0.0 start /home/local/user/node-express
   > node ./bin/www
   ```

   서버는 기본적으로 포트 3000에서 실행됩니다. 테스트하려면 다른 터미널에서 `curl http://localhost:3000`을 실행하거나 로컬 컴퓨터에서 브라우저를 열고 `http://localhost:3000`으로 이동하십시오.

   **Ctrl\$1C**를 눌러 서버를 중지합니다.

1. `nodejs-example-express-elasticache/app.js`을 `nodejs-example-express-elasticache/express-app.js`로 바꿉니다.

   ```
   ~/nodejs-example-express-elasticache$ mv app.js express-app.js
   ```

1. 다음으로 `nodejs-example-express-elasticache/express-app.js`의 `var app = express();` 행을 업데이트하십시오.

   ```
   var app = module.exports = express();
   ```

1. 로컬 컴퓨터에서 다음 코드로 `nodejs-example-express-elasticache/app.js`로 명명된 파일을 만듭니다.

   ```
   /**
    * Module dependencies.
    */
   
    const express = require('express'),
    session = require('express-session'),
    bodyParser = require('body-parser'),
    methodOverride = require('method-override'),
    cookieParser = require('cookie-parser'),
    fs = require('fs'),
    filename = '/var/nodelist',
    app = express();
   
   let MemcachedStore = require('connect-memcached')(session);
   
   function setup(cacheNodes) {
    app.use(bodyParser.raw());
    app.use(methodOverride());
    if (cacheNodes.length > 0) {
      app.use(cookieParser());
   
      console.log('Using memcached store nodes:');
      console.log(cacheNodes);
   
      app.use(session({
        secret: 'your secret here',
        resave: false,
        saveUninitialized: false,
        store: new MemcachedStore({ 'hosts': cacheNodes })
      }));
    } else {
      console.log('Not using memcached store.');
      app.use(session({
        resave: false,
        saveUninitialized: false, secret: 'your secret here'
      }));
    }
   
    app.get('/', function (req, resp) {
      if (req.session.views) {
        req.session.views++
        resp.setHeader('Content-Type', 'text/html')
        resp.send(`You are session: ${req.session.id}. Views: ${req.session.views}`)
      } else {
        req.session.views = 1
        resp.send(`You are session: ${req.session.id}. No views yet, refresh the page!`)
      }
    });
   
    if (!module.parent) {
      console.log('Running express without cluster. Listening on port %d', process.env.PORT || 5000)
      app.listen(process.env.PORT || 5000)
    }
   }
   
   console.log("Reading elastic cache configuration")
   // Load elasticache configuration.
   fs.readFile(filename, 'UTF8', function (err, data) {
    if (err) throw err;
   
    let cacheNodes = []
    if (data) {
      let lines = data.split('\n');
      for (let i = 0; i < lines.length; i++) {
        if (lines[i].length > 0) {
          cacheNodes.push(lines[i])
        }
      }
    }
   
    setup(cacheNodes)
   });
   
   module.exports = app;
   ```

1. `nodejs-example-express-elasticache/bin/www` 파일의 내용을 다음으로 바꿉니다:

   ```
   #!/usr/bin/env node
   
   /**
    * Module dependencies.
    */
   
   const app = require('../app');
   const cluster = require('cluster');
   const debug = require('debug')('nodejs-example-express-elasticache:server');
   const http = require('http');
   const workers = {},
     count = require('os').cpus().length;
   
   function spawn() {
     const worker = cluster.fork();
     workers[worker.pid] = worker;
     return worker;
   }
   
   
   /**
    * Get port from environment and store in Express.
    */
   
   const port = normalizePort(process.env.PORT || '3000');
   app.set('port', port);
   
   if (cluster.isMaster) {
     for (let i = 0; i < count; i++) {
       spawn();
     }
   
     // If a worker dies, log it to the console and start another worker.
     cluster.on('exit', function (worker, code, signal) {
       console.log('Worker ' + worker.process.pid + ' died.');
       cluster.fork();
     });
   
     // Log when a worker starts listening
     cluster.on('listening', function (worker, address) {
       console.log('Worker started with PID ' + worker.process.pid + '.');
     });
   
   } else {
     /**
      * Create HTTP server.
      */
   
     let server = http.createServer(app);
   
     /**
      * Event listener for HTTP server "error" event.
      */
   
     function onError(error) {
       if (error.syscall !== 'listen') {
         throw error;
       }
   
       const bind = typeof port === 'string'
         ? 'Pipe ' + port
         : 'Port ' + port;
   
       // handle specific listen errors with friendly messages
       switch (error.code) {
         case 'EACCES':
           console.error(bind + ' requires elevated privileges');
           process.exit(1);
           break;
         case 'EADDRINUSE':
           console.error(bind + ' is already in use');
           process.exit(1);
           break;
         default:
           throw error;
       }
     }
   
     /**
      * Event listener for HTTP server "listening" event.
      */
   
     function onListening() {
       const addr = server.address();
       const bind = typeof addr === 'string'
         ? 'pipe ' + addr
         : 'port ' + addr.port;
       debug('Listening on ' + bind);
     }
   
     /**
      * Listen on provided port, on all network interfaces.
      */
   
     server.listen(port);
     server.on('error', onError);
     server.on('listening', onListening);
   }
   
   /**
    * Normalize a port into a number, string, or false.
    */
   
   function normalizePort(val) {
     const port = parseInt(val, 10);
   
     if (isNaN(port)) {
       // named pipe
       return val;
     }
   
     if (port >= 0) {
       // port number
       return port;
     }
   
     return false;
   }
   ```

1. [**eb deploy**](eb3-deploy.md) 명령으로 Elastic Beanstalk 환경으로 변경된 애플리케이션을 배포합니다.

   ```
   ~/nodejs-example-express-elasticache$ eb deploy
   ```

1. 몇 분 후 환경이 업데이트됩니다. 환경이 녹색이고 준비되면 URL을 새로 고쳐서 작동하는지 확인합니다. “Welcome to Express”라는 웹 페이지가 보일 것입니다.

애플리케이션을 실행 중인 EC2 인스턴스에 대한 로그에 액세스할 수 있습니다. 로그 액세스 방법에 대한 지침은 [Elastic Beanstalk 환경에서 Amazon EC2 인스턴스 로그 보기](using-features.logging.md) 단원을 참조하십시오.

그 다음 Amazon ElastiCache를 사용하여 Express 애플리케이션을 업데이트합니다.

**Amazon ElastiCache를 사용하여 Express 애플리케이션 업데이트하려면**

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

1. 다음 코드 조각을 사용하여 구성 파일 `nodejs-example-express-elasticache/.ebextensions/elasticache-iam-with-script.config`를 만듭니다. 구성 파일에 대한 자세한 내용은 [Node.js 구성 네임스페이스](create_deploy_nodejs.container.md#nodejs-namespaces) 섹션을 참조하세요. 이렇게 하면 캐시가 변경될 때마다 elasticache 노드를 발견하고 파일에 기록하는 데 필요한 권한이 있는 IAM 사용자가 생성됩니다. [nodejs-example-express-elasticache.zip](samples/nodejs-example-express-elasticache.zip)에서 파일을 복사할 수도 있습니다. ElastiCache 속성에 대한 자세한 내용은 [예: ElastiCache](customize-environment-resources-elasticache.md) 단원을 참조하십시오.
**참고**  
YAML은 일정한 들여쓰기를 사용합니다. 예제 구성 파일의 콘텐츠를 바꿀 때 들여쓰기 레벨을 일치시키고, 텍스트 편집기가 탭 문자 대신 공백을 사용해 들여쓰기를 하도록 합니다.

   ```
   Resources:
     MyCacheSecurityGroup:
       Type: 'AWS::EC2::SecurityGroup'
       Properties:
         GroupDescription: "Lock cache down to webserver access only"
         SecurityGroupIngress:
           - IpProtocol: tcp
             FromPort:
               Fn::GetOptionSetting:
                 OptionName: CachePort
                 DefaultValue: 11211
             ToPort:
               Fn::GetOptionSetting:
                 OptionName: CachePort
                 DefaultValue: 11211
             SourceSecurityGroupName:
               Ref: AWSEBSecurityGroup
     MyElastiCache:
       Type: 'AWS::ElastiCache::CacheCluster'
       Properties:
         CacheNodeType:
           Fn::GetOptionSetting:
             OptionName: CacheNodeType
             DefaultValue: cache.t2.micro
         NumCacheNodes:
           Fn::GetOptionSetting:
             OptionName: NumCacheNodes
             DefaultValue: 1
         Engine:
           Fn::GetOptionSetting:
             OptionName: Engine
             DefaultValue: redis
         VpcSecurityGroupIds:
           -
             Fn::GetAtt:
               - MyCacheSecurityGroup
               - GroupId
     AWSEBAutoScalingGroup :
       Metadata :
         ElastiCacheConfig :
           CacheName :
             Ref : MyElastiCache
           CacheSize :
              Fn::GetOptionSetting:
                OptionName : NumCacheNodes
                DefaultValue: 1
     WebServerUser : 
       Type : AWS::IAM::User
       Properties :
         Path : "/"
         Policies:
           -
             PolicyName: root
             PolicyDocument :
               Statement :
                 -
                   Effect : Allow
                   Action : 
                     - cloudformation:DescribeStackResource
                     - cloudformation:ListStackResources
                     - elasticache:DescribeCacheClusters
                   Resource : "*"
     WebServerKeys :
       Type : AWS::IAM::AccessKey
       Properties :
         UserName :
           Ref: WebServerUser
   
   Outputs:
     WebsiteURL:
       Description: sample output only here to show inline string function parsing
       Value: |
         http://`{ "Fn::GetAtt" : [ "AWSEBLoadBalancer", "DNSName" ] }`
     MyElastiCacheName:
       Description: Name of the elasticache
       Value:
         Ref : MyElastiCache
     NumCacheNodes:
       Description: Number of cache nodes in MyElastiCache
       Value:
         Fn::GetOptionSetting:
           OptionName : NumCacheNodes
           DefaultValue: 1
   
   files:
     "/etc/cfn/cfn-credentials" :
       content : |
         AWSAccessKeyId=`{ "Ref" : "WebServerKeys" }`
         AWSSecretKey=`{ "Fn::GetAtt" : ["WebServerKeys", "SecretAccessKey"] }`
       mode : "000400"
       owner : root
       group : root
   
     "/etc/cfn/get-cache-nodes" :
       content : |
         # Define environment variables for command line tools
         export AWS_ELASTICACHE_HOME="/home/ec2-user/elasticache/$(ls /home/ec2-user/elasticache/)"
         export AWS_CLOUDFORMATION_HOME=/opt/aws/apitools/cfn
         export PATH=$AWS_CLOUDFORMATION_HOME/bin:$AWS_ELASTICACHE_HOME/bin:$PATH
         export AWS_CREDENTIAL_FILE=/etc/cfn/cfn-credentials
         export JAVA_HOME=/usr/lib/jvm/jre
   
         # Grab the Cache node names and configure the PHP page
         aws cloudformation list-stack-resources --stack `{ "Ref" : "AWS::StackName" }` --region `{ "Ref" : "AWS::Region" }` --output text | grep MyElastiCache | awk '{print $4}' | xargs -I {} aws elasticache describe-cache-clusters --cache-cluster-id {} --region `{ "Ref" : "AWS::Region" }` --show-cache-node-info --output text | grep '^ENDPOINT' | awk '{print $2 ":" $3}' > `{ "Fn::GetOptionSetting" : { "OptionName" : "NodeListPath", "DefaultValue" : "/var/www/html/nodelist" } }`
       mode : "000500"
       owner : root
       group : root
   
     "/etc/cfn/hooks.d/cfn-cache-change.conf" :
       "content": |
         [cfn-cache-size-change]
         triggers=post.update
         path=Resources.AWSEBAutoScalingGroup.Metadata.ElastiCacheConfig
         action=/etc/cfn/get-cache-nodes
         runas=root
   
   sources :
     "/home/ec2-user/elasticache" : "https://elasticache-downloads.s3.amazonaws.com/AmazonElastiCacheCli-latest.zip"
   
   commands: 
     make-elasticache-executable:
       command: chmod -R ugo+x /home/ec2-user/elasticache/*/bin/*
   
   packages : 
     "yum" :
       "aws-apitools-cfn"  : []
   
   container_commands:
     initial_cache_nodes:
       command: /etc/cfn/get-cache-nodes
   ```

1. 다음 코드 조각을 사용하여 로컬 컴퓨터에 구성 파일 `nodejs-example-express-elasticache/.ebextensions/elasticache_settings.config`를 만들어 ElastiCache를 구성합니다.

   ```
   option_settings:
     "aws:elasticbeanstalk:customoption":
        CacheNodeType: cache.t2.micro
        NumCacheNodes: 1
        Engine: memcached
        NodeListPath: /var/nodelist
   ```

1. 로컬 컴퓨터에서 `nodejs-example-express-elasticache/express-app.js`를 다음 코드 조각으로 교체합니다. 이 파일은 디스크(`/var/nodelist`)에서 노드 목록을 읽고 노드가 있는 경우 express가 `memcached`를 세션 저장소로 사용하도록 구성합니다. 파일은 다음과 같습니다.

   ```
   /**
    * Module dependencies.
    */
   
   var express = require('express'),
       session = require('express-session'),
       bodyParser = require('body-parser'),
       methodOverride = require('method-override'),
       cookieParser = require('cookie-parser'),
       fs = require('fs'),
       filename = '/var/nodelist',
       app = module.exports = express();
   
   var MemcachedStore = require('connect-memcached')(session);
   
   function setup(cacheNodes) {
     app.use(bodyParser.raw());
     app.use(methodOverride());
     if (cacheNodes) {
         app.use(cookieParser());
   
         console.log('Using memcached store nodes:');
         console.log(cacheNodes);
   
         app.use(session({
             secret: 'your secret here',
             resave: false,
             saveUninitialized: false,
             store: new MemcachedStore({'hosts': cacheNodes})
         }));
     } else {
       console.log('Not using memcached store.');
       app.use(cookieParser('your secret here'));
       app.use(session());
     }
   
     app.get('/', function(req, resp){
     if (req.session.views) {
         req.session.views++
         resp.setHeader('Content-Type', 'text/html')
         resp.write('Views: ' + req.session.views)
         resp.end()
      } else {
         req.session.views = 1
         resp.end('Refresh the page!')
       }
     });
   
     if (!module.parent) {
         console.log('Running express without cluster.');
         app.listen(process.env.PORT || 5000);
     }
   }
   
   // Load elasticache configuration.
   fs.readFile(filename, 'UTF8', function(err, data) {
       if (err) throw err;
   
       var cacheNodes = [];
       if (data) {
           var lines = data.split('\n');
           for (var i = 0 ; i < lines.length ; i++) {
               if (lines[i].length > 0) {
                   cacheNodes.push(lines[i]);
               }
           }
       }
       setup(cacheNodes);
   });
   ```

1. 로컬 컴퓨터에서`package.json` 업데이트합니다:

   ```
     "dependencies": {
       "cookie-parser": "~1.4.4",
       "debug": "~2.6.9",
       "express": "~4.16.1",
       "http-errors": "~1.6.3",
       "jade": "~1.11.0",
       "morgan": "~1.9.1",
       "connect-memcached": "*",
       "express-session": "*",
       "body-parser": "*",
       "method-override": "*"   
     }
   ```

1. **npm install**를 실행합니다.

   ```
   ~/nodejs-example-express-elasticache$ npm install
   ```

1. 업데이트된 애플리케이션을 배포합니다.

   ```
   ~/nodejs-example-express-elasticache$ eb deploy
   ```

1. 몇 분 후 환경이 업데이트됩니다. 환경이 녹색이고 준비되면 코드가 제대로 작동하는지 확인합니다.

   1. ElastiCache 측정치를 보려면 [Amazon CloudWatch 콘솔](https://console.aws.amazon.com/cloudwatch/home)을 확인합니다. ElastiCache 메트릭을 보려면 왼쪽 창에서 **메트릭**을 선택한 다음 **CurrItems**를 검색합니다. **ElastiCache> 캐시 노드 메트릭**을 선택한 다음 캐시 노드를 선택하여 캐시에 있는 항목 수를 봅니다.  
![\[CloudWatch dashboard showing CurrItems metric for an ElastiCache node over time.\]](http://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/images/elasticache-express.png)
**참고**  
애플리케이션을 배포한 해당 리전을 확인해야 합니다.

      다른 웹 브라우저에 애플리케이션 URL을 복사하여 붙여 넣고 페이지를 새로 고치면, 5분 후 CurrItem 수가 늘어납니다.

   1. 사용자 로그의 스냅샷을 생성합니다. 로그 검색에 대한 자세한 내용은 [Elastic Beanstalk 환경에서 Amazon EC2 인스턴스 로그 보기](using-features.logging.md) 단원을 참조하십시오.

   1. 로그 번들에서 파일 `/var/log/nodejs/nodejs.log`를 확인합니다. 다음과 유사한 결과가 출력되어야 합니다.

      ```
      Using memcached store nodes:
      [ 'aws-my-1oys9co8zt1uo.1iwtrn.0001.use1.cache.amazonaws.com:11211' ]
      ```

## 정리
<a name="nodejs-express-clustering.delete"></a>

더 이상 애플리케이션을 실행하지 않으려면 환경을 종료하고 애플리케이션을 삭제하여 정리할 수 있습니다.

`eb terminate` 명령을 사용하여 환경을 종료하고 `eb delete` 명령을 사용하여 애플리케이션을 삭제합니다.

**환경을 종료하려면**

로컬 리포지토리를 생성한 디렉터리에서 `eb terminate`을 실행합니다.

```
$ eb terminate
```

이 프로세스는 몇 분 정도 걸릴 수 있습니다. 환경이 성공적으로 종료되면 Elastic Beanstalk가 메시지를 표시합니다.

# Elastic Beanstalk에 DynamoDB를 사용하는 Node.js 애플리케이션 배포
<a name="nodejs-dynamodb-tutorial"></a>

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

다음은 예시 애플리케이션을 설명합니다:
+ 사용자가 제공한 텍스트 데이터를 저장하는 DynamoDB 테이블입니다.
+ 테이블을 생성하기 위한 [구성 파일입니다](ebextensions.md).
+ Amazon Simple Notification Service(Amazon SNS) 주제.
+  [package.json 파일](nodejs-platform-dependencies.md#nodejs-platform-packagejson)을 사용하여 배포 중에 패키지를 설치하는 방법을 보여 줍니다.

**Topics**
+ [사전 조건](#nodejs-dynamodb-tutorial-prereqs)
+ [Elastic Beanstalk 환경 생성](#nodejs-dynamodb-tutorial-launch)
+ [환경의 인스턴스에 권한 추가](#nodejs-dynamodb-tutorial-role)
+ [예제 애플리케이션 배포](#nodejs-dynamodb-tutorial-deploy)
+ [DynamoDB 테이블 생성](#nodejs-dynamodb-tutorial-database)
+ [애플리케이션별 구성 파일 업데이트](#nodejs-dynamodb-tutorial-update)
+ [고가용성을 위한 환경 구성](#nodejs-dynamodb-tutorial-configure)
+ [정리](#nodejs-dynamodb-tutorial-cleanup)
+ [다음 단계](#nodejs-dynamodb-tutorial-nextsteps)

## 사전 조건
<a name="nodejs-dynamodb-tutorial-prereqs"></a>

이 튜토리얼의 사전 요구 사항은 다음과 같습니다:
+ Node.js 런타임
+ 기본 Node.js 패키지 관리자 소프트웨어인 npm
+ 익스프레스 커맨드 라인 생성기
+ Elastic Beanstalk 명령줄 인터페이스(EB CLI)

나열된 처음 세개 구성 요소의 설치 및 로컬 개발 환경 설정에 대한 자세한 내용은 [Elastic Beanstalk를 위한 Node.js 개발 환경 설정](nodejs-devenv.md)을 참조하십시오. 이 자습서에서는 참조된 주제에도 언급된 Node.js용 AWS SDK를 설치할 필요가 없습니다.

EB CLI 설치 및 구성에 대한 자세한 내용은 [설정 스크립트를 사용하여 EB CLI 설치(권장)](eb-cli3.md#eb-cli3-install) 및 [EB CLI 구성](eb-cli3-configuration.md) 단원을 참조하세요.

## Elastic Beanstalk 환경 생성
<a name="nodejs-dynamodb-tutorial-launch"></a>

**귀하의 애플리케이션 디렉터리**  
이 튜토리얼에서는 애플리케이션 소스`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**](eb3-init.md)** 명령을 사용하여 리포지토리를 만듭니다.

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

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

1. **[**eb create**](eb3-create.md)** 명령을 사용하여 샘플 애플리케이션을 실행하는 환경을 생성합니다.

   ```
   ~/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 그룹이 확장 또는 축소됩니다.
   + **CloudFormation 스택** - Elastic Beanstalk는 CloudFormation 를 사용하여 환경에서 리소스를 시작하고 구성 변경 사항을 전파합니다. 리소스는 [CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation)에서 볼 수 있는 템플릿에서 정의됩니다.
   + **도메인 이름(Domain name)** - **subdomain*.*region*.elasticbeanstalk.com* 형식으로 웹 앱으로 라우팅되는 도메인 이름입니다.
**도메인 보안**  
Elastic Beanstalk 애플리케이션의 보안을 강화하기 위해 *elasticbeanstalk.com* 도메인이 [공개 서픽스 목록(PSL)](https://publicsuffix.org/)에 등록되어 있습니다.  
Elastic Beanstalk 애플리케이션의 기본 도메인 이름에 민감한 쿠키를 설정해야 하는 경우 보안을 강화하기 위해 `__Host-` 접두사가 있는 쿠키를 사용하는 것이 좋습니다. 이렇게 쿠키를 설정하면 교차 사이트 요청 위조 시도(CSRF)로부터 도메인이 보호됩니다. 자세한 내용은 Mozilla 개발자 네트워크의 [Set-Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes) 페이지를 참조하세요.

1. 환경 생성이 완료되면 [**eb open**](eb3-open.md) 명령을 사용하여 기본 브라우저에서 환경의 URL을 엽니다.

   ```
   ~/nodejs-example-dynamo$ eb open
   ```

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

## 환경의 인스턴스에 권한 추가
<a name="nodejs-dynamodb-tutorial-role"></a>

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

샘플 애플리케이션은 인스턴스 권한을 사용하여 DynamoDB 테이블에 데이터를 쓰고, SDK for JavaScript in Node.js를 사용하여 Amazon SNS 주제에 알림을 보냅니다. 다음 관리형 정책을 기본 [인스턴스 프로파일](concepts-roles-instance.md)에 추가해 EC2 인스턴스에 환경 권한을 부여하여 DynamoDB 및 Amazon SNS에 액세스합니다.
+ **AmazonDynamoDBFullAccess**
+ **AmazonSNSFullAccess**

**기본 인스턴스 프로파일에 정책을 추가하려면**

1. IAM 콘솔에서 [역할(Roles)](https://console.aws.amazon.com/iam/home#roles) 페이지를 엽니다.

1. **aws-elasticbeanstalk-ec2-role**을 선택합니다.

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

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

1. **정책 연결**을 선택합니다.

인스턴스 프로파일 관리에 대한 자세한 내용은 [Elastic Beanstalk 인스턴스 프로파일 관리](iam-instanceprofile.md) 단원을 참조하세요.

## 예제 애플리케이션 배포
<a name="nodejs-dynamodb-tutorial-deploy"></a>

이제 환경이 이 튜토리얼의 예제 애플리케이션인 [nodejs-example-dynamo.zip](samples/nodejs-example-dynamo.zip) 를 배포한 다음 실행할 준비가 됩니다.

**튜토리얼 예제 애플리케이션을 배포하고 실행하려면**

1. 현재 작업 디렉터리를 애플리케이션 디렉터리 `nodejs-example-dynamo`로 변경합니다.

   ```
   ~$ cd nodejs-example-dynamo
   ```

1. 예제 애플리케이션 소스 번들 [nodejs-example-dynamo.zip](samples/nodejs-example-dynamo.zip)의 내용을 애플리케이션 디렉터리 `nodejs-example-dynamo`에 다운로드하여 압축을 풉니다.

1. [**eb deploy**](eb3-deploy.md) 명령으로 Elastic Beanstalk 환경에 예제 애플리케이션을 배포합니다.

   ```
   ~/nodejs-example-dynamo$ eb deploy
   ```
**참고**  
기본적으로 `eb deploy` 명령은 프로젝트 폴더의 ZIP 파일을 생성합니다. 또한 프로젝트 폴더의 ZIP 파일을 만드는 대신 빌드 프로세스의 결과물을 배포하도록 EB CLI를 구성할 수도 있습니다. 자세한 내용은 [프로젝트 폴더 대신 아티팩트 배포](eb-cli3-configuration.md#eb-cli3-artifact) 단원을 참조하십시오.

1. 환경 생성이 완료되면 [**eb open**](eb3-open.md) 명령을 사용하여 기본 브라우저에서 환경의 URL을 엽니다.

   ```
   ~/nodejs-example-dynamo$ eb open
   ```

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

![\[Startup landing page with teaser message and sign-up button for upcoming product launch.\]](http://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/images/nodejs-dynamodb-tutorial-app.png)


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

**테이블을 보려면**

1. DynamoDB 콘솔에서 [테이블 페이지](https://console.aws.amazon.com/dynamodb/home?#tables:)를 엽니다.

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

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

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

**주제를 보려면**

1. Amazon SNS 콘솔에서 [주제 페이지](https://console.aws.amazon.com/sns/v2/home?#/topics)를 엽니다.

1. 애플리케이션에서 생성한 주제를 찾습니다. 테이블 이름은 **awseb**로 시작하며 **NewSignupTopic**을 포함합니다.

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

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

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

## DynamoDB 테이블 생성
<a name="nodejs-dynamodb-tutorial-database"></a>

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

다음 설정을 사용하여 테이블을 생성합니다.
+ **테이블 이름** – **nodejs-tutorial**
+ **기본 키** – **email**
+ 기본 키 유형 – **문자열**

**DynamoDB 테이블 생성**

1. DynamoDB Management Console에서 [테이블 페이지](https://console.aws.amazon.com/dynamodb/home?#tables:)를 엽니다.

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

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

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

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

## 애플리케이션별 구성 파일 업데이트
<a name="nodejs-dynamodb-tutorial-update"></a>

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

**프로덕션용으로 예제 애플리케이션을 업데이트하려면**

1. 현재 작업 디렉터리를 애플리케이션 디렉터리 `nodejs-example-dynamo`로 변경합니다.

   ```
   ~$ cd nodejs-example-dynamo
   ```

1. `.ebextensions/options.config`를 열고 다음 설정의 값을 변경합니다.
   + **NewSignupEmail** – 이메일 주소입니다.
   + **STARTUP\$1SIGNUP\$1TABLE** – **nodejs-tutorial**

     
**Example .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`.

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

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

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

1. [**eb deploy**](eb3-deploy.md) 명령으로 Elastic Beanstalk 환경에 업데이트된 애플리케이션을 배포합니다.

   ```
   ~/nodejs-example-dynamo$ eb deploy
   ```

1. 환경 생성이 완료되면 [**eb open**](eb3-open.md) 명령을 사용하여 기본 브라우저에서 환경의 URL을 엽니다.

   ```
   ~/nodejs-example-dynamo$ eb open
   ```

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

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

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

**테이블을 보려면**

1. DynamoDB 콘솔에서 [테이블 페이지](https://console.aws.amazon.com/dynamodb/home?#tables:)를 엽니다.

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

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

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

## 고가용성을 위한 환경 구성
<a name="nodejs-dynamodb-tutorial-configure"></a>

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

**고가용성을 위해 환경의 Auto Scaling 그룹을 구성하려면**

1. [Elastic Beanstalk 콘솔](https://console.aws.amazon.com/elasticbeanstalk)을 열고 **리전** 목록에서를 선택합니다 AWS 리전.

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

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

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

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

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

## 정리
<a name="nodejs-dynamodb-tutorial-cleanup"></a>

데모 코드 작업을 마치면 환경을 종료할 수 있습니다. Elastic Beanstalk는 [Amazon EC2 인스턴스](using-features.managing.ec2.md), [데이터베이스 인스턴스](using-features.managing.db.md), [로드 밸런서](using-features.managing.elb.md), 보안 그룹 및 [경보](using-features.alarms.md#using-features.alarms.title)와 같은 모든 관련 AWS 리소스를 삭제합니다.

리소스를 제거해도 Elastic Beanstalk 애플리케이션은 삭제되지 않으므로 언제든 애플리케이션을 위한 새 환경을 생성할 수 있습니다.

**콘솔에서 Elastic Beanstalk 환경을 종료하려면**

1. [Elastic Beanstalk 콘솔](https://console.aws.amazon.com/elasticbeanstalk)을 열고 **리전** 목록에서를 선택합니다 AWS 리전.

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

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

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

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

**DynamoDB 테이블 삭제**

1. DynamoDB 콘솔에서 [테이블 페이지](https://console.aws.amazon.com/dynamodb/home?#tables:)를 엽니다.

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

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

1. **삭제**를 선택합니다.

## 다음 단계
<a name="nodejs-dynamodb-tutorial-nextsteps"></a>

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

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

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

# Node.js Elastic Beanstalk 환경에 Amazon RDS DB 인스턴스 추가
<a name="create-deploy-nodejs.rds"></a>

여기에서는 Elastic Beanstalk 콘솔을 사용하여 Amazon RDS를 생성하는 방법을 설명합니다. Amazon Relational Database Service(RDS) DB 인스턴스를 통해 애플리케이션이 수집하고 수정하는 데이터를 저장할 수 있습니다. Elastic Beanstalk를 통해 데이터베이스를 환경으로 연결한 후 관리하거나 비연결을 통해 생성하여 외부 기타 서버로 관리할 수 있습니다. 이러한 지침에서 데이터베이스는 Elastic Beanstalk를 통해 사용자 환경에 연결되고 관리됩니다. Elastic Beanstalk를 통한 Amazon RDS 통합에 대한 자세한 내용은 [Elastic Beanstalk 환경에 데이터베이스 추가](using-features.managing.db.md)을 참조하십시오.

**Topics**
+ [환경에 DB 인스턴스 추가](#nodejs-rds-create)
+ [드라이버 다운로드](#nodejs-rds-drivers)
+ [데이터베이스로 연결](#nodejs-rds-connect)

## 환경에 DB 인스턴스 추가
<a name="nodejs-rds-create"></a>

**환경에 DB 인스턴스를 추가하려면**

1. [Elastic Beanstalk 콘솔](https://console.aws.amazon.com/elasticbeanstalk)을 열고 **리전** 목록에서를 선택합니다 AWS 리전.

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

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

1. **데이터베이스** 구성 범주에서 **편집**을 선택합니다.

1. DB 엔진을 선택하고 사용자 이름과 암호를 입력합니다.

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

DB 인스턴스를 추가하는 데 약 10분 정도 소요됩니다. 환경 업데이트가 완료되면 애플리케이션에서 다음 환경 속성을 통해 DB 인스턴스 호스트 이름과 기타 연결 정보를 사용할 수 있습니다:


| 속성 이름 | 설명 | 속성 값 | 
| --- | --- | --- | 
|  `RDS_HOSTNAME`  |  DB 인스턴스의 호스트 이름입니다.  |  Amazon RDS 콘솔 **연결 및 보안** 탭의 **엔드포인트**입니다.  | 
|  `RDS_PORT`  |  DB 인스턴스가 연결을 허용하는 포트입니다. DB 엔진마다 기본값이 다릅니다.  |  Amazon RDS 콘솔 **연결 및 보안** 탭의 **포트**입니다.  | 
|  `RDS_DB_NAME`  |  데이터베이스 이름은 **ebdb**입니다.  |  Amazon RDS 콘솔 **구성** 탭의 **DB 이름**입니다.  | 
|  `RDS_USERNAME`  |  데이터베이스에 구성된 사용자 이름입니다.  |  Amazon RDS 콘솔 **구성** 탭의 **마스터 사용자 이름**입니다.  | 
|  `RDS_PASSWORD`  |  데이터베이스에 구성된 암호입니다.  |  Amazon RDS 콘솔에서 참조용 정보를 사용할 수 없습니다.  | 

Elastic Beanstalk 환경에 결합된 데이터베이스에 대한 자세한 내용은 [Elastic Beanstalk 환경에 데이터베이스 추가](using-features.managing.db.md)을 참조하세요.

## 드라이버 다운로드
<a name="nodejs-rds-drivers"></a>

데이터베이스 드라이버를 `dependencies`에 있는 프로젝트 [`package.json` 파일](nodejs-platform-dependencies.md#nodejs-platform-packagejson)에 추가합니다.

**Example `package.json` – MySQL을 이용한 Express**  

```
{
  "name": "my-app",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "ejs": "latest",
    "aws-sdk": "latest",
    "express": "latest",
    "body-parser": "latest",
    "mysql": "latest"
  },
  "scripts": {
    "start": "node app.js"
  }
}
```

**일반적인 Node.js용 드라이버 패키지**
+ **MySQL** – [mysql](https://www.npmjs.com/package/mysql)
+ **PostgreSQL** – [node-postgres](https://www.npmjs.com/package/pg)
+ **SQL Server** – [node-mssql](https://www.npmjs.com/package/mssql)
+ **Oracle** – [node-oracledb](https://www.npmjs.com/package/oracledb)

## 데이터베이스로 연결
<a name="nodejs-rds-connect"></a>

Elastic Beanstalk에서는 환경 속성을 통해 연결된 DB 인스턴스의 연결 정보를 제공합니다. `process.env.VARIABLE` 를 통해 속성을 읽고 데이터베이스 연결을 구성합니다.

**Example app.js – MySQL 데이터베이스 연결**  

```
var mysql = require('mysql');

var connection = mysql.createConnection({
  host     : process.env.RDS_HOSTNAME,
  user     : process.env.RDS_USERNAME,
  password : process.env.RDS_PASSWORD,
  port     : process.env.RDS_PORT
});

connection.connect(function(err) {
  if (err) {
    console.error('Database connection failed: ' + err.stack);
    return;
  }

  console.log('Connected to database.');
});

connection.end();
```
node-mysql을 사용하여 연결 문자열을 구성하는 것에 대한 자세한 내용은 [npmjs.org/package/mysql](https://npmjs.org/package/mysql) 단원을 참조하십시오.

# Node.js 도구 및 리소스
<a name="create_deploy_nodejs.resources"></a>

Node.js 애플리케이션을 개발할 때 다음과 같은 곳에서 추가적인 도움을 받을 수 있습니다.


****  

|  Resource  |  설명  | 
| --- | --- | 
|  [GitHub](https://github.com/aws/aws-sdk-js)  | GitHub를 사용하여 AWS SDK for Node.js를 설치합니다. | 
|  [AWS SDK for Node.js(개발자 미리 보기)](https://aws.amazon.com/sdkfornodejs/)  | 샘플 코드, 설명서, 도구 및 추가 리소스를 받을 수 있는 원스톱 상점입니다. | 