

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Node.js アプリケーションを Elastic Beanstalk でデプロイする
<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 を使用してアプリケーションと環境を管理することも、Elastic Beanstalk コンソール AWS CLI、または APIs を使用することもできます。

EB CLI を使用して *Hello World* Node.js ウェブアプリケーションを作成してデプロイするには、「[Node.js の QuickStart](nodejs-quickstart.md)」のステップバイステップの手順に従います。

**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)
+ [Node.js Express アプリケーションの Elastic Beanstalk へのデプロイ](create_deploy_nodejs_express.md)
+ [クラスタリング付き Node.js Express アプリケーションの Elastic Beanstalk へのデプロイ](nodejs-express-clustering.md)
+ [DynamoDB を使用して Node.js アプリケーションを Elastic Beanstalk にデプロイする](nodejs-dynamodb-tutorial.md)
+ [Amazon RDS DB インスタンスを Node.js Elastic Beanstalk 環境に追加する](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 アカウントのルートユーザー、 のセキュリティを確保し AWS IAM アイデンティティセンター、 を有効にして管理ユーザーを作成します。

**を保護する AWS アカウントのルートユーザー**

1.  **ルートユーザー**を選択し、 AWS アカウント E メールアドレスを入力して、アカウント所有者[AWS マネジメントコンソール](https://console.aws.amazon.com/)として にサインインします。次のページでパスワードを入力します。

   ルートユーザーを使用してサインインする方法については、「*AWS サインイン ユーザーガイド*」の「[ルートユーザーとしてサインインする](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 アイデンティティセンターを有効にします。

   手順については、「*AWS IAM アイデンティティセンター ユーザーガイド*」の「[AWS IAM アイデンティティセンターの有効化](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)」を参照してください。

1. IAM アイデンティティセンターで、ユーザーに管理アクセスを付与します。

   を ID ソース IAM アイデンティティセンターディレクトリ として使用する方法のチュートリアルについては、「 *AWS IAM アイデンティティセンター ユーザーガイド*」の[「デフォルトを使用してユーザーアクセスを設定する IAM アイデンティティセンターディレクトリ](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html)」を参照してください。

**管理アクセス権を持つユーザーとしてサインインする**
+ IAM アイデンティティセンターのユーザーとしてサインインするには、IAM アイデンティティセンターのユーザーの作成時に E メールアドレスに送信されたサインイン URL を使用します。

  IAM Identity Center ユーザーを使用してサインインする方法については、*AWS サインイン 「 ユーザーガイド*[」の AWS 「 アクセスポータルにサインイン](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)する」を参照してください。

**追加のユーザーにアクセス権を割り当てる**

1. IAM アイデンティティセンターで、最小特権のアクセス許可を適用するというベストプラクティスに従ったアクセス許可セットを作成します。

   手順については、「*AWS IAM アイデンティティセンター ユーザーガイド*」の「[アクセス許可セットを作成する](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)」を参照してください。

1. グループにユーザーを割り当て、そのグループにシングルサインオンアクセス権を割り当てます。

   手順については、「*AWS IAM アイデンティティセンター ユーザーガイド*」の「[グループを追加する](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)」を参照してください。

## 前提条件
<a name="nodejs-quickstart-prereq"></a>

このガイドの手順に従うには、run commands のためのコマンドラインターミナルまたはシェルが必要になります。コマンドは、該当する場合、プロンプト記号 (\$1) と現在のディレクトリの名前が前に付けられて、リストに示されます。

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

Linux および macOS では、任意のシェルとパッケージ管理者を使用できます。Windows では、[Linux 用の Windows サブシステムをインストール](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. (オプション) **eb init** を再度実行してデフォルトのキーペアを設定し、アプリケーションを実行している EC2 インスタンスに SSH を使用して connect できるようにします。

   ```
   ~/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 ]
   ```

   1 つのキーペアがすでにある場合はそれを選択するか、またはプロンプトに従ってキーペアを作成します。プロンプトが表示されないか設定を後で変更する必要がない場合は、**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
```

お疲れ様でした。Elastic Beanstalk で Node.js アプリケーションをデプロイしました。これにより、アプリケーション用に作成されたドメイン名を使用してブラウザ Window が開きます。

## ステップ 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>

1 つのインスタンスアプリケーションを作成しました。1 つの EC2 インスタンスを持つ簡単なサンプルアプリケーションとして動作するため、ロードバランシングや自動スケーリングは必要ありません。単一インスタンスアプリケーションの場合、Elastic Beanstalk は次の AWS リソースを作成します。
+ **EC2 インスタンス** – 選択したプラットフォームでウェブアプリケーションを実行するよう設定された Amazon EC2 仮想マシン。

  各プラットフォームは、それぞれ特定の言語バージョン、フレームワーク、ウェブコンテナ、またはそれらの組み合わせをサポートするための、さまざまなソフトウェア、設定ファイル、スクリプトを実行します。ほとんどのプラットフォームでは、ウェブアプリケーションの前にウェブトラフィックを処理するリバースプロキシとして Apache または nginx のいずれかを使用します。そのプロキシがリクエストをアプリケーションに転送し、静的アセットを提供して、アクセスログとエラーログを生成します。
+ **インスタンスセキュリティグループ** – ポート 80 上の受信トラフィックを許可するよう設定された Amazon EC2 セキュリティグループ。このリソースでは、ロードバランサーからの HTTP トラフィックが、ウェブ・アプリケーションを実行している EC2 インスタンスに達することができます。デフォルトでは、トラフィックは他のポート上で許可されません。
+ **Amazon S3 バケット** – Elastic Beanstalk の使用時に作成されるソースコード、ログ、その他のアーティファクトの保存場所。
+ **Amazon CloudWatch アラーム** – 環境内のインスタンスの負荷を監視する 2 つの CloudWatch アラーム。負荷が高すぎる、または低すぎる場合にトリガーされます。アラームがトリガーされると、Auto Scaling グループはレスポンスとしてスケールアップまたはダウンを行います。
+ **CloudFormation スタック** – Elastic Beanstalk は CloudFormation を使用して環境内のリソースを起動し、設定変更を伝達します。リソースは、[CloudFormation コンソール](https://console.aws.amazon.com/cloudformation)に表示できるテンプレートで定義されます。
+  **ドメイン名** – ウェブ・アプリケーションまでのルートとなるドメイン名であり、**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)」を参照してください。

1 つか 2 つのサンプルアプリケーションをデプロイし、ローカルで 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>

このトピックでは、Node.js 開発環境を設定し、アプリケーションを AWS Elastic Beanstalkにデプロイする前にローカルでテストする手順について説明します。また、便利なツールのインストール手順を提供するウェブサイトも参照します。

**Topics**
+ [Node.js をインストールします](#nodejs-devenv-nodejs)
+ [npm のインストールを確認します](#nodejs-devenv-npm)
+ [AWS SDK for Node.js をインストールする](#nodejs-devenv-awssdk)
+ [Express ジェネレーターをインストールする](#nodejs-devenv-express)
+ [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 リソースを管理する必要がある場合は、 AWS SDK for JavaScript を Node.js にインストールします。次のように npm を使用して SDK をインストールします。

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

詳細については、「[AWS SDK for JavaScript in Node.js](https://aws.amazon.com/sdk-for-node-js/)」のホームページにアクセスしてください。

## Express ジェネレーターをインストールする
<a name="nodejs-devenv-express"></a>

Express は、Node.js を実行するウェブアプリケーションフレームワークです。これを使用するには、まず Express ジェネレーターコマンドラインアプリケーションをインストールします。Express ジェネレーターがインストールされたら、**express** コマンドを実行してウェブアプリケーションのベースプロジェクト構造を生成できます。ベースプロジェクト、ファイル、および依存関係がインストールされたら、開発マシン上でローカル Express サーバーを起動できます。

 

**注記**  
次のステップでは、Linux オペレーティングシステム上に Express ジェネレーターをインストールする手順を説明します。
Linux では、システムディレクトリに対する許可レベルに応じて、これらのコマンドの一部のプレフィックスに `sudo` が必要になる場合があります。

**Express ジェネレーターを開発環境にインストールするには**

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` ディレクトリでこれを実現するステップを実行します。

## Express フレームワークとサーバーを設定する
<a name="nodejs-devenv-express-framework"></a>

次のステップに従って、ベース Express フレームワークのディレクトリとコンテンツを作成します。この章のチュートリアルには、チュートリアルの各アプリケーションディレクトリにベース 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` を実行するか、ローカルコンピュータでブラウザを開いて URL アドレス `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)を含めることができます。設定ファイルの設定は、環境を作成するたびに、またはアプリケーションをデプロイするたびに適用されます。設定ファイルを使用して、デプロイの間にパッケージをインストールしたり、スクリプトを実行したり、他のインスタンスのカスタマイズオペレーションを実行することもできます。

ソースバンドルに [`Package.json` ファイルを含めて](nodejs-platform-dependencies.md#nodejs-platform-packagejson)、デプロイ中にパッケージをインストールしたり、開始コマンドを指定したり、アプリケーションで使用する Node.js のバージョンを指定したりできます。依存関係のバージョンをロックダウンする [`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>

[**ログ Options**] セクションには、2 つの設定があります。
+ **インスタンスプロファイル** – アプリケーションに関連付けられた Amazon S3 バケットへのアクセス許可が付与されているインスタンスプロファイルを指定します。
+ **[Enable log file rotation to Amazon S3]** (Amazon S3 へのログファイルのローテーションの有効化) - アプリケーションの Amazon EC2 インスタンスのログファイルを、アプリケーションに関連付けられている Amazon S3 バケットにコピーするかどうかを指定します。

### 静的ファイル
<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 2 より前の) Amazon Linux AMI プラットフォームバージョンを使用している場合は、このセクションで具体的な設定と推奨事項を検討してください。

**注意事項**  
このトピックの情報は、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 に対する support がプラットフォームバージョンから削除された場合は、[プラットフォームの更新](using-features.platform.upgrade.md)に先立って、バージョニング設定を変更または削除する必要があります。これは、1 つ以上のバージョンの Node.js でセキュリティの脆弱性が検出された場合に発生することがあります  
この場合、設定した [NodeVersion](command-options-specific.md#command-options-nodejs) をサポートしない新しいバージョンのプラットフォームにアップグレードしようとすると、失敗します。新しい環境の作成を回避するには、古いプラットフォームバージョンと新しいプラットフォームバージョンの両方でsupport されている Node.js バージョンに *NodeVersion* 設定オプションを変更するか、[オプション設定を削除](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/ja_jp/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 に設定し、圧縮を有効にします。最後に、2 つのソースディレクトリから静的ファイルを提供するようにプロキシを設定します。1 つのソースは、`statichtml` ソースディレクトリからのウェブサイトのルート下の `html` パスにある HTML  ファイルです。もう 1 つのソースは、`staticimages` ソースディレクトリからのウェブサイトのルートの下の `images` パスにあるイメージファイルです。

**Example .ebextensions/ノード-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` の使用方法については、「[ビルドファイルと 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 ドキュメントの「[node\$1modules フォルダからの読み込み](https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders)」を参照してください。

これらのモジュールの依存関係は、`package.json` ファイルを使用して指定できます。Elastic Beanstalk がこのファイルを検出し、`node_modules` ディレクトリが存在しない場合、Elastic Beanstalk は *webapp* ユーザーとして `npm install` を実行します。この `npm install` コマンドでは、Elastic Beanstalk であらかじめ作成した `node_modules` ディレクトリに依存関係をインストールします。この `npm install` コマンドでは、パブリック npm レジストリまたは他のロケーションから `package.json` ファイルにリストされているパッケージにアクセスします。詳細については、[npm ドキュメント](https://docs.npmjs.com/about-the-public-npm-registry)のウェブサイトを参照してください。

Elastic Beanstalk で `node_modules` ディレクトリを検出した場合、`package.json` ファイルが存在していても Elastic Beanstalk で `npm install` を実行することはありません。Elastic Beanstalk では、依存関係パッケージは `node_modules` ディレクトリ内において Node.js でアクセスして読み込めることを前提としています。

次のセクションでは、アプリケーションにおける 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` ファイルを含めることにより、依存関係パッケージを指定し、スタートコマンドを指定します。`package.json` ファイルが存在し、プロジェクトソースのルートに `node_modules` ディレクトリが存在しない場合、Elastic Beanstalk は *webapp* ユーザーとして `npm install` を実行し、パブリック npm レジストリから依存関係をインストールします。また、Elastic Beanstalk で `start` コマンドを使用してアプリケーションを開始します。`package.json` ファイルの詳細については、「*npm ドキュメント*のウェブサイト」で「[`package.json` ファイルでの依存関係の指定](https://docs.npmjs.com/specifying-dependencies-and-devdependencies-in-a-package-json-file)」を参照してください。

`scripts` キーワードを使用して、スタートコマンドを指定します。現在は、`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` ファイル内で依存関係を指定するには、*dependencies* 属性と *devDependencies* 属性を使用します。*dependencies* 属性は、本番環境のアプリケーションに必要なパッケージを指定します。*devDependencies* 属性は、ローカルの開発とテストにのみ必要なパッケージを指定します。

*devDependencies* パッケージをインストールする必要がある場合は、NPM\$1USE\$1PRODUCTION 環境プロパティを `false` に設定します。この設定では、npm install の実行時に上記のオプションを使用しません。これにより、*devDependencies* パッケージがインストールされます。

## node\$1modules ディレクトリに Node.js の依存関係を含める
<a name="nodejs-platform-nodemodules"></a>

アプリケーションコードとともに依存関係パッケージを環境インスタンスにデプロイするには、プロジェクトソースのルートにある `node_modules` という名前のディレクトリにそれらを含めます。詳細については、「*npm ドキュメント*のウェブサイト」で「[パッケージをローカルでダウンロードしてインストールする](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 ドキュメントの「[node\$1modules フォルダからの読み込み](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 は *devDependencies* を省略します。コマンド `npm install --omit=dev` を使用します。

上記の両方のコマンドは、*devDependencies* であるパッケージをインストールしません。

**Git 依存関係の SSH プロトコルと HTTPS プロトコル**  
2023 年 3 月 7 日の Amazon Linux 2 プラットフォームリリース以降、SSH および HTTPS プロトコルを使用して Git リポジトリからパッケージを取得できます。プラットフォームブランチ Node.js 16 は、SSH プロトコルと HTTPS プロトコルの両方をサポートします。Node.js 14 は 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 のウェブサイトの「[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 ブランチ内では 1 つの 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 で support されているバージョン範囲オプションを使用すると、柔軟性が向上します。各プラットフォームブランチにおける有効な 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 に対する support がプラットフォームバージョンから削除された場合は、[プラットフォームの更新](using-features.platform.upgrade.md)に先立って、Node.js バージョン設定を変更または削除する必要があります。これは、1 つ以上のバージョンの Node.js でセキュリティの脆弱性が検出された場合に発生することがあります  
この場合、設定された Node.js バージョンをsupport していないプラットフォームの新しいバージョンに更新しようとすると失敗します。新しい環境を作成する必要がないようにするには、`package.json` の Node.js のバージョニング設定を、古いプラットフォームバージョンと新しいプラットフォームバージョンの両方で support されている Node.js バージョンに変更します。このトピックで前述したように、support されているバージョンを含む Node.js のバージョニング範囲を指定することもできます。また、設定を削除して、新しいソースバンドルをデプロイするオプションもあります。

# Elastic Beanstalk での npm shrinkwrap による依存関係のロック
<a name="nodejs-platform-shrinkwrap"></a>

Node.js プラットフォームは、デプロイするたびに *webapp* ユーザーとして `npm install` を実行します。依存関係の新しいバージョンが利用可能になった場合、そのインストールがアプリケーションをデプロイする際に行われ、デプロイに長い時間がかかる可能性があります。

アプリケーションの依存関係を現在のバージョンにロックダウンする `npm-shrinkwrap.json` ファイルを作成することで、依存関係のアップグレードを回避できます。

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

依存関係が 1 回のみインストールされるようにするため、出典バンドルにこのファイルを含めます。

# プロキシサーバーを設定します
<a name="nodejs-platform-proxy"></a>

Elastic Beanstalk では、リバースプロキシとして NGINX または Apache HTTPD を使用して、ポート 80 の Elastic Load Balancing ロードバランサーにアプリケーションをマッピングできます。デフォルトは NGINX です。Elastic Beanstalk にはデフォルトのプロキシ設定が用意されています。これは拡張することも、独自の設定で完全に上書きすることもできます。

デフォルトでは、Elastic Beanstalk はポート 5000 でアプリケーションにリクエストを送信するようプロキシを設定します。デフォルトのポートを上書きするには、`PORT` [環境プロパティ](create_deploy_nodejs.container.md#nodejs-platform-console)を、主要なアプリケーションがリッスンするポートに設定します。

**注記**  
アプリケーションでリッスンしているポートは、ロードバランサーからリクエストを受信するために NGINX サーバーでリッスンするポートに影響を与えません。

**ご使用のプラットフォームバージョンでプロキシサーバーを設定する**  
すべての AL2023/AL2 プラットフォームでは、統一されたプロキシ設定機能がサポートされています。AL2023/AL2 を実行中のプラットフォームバージョンでプロキシサーバーを設定する方法の詳細については、「[リバースプロキシの設定](platforms-linux-extend.proxy.md)」を参照してください。

## (Amazon Linux 2 より前の) Amazon Linux AMI でのプロキシの設定
<a name="nodejs-platform-proxy.alami"></a>

Elastic Beanstalk Node.js 環境で (Amazon Linux 2 より前の) Amazon Linux AMI プラットフォームバージョンを使用している場合は、このセクションの情報を読んでください。

**注意事項**  
このトピックの情報は、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 は、各構成がデプロイされるときにデフォルト設定を再作成します。これを考慮して、次の例では、設定のデプロイ後のフック (`/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 アプリケーションの使用を開始するには AWS Elastic Beanstalk、最初のアプリケーションバージョンとしてアップロードし、 環境にデプロイするアプリケーション[ソースバンドル](applications-sourcebundle.md)が必要です。

## Node.js サンプルアプリケーションでの環境の起動
<a name="nodejs-getstarted-samples"></a>

Elastic Beanstalk は、各プラットフォームの単一ページのサンプルアプリケーションと、Amazon RDS や言語、プラットフォーム固有の機能や APIs などの追加 AWS リソースの使用を示すより複雑な例を提供します。

**注記**  
ソースバンドル `README.md` ファイルのステップに従ってデプロイします。


**サンプル**  

|  環境タイプ  |  出典バンドル  |  説明書  | 
| --- | --- | --- | 
|  ウェブ・サーバー  |   [nodejs.zip](samples/nodejs.zip)   |  1 ページのアプリケーション。 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 Relational Database Service (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 の AWS SDK for JavaScript を使用して DynamoDB テーブルにエントリを書き込み、Elastic Beanstalk 設定ファイルを使用して DynamoDB、Amazon SNS、Amazon SQS にリソースを作成します。 [チュートリアル](nodejs-dynamodb-tutorial.md)  | 

## 次の手順
<a name="nodejs-getstarted-next"></a>

環境でアプリケーションを実行すると、アプリケーションの新しいバージョンや、まったく異なるアプリケーションをいつでもデプロイできるようになります。新しいアプリケーションバージョンのデプロイは、プロビジョニングや EC2 インスタンスの再開が必要ないため、非常に素早く行えます。アプリケーションのデプロイの詳細については、「[アプリケーションの新しいバージョニングをデプロイする](GettingStarted.md#GettingStarted.DeployApp)」を参照してください。

サンプルアプリケーションを 1 つか 2 つデプロイし、Node.js アプリケーションをローカルで開発および実行をスタートする準備が整ったら、「[Elastic Beanstalk 用の Node.js 開発環境の設定](nodejs-devenv.md)」を参照し、必要なすべてのツールとともに Node.js 開発環境を設定します。

# Node.js Express アプリケーションの Elastic Beanstalk へのデプロイ
<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
+ Express コマンドラインジェネレーター
+ Elastic Beanstalk コマンドラインインターフェイス（EB CLI）

最初の 3 つのリストされたコンポーネントのインストールとローカル開発環境の設定の詳細については、「[Elastic Beanstalk 用の Node.js 開発環境の設定](nodejs-devenv.md)」を参照してください。このチュートリアルでは、参照されるトピックでも説明されている AWS SDK for Node.js をインストールする必要はありません。

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 インスタンス** – 選択したプラットフォームでウェブ・アプリケーションを実行するよう設定された Amazon Elastic Compute Cloud (Amazon EC2) 仮想マシン。

     各プラットフォームは、それぞれ特定の言語バージョン、フレームワーク、ウェブコンテナ、またはそれらの組み合わせをサポートするための、特定のソフトウェア、設定ファイル、スクリプトを実行します。ほとんどのプラットフォームでは、Apache または NGINX のいずれかをウェブアプリケーションの前にリバースプロキシとして配置します。そのプロキシがリクエストをアプリケーションに転送し、静的アセットを提供し、アクセスログとエラーログを生成します。
   + **インスタンスセキュリティグループ** – ポート 80 上のインバウンドトラフィックを許可するよう設定された Amazon EC2 セキュリティグループ。このリソースでは、ロードバランサーからの HTTP トラフィックが、ウェブ・アプリケーションを実行している EC2 インスタンスに達することができます。デフォルトでは、トラフィックは他のポート上で許可されません。
   + **ロードバランサー** – アプリケーションを実行するインスタンスにリクエストを分散するよう設定された Elastic Load Balancing ロードバランサー。ロードバランサーにより、インスタンスを直接インターネットに公開する必要もなくなります。
   + **ロードバランサーセキュリティグループ** – ポート 80 上のインバウンドトラフィックを許可するよう設定された Amazon EC2 セキュリティグループ。このリソースでは、インターネットからの HTTP トラフィックが、ロードバランサーに達することができます。デフォルトでは、トラフィックは他のポート上で許可されません。
   + **Auto Scaling グループ** – インスタンスが終了されたか利用不可になった場合にそのインスタンスを置き換えるよう設定された Auto Scaling グループ。
   + **Amazon S3 バケット** – Elastic Beanstalk の使用時に作成されるソースコード、ログ、その他のアーティファクトの保存場所。
   + **Amazon CloudWatch アラーム** – 環境内のインスタンスの負荷をモニタリングする 2 つの CloudWatch アラーム。負荷が高すぎる、または低すぎる場合にトリガーされます。アラームがトリガーされると、Auto Scaling グループはレスポンスとしてスケールアップまたはダウンを行います。
   + **CloudFormation スタック** – Elastic Beanstalk は CloudFormation を使用して環境内のリソースを起動し、設定変更を伝達します。リソースは、[CloudFormation コンソール](https://console.aws.amazon.com/cloudformation)に表示できるテンプレートで定義されます。
   + **ドメイン名** – ウェブ・アプリケーションまでのルートとなるドメイン名であり、**subdomain*.*region*.elasticbeanstalk.com* の形式です。
**ドメインセキュリティ**  
Elastic Beanstalk アプリケーションのセキュリティを強化するため、*elasticbeanstalk.com* ドメインは[パブリックサフィックスリスト (PSL)](https://publicsuffix.org/) に登録されています。  
Elastic Beanstalk アプリケーションのデフォルトドメイン名に機密性のある Cookie を設定する必要がある場合は、セキュリティ強化のため `__Host-` プレフィックスの付いた Cookie の使用をお勧めします。このプラクティスは、クロスサイトリクエストフォージェリ (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` を実行するか、ローカルコンピュータでブラウザを開いて URL アドレス `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. 次の内容を含む 2 つ目の設定ファイルを [`.ebextensions`](ebextensions.md) フォルダに追加します。

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

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

   この設定では、プロキシサーバーに `public` フォルダのファイルを、アプリケーションの `/public` のパスで提供するように設定します。プロキシサーバーから静的にファイルを提供すると、アプリケーションへのロードを減らすことができます。詳細については、この章の前半の「[静的ファイル](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` ファイル内の静的ファイルマッピングは、スタイルシートを引き続き正常にロードするはずです。静的ファイルマッピングが Express アプリケーションではなくプロキシ静的ファイル設定を通じてロードされていることを確認するには、`option_settings:` の後の値を削除します。静的ファイル設定とノードアプリケーションの両方からその値が削除されると、スタイルシートはロードできなくなります。

   テストが完了したら、`nodejs-example-express-rds/app.js` と `staticfiles.config` の両方の内容を忘れずにリセットしてください。

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` を更新して新しく 3 つの行を含めます。

   まず、次の行を追加して、このルートに `require` を追加します。

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

   ファイルは次のスニペットのようになります。

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

   その後、次の 2 つの行を `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 ログ**] のウェブ・ページが表示されます。

これで、Express フレームワークを使用するウェブアプリケーションが作成されました。次のセクションでは、Amazon Relational Database Service (RDS) を使用してハイキングログを保存するようにアプリケーションを変更します。

## Amazon RDS を使用するようにアプリケーションを更新する
<a name="create_deploy_nodejs_express.add_rds"></a>

この次のステップでは、Amazon RDS for MySQL を使用するようにアプリケーションを更新します。

**RDS for MySQL を使用するようにアプリケーションを更新するには**

1. Elastic Beanstalk 環境に結合された RDS for MySQL データベースを作成するには、この章で後述する「[データベースの追加](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.
...
```

# クラスタリング付き Node.js Express アプリケーションの Elastic Beanstalk へのデプロイ
<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 (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
+ Express コマンドラインジェネレーター
+ Elastic Beanstalk コマンドラインインターフェイス（EB CLI）

最初の 3 つのリストされたコンポーネントのインストールとローカル開発環境の設定の詳細については、「[Elastic Beanstalk 用の Node.js 開発環境の設定](nodejs-devenv.md)」を参照してください。このチュートリアルでは、参照されるトピックでも説明されている AWS SDK for Node.js をインストールする必要はありません。

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 インスタンス** – 選択したプラットフォームでウェブ・アプリケーションを実行するよう設定された Amazon Elastic Compute Cloud (Amazon EC2) 仮想マシン。

     各プラットフォームは、それぞれ特定の言語バージョン、フレームワーク、ウェブコンテナ、またはそれらの組み合わせをサポートするための、特定のソフトウェア、設定ファイル、スクリプトを実行します。ほとんどのプラットフォームでは、Apache または NGINX のいずれかをウェブアプリケーションの前にリバースプロキシとして配置します。そのプロキシがリクエストをアプリケーションに転送し、静的アセットを提供し、アクセスログとエラーログを生成します。
   + **インスタンスセキュリティグループ** – ポート 80 上のインバウンドトラフィックを許可するよう設定された Amazon EC2 セキュリティグループ。このリソースでは、ロードバランサーからの HTTP トラフィックが、ウェブ・アプリケーションを実行している EC2 インスタンスに達することができます。デフォルトでは、トラフィックは他のポート上で許可されません。
   + **ロードバランサー** – アプリケーションを実行するインスタンスにリクエストを分散するよう設定された Elastic Load Balancing ロードバランサー。ロードバランサーにより、インスタンスを直接インターネットに公開する必要もなくなります。
   + **ロードバランサーセキュリティグループ** – ポート 80 上のインバウンドトラフィックを許可するよう設定された Amazon EC2 セキュリティグループ。このリソースでは、インターネットからの HTTP トラフィックが、ロードバランサーに達することができます。デフォルトでは、トラフィックは他のポート上で許可されません。
   + **Auto Scaling グループ** – インスタンスが終了されたか利用不可になった場合にそのインスタンスを置き換えるよう設定された Auto Scaling グループ。
   + **Amazon S3 バケット** – Elastic Beanstalk の使用時に作成されるソースコード、ログ、その他のアーティファクトの保存場所。
   + **Amazon CloudWatch アラーム** – 環境内のインスタンスの負荷をモニタリングする 2 つの CloudWatch アラーム。負荷が高すぎる、または低すぎる場合にトリガーされます。アラームがトリガーされると、Auto Scaling グループはレスポンスとしてスケールアップまたはダウンを行います。
   + **CloudFormation スタック** – Elastic Beanstalk は CloudFormation を使用して環境内のリソースを起動し、設定変更を伝達します。リソースは、[CloudFormation コンソール](https://console.aws.amazon.com/cloudformation)に表示できるテンプレートで定義されます。
   + **ドメイン名** – ウェブ・アプリケーションまでのルートとなるドメイン名であり、**subdomain*.*region*.elasticbeanstalk.com* の形式です。
**ドメインセキュリティ**  
Elastic Beanstalk アプリケーションのセキュリティを強化するため、*elasticbeanstalk.com* ドメインは[パブリックサフィックスリスト (PSL)](https://publicsuffix.org/) に登録されています。  
Elastic Beanstalk アプリケーションのデフォルトドメイン名に機密性のある Cookie を設定する必要がある場合は、セキュリティ強化のため `__Host-` プレフィックスの付いた Cookie の使用をお勧めします。このプラクティスは、クロスサイトリクエストフォージェリ (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>

Elastic Beanstalk 環境にサンプルアプリケーションを更新して、Express フレームワークを使用するようにします。

最終的な出典コードは、[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` を実行するか、ローカルコンピュータでブラウザを開いて URL アドレス `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`）、ノードが存在する場合は `memcached` をセッションを保存するとして使用するよう Express を設定します。ファイルは次のようになります。

   ```
   /**
    * 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. [Amazon CloudWatch コンソール](https://console.aws.amazon.com/cloudwatch/home) をチェックして、 ElastiCache メトリクスを表示します。ElastiCache メトリクスを表示するには、左ペインで [**Metrics (メトリクス)**] を選択し、[**CurrItems**] を検索します。[**ElastiCache> Cache Node Metrics**] を選択したら、キャッシュノードを選択してキャッシュ内の項目数を表示します。  
![\[CloudWatch dashboard showing CurrItems metric for an ElastiCache node over time.\]](http://docs.aws.amazon.com/ja_jp/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 にメッセージが表示されます。

# DynamoDB を使用して Node.js アプリケーションを Elastic Beanstalk にデプロイする
<a name="nodejs-dynamodb-tutorial"></a>

このチュートリアルとそのサンプルアプリケーション [nodejs-example-dynamo.zip](samples/nodejs-example-dynamo.zip) では、Node.js で AWS SDK for JavaScript を使用して Amazon DynamoDB サービスとやり取りする Node.js アプリケーションをデプロイするプロセスについて説明します。 AWS Elastic Beanstalk 環境から分離されたデータベース、または外部にある DynamoDB テーブルを作成します。また、分離されたデータベースを使用するようにアプリケーションを設定します。本番環境では、環境のライフサイクルから独立した状態であるように、Elastic Beanstalk 環境から分離されたデータベースを使用するのがベストプラクティスです。このプラクティスにより、[ブルー/グリーンデプロイ](using-features.CNAMESwap.md)の実行も可能となります。

サンプルアプリケーションは次を説明します。
+ ユーザーが提供したテキストデータを保存する DynamoDB テーブル。
+ テーブルを作成するための[設定ファイル](ebextensions.md)。
+ Amazon Simple Notification Service トピック。
+  デプロイ中にパッケージをインストールするための [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
+ Express コマンドラインジェネレーター
+ Elastic Beanstalk コマンドラインインターフェイス（EB CLI）

最初の 3 つのリストされたコンポーネントのインストールとローカル開発環境の設定の詳細については、「[Elastic Beanstalk 用の Node.js 開発環境の設定](nodejs-devenv.md)」を参照してください。このチュートリアルでは、参照されるトピックでも説明されている AWS SDK for Node.js をインストールする必要はありません。

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 インスタンス** – 選択したプラットフォームでウェブ・アプリケーションを実行するよう設定された Amazon Elastic Compute Cloud (Amazon EC2) 仮想マシン。

     各プラットフォームは、それぞれ特定の言語バージョン、フレームワーク、ウェブコンテナ、またはそれらの組み合わせをサポートするための、特定のソフトウェア、設定ファイル、スクリプトを実行します。ほとんどのプラットフォームでは、Apache または NGINX のいずれかをウェブアプリケーションの前にリバースプロキシとして配置します。そのプロキシがリクエストをアプリケーションに転送し、静的アセットを提供し、アクセスログとエラーログを生成します。
   + **インスタンスセキュリティグループ** – ポート 80 上のインバウンドトラフィックを許可するよう設定された Amazon EC2 セキュリティグループ。このリソースでは、ロードバランサーからの HTTP トラフィックが、ウェブ・アプリケーションを実行している EC2 インスタンスに達することができます。デフォルトでは、トラフィックは他のポート上で許可されません。
   + **ロードバランサー** – アプリケーションを実行するインスタンスにリクエストを分散するよう設定された Elastic Load Balancing ロードバランサー。ロードバランサーにより、インスタンスを直接インターネットに公開する必要もなくなります。
   + **ロードバランサーセキュリティグループ** – ポート 80 上のインバウンドトラフィックを許可するよう設定された Amazon EC2 セキュリティグループ。このリソースでは、インターネットからの HTTP トラフィックが、ロードバランサーに達することができます。デフォルトでは、トラフィックは他のポート上で許可されません。
   + **Auto Scaling グループ** – インスタンスが終了されたか利用不可になった場合にそのインスタンスを置き換えるよう設定された Auto Scaling グループ。
   + **Amazon S3 バケット** – Elastic Beanstalk の使用時に作成されるソースコード、ログ、その他のアーティファクトの保存場所。
   + **Amazon CloudWatch アラーム** – 環境内のインスタンスの負荷をモニタリングする 2 つの CloudWatch アラーム。負荷が高すぎる、または低すぎる場合にトリガーされます。アラームがトリガーされると、Auto Scaling グループはレスポンスとしてスケールアップまたはダウンを行います。
   + **CloudFormation スタック** – Elastic Beanstalk は CloudFormation を使用して環境内のリソースを起動し、設定変更を伝達します。リソースは、[CloudFormation コンソール](https://console.aws.amazon.com/cloudformation)に表示できるテンプレートで定義されます。
   + **ドメイン名** – ウェブ・アプリケーションまでのルートとなるドメイン名であり、**subdomain*.*region*.elasticbeanstalk.com* の形式です。
**ドメインセキュリティ**  
Elastic Beanstalk アプリケーションのセキュリティを強化するため、*elasticbeanstalk.com* ドメインは[パブリックサフィックスリスト (PSL)](https://publicsuffix.org/) に登録されています。  
Elastic Beanstalk アプリケーションのデフォルトドメイン名に機密性のある Cookie を設定する必要がある場合は、セキュリティ強化のため `__Host-` プレフィックスの付いた Cookie の使用をお勧めします。このプラクティスは、クロスサイトリクエストフォージェリ (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>

アプリケーションは、ロードバランサーの背後で 1 つ以上の EC2 インスタンスを実行し、インターネットからの HTTP リクエストを処理します。 AWS サービスの使用を要求するリクエストを受け取ると、アプリケーションは実行するインスタンスのアクセス許可を使用してそれらのサービスにアクセスします。

サンプルアプリケーションは、インスタンスのアクセス許可を使用して、データを DynamoDB テーブルに書き込み、 SDK for JavaScript in Node.js を使用して Amazon SNS トピックに通知を送信します。以下の管理ポリシーをデフォルトの[インスタンスプロファイル](concepts-roles-instance.md)に追加し、DynamoDB と Amazon SNS へのアクセス許可を対象環境内の EC2 インスタンスに付与します。
+ **AmazonDynamoDBFullAccess**
+ **AmazonSNSFullAccess**

**デフォルトのインスタンスプロファイルにポリシーを追加するには**

1. IAM コンソールの [[ロール]](https://console.aws.amazon.com/iam/home#roles) ページを開きます。

1. **aws-elasticbeanstalk-ec2-ロール** を選択します。

1. [**Permissions (アクセス許可)**] タブで、[**Attach policy (ポリシーの添付)**] を選択します。

1. アプリケーションで使用する追加サービスの管理ポリシーを選択します。このチュートリアルでは、`AmazonSNSFullAccess` および `AmazonDynamoDBFullAccess` を選択します。

1. **[Attach policy]** (ポリシーのアタッチ) を選択します。

インスタンスプロファイルの詳細については、「[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 テーブルを使用してデータを保存します。エントリを追加するには、[**サインアップ today**] を選択し、名前とメールアドレスを入力してから、[**Sign Up\$1**] を選択します。ウェブ・アプリケーションがテーブルにフォームの内容を書き込み、Amazon SNS E メール通知をトリガーします。

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


現時点では、Amazon SNS トピックはプレースホルダー通知用 E メールで設定してあります。設定をまもなく更新しますが、今のところ、 AWS マネジメントコンソールの DynamoDB テーブルおよび Amazon SNS トピックを確認できます。

**テーブルを表示するには**

1. DynamoDB コンソールで [[テーブル] ページ](https://console.aws.amazon.com/dynamodb/home?#tables:)を開きます。

1. アプリケーションで作成したテーブルを見つけます。名前は [**awseb**] からスタートし、[**StartupSignupsTable**] を含みます。

1. テーブルを選択し、[**Items**] を選択してから、[**Start Search**] を選択してテーブルのすべての項目を表示します。

テーブルには、サインアップサイトで送信されたすべての E メールアドレスのエントリが含まれます。テーブルに対する書き込みに加えて、アプリケーションは 2 つのサブスクリプションがある Amazon SNS トピックにメッセージを送信します。1 つはお客様へのメール通知で、もう 1 つは Amazon Simple Queue Service キューです。ワーカー アプリケーションが読み取り、リクエストを処理し、関心のある顧客へ E メールを送信します。

**トピックを表示するには**

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 つのルートの定義があります。ルートパス (`/`) は、名前とメールアドレスを登録するためにユーザーが入力するフォームがある Embedded JavaScript (EJS) のテンプレートでレンダリングされたウェブページを返します。フォームを送信すると、フォームデータとともに POST リクエストが `/signup` ルートへ送信され、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 マネジメントコンソールで [[テーブル] ページ](https://console.aws.amazon.com/dynamodb/home?#tables:)を開きます。

1. **[テーブルの作成]** を選択します。

1. **テーブル名** と **プライマリ・キー** を入力します。

1. プライマリ・キーのタイプを選択します。

1. **[作成]** を選択します。

## アプリケーションの設定ファイルを更新する
<a name="nodejs-dynamodb-tutorial-update"></a>

**nodejs-tutorial** テーブルを使用するため、新しく作成する代わりに、アプリケーションの出典の[設定ファイル](ebextensions.md)を更新します。

**本稼働環境用にサンプルアプリケーションを更新するには**

1. 現在の作業ディレクトリをアプリケーションディレクトリ `nodejs-example-dynamo` に変更します。

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

1. `.ebextensions/options.config` を開いて次の設定の値を変更します。
   + **NewSignupEmail** – お客様の E メールアドレス。
   + **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` ファイルに入力したアドレスに設定されます。
   + `.ebextensions/create-dynamodb-table.config` によって作成されたテーブルの代わりに、**nodejs-tutorial** テーブルが使用されます。

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. テーブルを選択し、[**Items**] を選択してから、[**Start Search**] を選択してテーブルのすべての項目を表示します。

また、Elastic Beanstalk が以前に作成したテーブルを削除していることを確認できます。

## 高可用性のための環境を設定する
<a name="nodejs-dynamodb-tutorial-configure"></a>

最後に、より高いインスタンス数で、環境の Auto Scaling グループを設定します。環境のウェブサーバーが、単一障害点となることを防ぎ、サイトをサービス停止状態にせずに変更をデプロイすることが許可されるように、常に少なくとも 2 つのインスタンスを実行します。

**高可用性のために環境の Auto Scaling グループを設定するには**

1. [Elastic Beanstalk コンソール](https://console.aws.amazon.com/elasticbeanstalk)を開き、**リージョン**リストで を選択します AWS リージョン。

1. ナビゲーションペインで、[**環境**] を選択し、リストから環境の名前を選択します。

1. ナビゲーションペインで、[**設定**] を選択します。

1. [**容量**] 設定カテゴリで、[**編集**] を選択します。

1. [**Auto Scaling group (Auto Scaling グループ)**] セクションで、[**Min instances (最小インスタンス数)**] を **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. **アクション** を選択してから、**テーブルの削除** を選択します。

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) を有効にすることが必要になります。

# Amazon RDS DB インスタンスを Node.js Elastic Beanstalk 環境に追加する
<a name="create-deploy-nodejs.rds"></a>

このトピックでは、Elastic Beanstalk コンソールを使用して Amazon RDS を作成する手順について説明します。Amazon Relational Database Service (Amazon RDS) DB インスタンスを使用して、アプリケーションによって収集および変更されたデータを保存することができます。データベースを環境に結合して Elastic Beanstalk で管理することも、分離したものとして作成して別のサービスで外部的に管理することもできます。これらの手順では、データベースは環境に結合され、Elastic Beanstalk によって管理されます。Amazon RDS と Elastic Beanstalk の統合の詳細については、「[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 コンソールの [**Connectivity & security (Connectivityとセキュリティ)**] タブ: [**Endpoint (エンドポイント)**]。  | 
|  `RDS_PORT`  |  DB インスタンスが接続を許可するポート。デフォルト値は DB エンジンによって異なります。  |  Amazon RDS コンソールの [**Connectivity & security (接続とセキュリティ)**] タブ: [**Port (ポート)**]。  | 
|  `RDS_DB_NAME`  |  データベース名 **ebdb**。  |  Amazon RDS コンソールの [**Configuration (設定)**] タブ: [**DB Name (DB 名)**]。  | 
|  `RDS_USERNAME`  |  お客様のデータベース用に設定したユーザー名。  |  Amazon RDS コンソールの [**Configuration (設定)**] タブ: [**Master username (マスターユーザー名)**]。  | 
|  `RDS_PASSWORD`  |  お客様のデータベース用に設定したパスワード。  |  Amazon RDS コンソールではリファレンスできません。  | 

Elastic Beanstalk 環境と結合したデータベースインスタンスの設定の詳細については、「[Elastic Beanstalk 環境にデータベースを追加する](using-features.managing.db.md)」を参照してください。

## ドライバのダウンロード
<a name="nodejs-rds-drivers"></a>

[ の下にプロジェクトの `package.json`](nodejs-platform-dependencies.md#nodejs-platform-packagejson) ファイル`dependencies` にデータベース・ドライバを追加します。

**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** – [ノード-postgres](https://www.npmjs.com/package/pg)
+ **SQL Server** – [ノード-mssql](https://www.npmjs.com/package/mssql)
+ **Oracle** – [ノード-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();
```
ノード-mysql を使用して接続文字列を作成する方法の詳細については、[npmjs.org/package/mysql](https://npmjs.org/package/mysql) を参照してください。

# Node.js ツールとリソース
<a name="create_deploy_nodejs.resources"></a>

Node.js アプリケーションを開発するときに役に立つ参照先を次に示します。


****  

|  [リソース]  |  説明  | 
| --- | --- | 
|  [GitHub](https://github.com/aws/aws-sdk-js)  | GitHub を使用して AWS SDK for Node.js をインストールします。 | 
|  [AWS SDK for Node.js (開発者プレビュー)](https://aws.amazon.com/sdkfornodejs/)  | サンプルコード、ドキュメント、ツール、追加リソースを 1 か所で入手できる場所です。 | 