メニュー
AWS Elastic Beanstalk
開発者ガイド

DynamoDB を使用して、Node.js アプリケーションを Elastic Beanstalk にデプロイする

このチュートリアルでは、サンプルアプリケーションが、Amazon DynamoDB を操作するために AWS SDK for JavaScript in Node.js を使用する Node.js アプリケーションをデプロイする手順について説明します。AWS Elastic Beanstalk 環境の外部の DynamoDB テーブルを作成し、環境内で作成する代わりに、この外部テーブルを使用するようにアプリケーションを設定します。本稼働環境では、偶発的データの紛失を防ぎ、青/緑のデプロイを実行するために Elastic Beanstalk 環境から独立したテーブルを保持します。

チュートリアルのサンプルアプリケーションは、DynamoDB データを使用して、ユーザー提供のテキストデータを保存します。サンプルアプリケーションは、設定ファイルを使用して、テーブルと Amazon Simple Notification Service トピックを作成します。package.json ファイルを使用して、デプロイの間にパッケージをインストールする方法も示します。

前提条件

  • 開始する前に、GitHub: eb-node-express-sample-v1.1.zip からサンプルアプリケーションソースバンドルをダウンロードします。

  • この手順のコマンドを実行するには、コマンドラインターミナルまたはシェルが必要になります。例のコマンドの前に、該当する場合、プロンプト記号 ($) と現在のディレクトリの名前があります。

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

    注記

    このチュートリアルのすべてのコマンドは Linux 仮想マシンおよび OS X マシン、または Amazon Linux を実行中の Amazon EC2 インスタンスで実行できます。開発環境が必要な場合は、単一インスタンスの Elastic Beanstalk 環境を起動し、SSH で接続できます。

  • このチュートリアルでは、コマンドラインツールの ZIP ユーティリティを使用して、Elastic Beanstalk にデプロイできるソースバンドルを作成します。Windows で zip コマンドを使用するには、zipls などの便利なコマンドラインユーティリティの軽量のコレクションである UnxUtils をインストールできます。(または、Windows エクスプローラーや他の ZIP ユーティリティを使用して、ソースバンドルアーカイブを作成できます。)

    UnxUtils をインストールするには

    1. ダウンロード UnxUtils.

    2. ローカルディレクトリにアーカイブを抽出します。たとえば、C:\Program Files (x86) と指定します。

    3. Windows の PATH ユーザー変数にバイナリへのパスを追加します。たとえば、C:\Program Files (x86)\UnxUtils\usr\local\wbin と指定します。

      1. Windows キーを押し、「環境変数」と入力します。

      2. [Edit environment variables for your account] を選択します。

      3. [パス] を選択して、[編集] を選択します。

      4. セミコロンで区切って、[Variable value] フィールドにパスを追加します。以下に例を示します。C:\existing\path;C:\new\path

      5. [OK] を 2 回選択して、新しい設定を適用します。

      6. 実行中のコマンドプロンプトを閉じ、もう一度開きます。

    4. 新しいコマンドプロンプトウィンドウを開き、zip コマンドを実行して、動作することを確認します。

      > zip Copyright (C) 1990-1999 Info-ZIP Type 'zip "-L"' for software license. ...

Elastic Beanstalk 環境を起動する

Elastic Beanstalk コンソールを使用して、Elastic Beanstalk 環境を起動します。Node.js プラットフォーム設定を選択し、デフォルト設定およびサンプルコードを受け入れます。環境のアクセス許可を設定したら、GitHub からダウンロードしたサンプルアプリケーションをデプロイします。

環境を起動するには(コンソール)

  1. 次の事前に設定されたリンクを使用して、Elastic Beanstalk コンソールを開きます: console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced

  2. [Platform] に、アプリケーションで使用される言語に一致するプラットフォームを選択します。

  3. [Application code] に、[Sample application] を選択します。

  4. [Review and launch] を選択します。

  5. 使用できるオプションを確認します。その内容でよければ、[Create app] を選択します。

Elastic Beanstalk は次のリソースを使用して環境を作成するのに約 5 分かかります。

  • 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 グループはレスポンスとしてスケールアップまたはダウンを行います。

  • AWS CloudFormation スタック – 環境内でリソースを起動して、設定の変更を伝達するために、Elastic Beanstalk は AWS CloudFormation を使用します。リソースは、AWS CloudFormation コンソールに表示できるテンプレートで定義されます。

  • ドメイン名 – ウェブアプリケーションまでのルートとなるドメイン名であり、subdomain.region.elasticbeanstalk.com という形式になります。

Elastic Beanstalk は、これらのリソースをすべて管理します。環境を終了すると、Elastic Beanstalk は含まれているすべてのリソースを終了します。

注記

Elastic Beanstalk が作成する S3 バケットは、環境間で共有され、環境の終了時に削除されません。詳細については、「Amazon Simple Storage Service で Elastic Beanstalk を使用する」を参照してください。

環境内のインスタンスにアクセス権限を追加する

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

サンプルアプリケーションは、インスタンスのアクセス権限を使用して、データを DynamoDB テーブルに書き込み、Node.js 内の SDK for JavaScript を使用して Amazon SNS トピックに通知を送信します。以下の管理ポリシーをデフォルトのインスタンスプロファイルに追加し、DynamoDB と Amazon SNS にアクセスする権限を対象環境内の EC2 インスタンスに付与します。

  • AmazonDynamoDBFullAccess

  • AmazonSNSFullAccess

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

  1. IAM コンソールの [Roles] ページを開きます。

  2. [aws-elasticbeanstalk-ec2-role] を選択します。

  3. [Permissions] タブを開き、[Managed Policies] で [Attach Policy] を選択します。

  4. アプリケーションで使用する追加サービスの管理ポリシーを選択します。例えば、AmazonSNSFullAccessAmazonDynamoDBFullAccess などです。

  5. [Attach Policies] を選択します。

インスタンスプロファイルの詳細については、「Elastic Beanstalk インスタンスプロファイルを管理する」を参照してください。

サンプルアプリケーションをデプロイする

これで環境がサンプルアプリケーションをデプロイし、実行する準備が整いました。

注記

まだ行っていない場合は、GitHub からソースバンドルをダウンロードします。eb-node-express-sample-v1.1.zip

ソースバンドルをデプロイするには

  1. Elastic Beanstalk コンソールを開きます。

  2. お客様の環境の管理ページに移動します。

  3. [Upload and Deploy] を選択します。

  4. [Choose File] を選択し、ダイアログボックスを使用してソースバンドルを選択します。

  5. [Deploy] を選択します。

  6. デプロイが完了したら、新しいタブのウェブサイトを開く、サイトの URL を選択します。

サイトはユーザーの連絡先情報を収集し、DynamoDB テーブルを使用してデータを保存します。エントリを追加するには、[Sign up today] を選択し、名前とメールアドレスを入力してから、[サインアップ] を選択します。ウェブアプリケーションがテーブルにフォームの内容を書き込み、Amazon SNS E メール通知をトリガーします。

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

テーブルを表示するには

  1. DynamoDB コンソールで [Tables page] を開きます。

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

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

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

トピックを表示するには

  1. Amazon SNS コンソールで [Topics page] を開きます。

  2. アプリケーションで作成したトピックを見つけます。名前は [awseb] から始まり、[NewSignupTopic] を含みます。

  3. サブスクリプションを表示するトピックを選択します。

アプリケーション (app.js) には 2 つのルートの定義があります。ルートパス (/) は、名前とメールアドレスを登録するためにユーザーが入力するフォームがある Embedded JavaScript (EJS) のテンプレートでレンダリングされたウェブページを返します。フォームを送信すると、フォームデータとともに POST リクエストが /signup ルートへ送信され、DynamoDB テーブルにエントリが記入され、Amazon SNS トピックにサインアップの所有者を通知するメッセージをパブリッシュします。

サンプルアプリケーションには、アプリケーションが使用する DynamoDB テーブル、Amazon SNS トピック、Amazon SQS キューを作成する設定ファイルが含まれます。これにより、新しい環境を作成して機能をすぐにテストすることができますが、環境に DynamoDB テーブルを関連付ける欠点があります。実稼働環境では、環境を終了するか設定を更新するときに DynamoDB テーブルが失われないよう、環境の外部で作成する必要があります。

DynamoDB テーブルの作成

Elastic Beanstalk で実行中のアプリケーションで 外部 DynamoDB テーブルを使用するには、まず DynamoDB でテーブルを作成します。Elastic Beanstalk の外部にテーブルを作成すると、Elastic Beanstalk と Elastic Beanstalk 環境から完全に独立しているので、Elastic Beanstalk により終了させられません。

次の設定でテーブルを作成します。

  • テーブル名nodejs-tutorial

  • プライマリキーE メール

  • プライマリキーのタイプ – 文字列

DynamoDB テーブルを作成するには

  1. DynamoDB マネージメントコンソールで [Tables page] を開きます。

  2. [Create table] を選択します。

  3. [Table name] および [Primary key] に入力します。

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

  5. [Create] を選択します。

アプリケーションの設定ファイルを更新する

nodejs-tutorial テーブルを使用するため、新しく作成する代わりに、アプリケーションソースの設定ファイルを更新します。

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

  1. ソースバンドルからプロジェクトファイルを抽出する:

    ~$ mkdir nodejs-tutorial ~$ cd nodejs-tutorial ~/nodejs-tutorial$ unzip ~/Downloads/eb-node-express-sample-v1.0.zip
  2. .ebextensions/options.config を開いて次の設定の値を変更します。

    • NewSignupEmail – お客様の E メールアドレス。

    • STARTUP_SIGNUP_TABLEnodejs-tutorial

    例 .ebextensions/options.config

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

    この設定により、アプリケーションは .ebextensions/create-dynamodb-table.config で作成されたものの代わりに nodejs-tutorial テーブルを使用でき、また、通知用に Amazon SNS トピックが使用する E メールアドレスを設定できます。

  3. 削除 .ebextensions/create-dynamodb-table.config.

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

    次にアプリケーションをデプロイするとき、この設定ファイルで作成したテーブルは削除されます。

  4. 変更されたコードからソースバンドルを作成します。

    ~/nodejs-tutorial$ zip nodejs-tutorial.zip -r * .[^.]* adding: LICENSE (deflated 65%) adding: README.md (deflated 56%) adding: app.js (deflated 63%) adding: iam_policy.json (deflated 47%) adding: misc/ (stored 0%) adding: misc/theme-flow.png (deflated 1%) adding: npm-shrinkwrap.json (deflated 87%) adding: package.json (deflated 40%) adding: static/ (stored 0%) adding: static/bootstrap/ (stored 0%) adding: static/bootstrap/css/ (stored 0%) adding: static/bootstrap/css/jumbotron-narrow.css (deflated 59%) adding: static/bootstrap/css/theme/ (stored 0%) adding: static/bootstrap/css/theme/united/ (stored 0%) adding: static/bootstrap/css/theme/united/bootstrap.css (deflated 86%) adding: static/bootstrap/css/theme/amelia/ (stored 0%) adding: static/bootstrap/css/theme/amelia/bootstrap.css (deflated 86%) adding: static/bootstrap/css/theme/slate/ (stored 0%) adding: static/bootstrap/css/theme/slate/bootstrap.css (deflated 87%) adding: static/bootstrap/css/theme/default/ (stored 0%) adding: static/bootstrap/css/theme/default/bootstrap.css (deflated 86%) adding: static/bootstrap/css/theme/flatly/ (stored 0%) adding: static/bootstrap/css/theme/flatly/bootstrap.css (deflated 86%) adding: static/bootstrap/LICENSE (deflated 65%) adding: static/bootstrap/js/ (stored 0%) adding: static/bootstrap/js/bootstrap.min.js (deflated 74%) adding: static/bootstrap/fonts/ (stored 0%) adding: static/bootstrap/fonts/glyphicons-halflings-regular.eot (deflated 1%) adding: static/bootstrap/fonts/glyphicons-halflings-regular.svg (deflated 73%) adding: static/bootstrap/fonts/glyphicons-halflings-regular.woff (deflated 1%) adding: static/bootstrap/fonts/glyphicons-halflings-regular.ttf (deflated 44%) adding: static/jquery/ (stored 0%) adding: static/jquery/jquery-1.11.3.min.js (deflated 65%) adding: static/jquery/MIT-LICENSE.txt (deflated 41%) adding: views/ (stored 0%) adding: views/index.ejs (deflated 67%) adding: .ebextensions/ (stored 0%) adding: .ebextensions/options.config (deflated 47%) adding: .ebextensions/create-sns-topic.config (deflated 56%)

環境に nodejs-tutorial.zip ソースバンドルをデプロイします。

ソースバンドルをデプロイするには

  1. Elastic Beanstalk コンソールを開きます。

  2. お客様の環境の管理ページに移動します。

  3. [Upload and Deploy] を選択します。

  4. [Choose File] を選択し、ダイアログボックスを使用してソースバンドルを選択します。

  5. [Deploy] を選択します。

  6. デプロイが完了したら、新しいタブのウェブサイトを開く、サイトの URL を選択します。

デプロイの際、Elastic Beanstalk は Amazon SNS トピックの設定を更新し、アプリケーションの最初のバージョンをデプロイしたときに作成した DynamoDB テーブルを削除します。

これで、環境を終了するとき、nodejs-tutorial テーブルは削除されません。これにより、青/緑のデプロイの実行、設定ファイルの変更、またはデータ損失のリスクなしにウェブサイトの停止をすることができます。

ブラウザでサイトを開き、想定したとおりにフォームが機能することを検証します。いくつかのエントリを作成し、DynamoDB コンソールを確認してテーブルを検証します。

テーブルを表示するには

  1. DynamoDB コンソールで [Tables page] を開きます。

  2. nodejs-tutorial テーブルを探します。

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

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

高可用性のための環境を設定する

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

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

  1. Elastic Beanstalk コンソールを開きます。

  2. お客様の環境の管理ページに移動します。

  3. [Configuration] を選択します。

  4. [キャパシティ] 設定カードで、[変更] を選択します。

  5. [Auto Scaling グループ] セクションで、[最小インスタンス数] を [2] に設定します。

  6. [保存] を選択し、[適用] を選択します。

クリーンアップ

Elastic Beanstalk の操作を終了したら、 環境を終了できます。Elastic Beanstalk は、Amazon EC2 インスタンスデータベースインスタンスロードバランサー、セキュリティグループ、アラームなど、お客様の環境に関連付けられているすべての AWS リソースを終了します。

Elastic Beanstalk 環境を終了するには

  1. Elastic Beanstalk コンソールを開きます。

  2. お客様の環境の管理ページに移動します。

  3. [Actions] を選択してから、[Terminate Environment] を選択します。

  4. [Confirm Termination] ダイアログボックスに環境名を入力し、[Terminate] を選択します。

Elastic Beanstalk を使用すると、いつでもアプリケーション用の新しい環境を簡単に作成できます。

また、作成した DynamoDB テーブルを削除することもできます。

DynamoDB テーブルを削除するには

  1. DynamoDB コンソールで [Tables page] を開きます。

  2. テーブルを選択します。

  3. [Actions] を選択してから、[Delete table] を選択します。

  4. [Delete] を選択します。

次のステップ

アプリケーションの開発が進むにつれ、.zip ファイルを手動で作成して Elastic Beanstalk コンソールにアップロードすることなく、環境を管理してアプリケーションをデプロイすることが必要になります。Elastic Beanstalk コマンドラインインターフェイス(EB CLI)には、コマンドラインからアプリケーションを作成、設定して、Elastic Beanstalk 環境にデプロイするための使いやすいコマンドが用意されています。

サンプルアプリケーションは、設定ファイルを使用して、ソフトウェア設定を編集し、環境の一部として AWS リソースを作成します。設定ファイルとその使用方法の詳細については、「設定ファイル (.ebextensions) による高度な環境のカスタマイズ」を参照してください。

このチュートリアル用のサンプルアプリケーションは、Node.js のために Express ウェブフレームワークを使用しています。Express の詳細については、expressjs.com にある公式ドキュメントを参照してください。

最後に、本稼働環境でアプリケーションを使用する予定の場合は、お客様の環境にカスタムドメイン名を設定し、セキュアな接続のために HTTPS を有効にすることが必要になります。