

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

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