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

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

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

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

サンプルアプリケーションは次を説明します。

  • ユーザーが提供したテキストデータを保存する DynamoDB テーブル。

  • テーブルを作成するための設定ファイル

  • Amazon Simple Notification Service トピック。

  • デプロイ中にパッケージをインストールするための package.json ファイルの使用。

前提条件

このチュートリアルでは、次の前提条件が必要です。

  • Node.js ランタイム

  • デフォルトの Node.js パッケージマネージャーソフトウェア、npm

  • Express コマンドラインジェネレーター

  • Elastic Beanstalk コマンドラインインターフェイス(EB CLI)

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

EB CLI をインストールおよび設定する手順の詳細については、「EB CLI のインストール」および「EB CLI の設定」を参照してください。

Elastic Beanstalk 環境の作成

アプリケーションディレクトリ

このチュートリアルでは、アプリケーションソースバンドル用に nodejs-example-dynamo と呼ばれるディレクトリを使用します。このチュートリアル用の nodejs-example-dynamo ディレクトリを作成します。

~$ mkdir nodejs-example-dynamo
注記

この章の各チュートリアルでは、アプリケーションソースバンドル用に独自のディレクトリを使用します。ディレクトリ名は、チュートリアルで使用されるサンプルアプリケーションの名前と一致します。

現在の作業ディレクトリを nodejs-example-dynamo に変更します。

~$ cd nodejs-example-dynamo

次に、Node.js プラットフォームとサンプルアプリケーションを実行する Elastic Beanstalk 環境を設定しましょう。Elastic Beanstalk コマンドラインインターフェイス (EB CLI) を使用します。

アプリケーションの EB CLI リポジトリを設定し、Node.js プラットフォームを実行する Elastic Beanstalk 環境を作成するには
  1. eb init コマンドを使用してリポジトリを作成します。

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

    このコマンドは、.elasticbeanstalk という名前のフォルダに、アプリケーションの環境作成用の設定ファイルを作成し、現在のフォルダに基づいた名前で Elastic Beanstalk アプリケーションを作成します。

  2. eb create コマンドを使用して、サンプルアプリケーションを実行する環境を作成します。

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

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

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

      注記

      Elastic Beanstalk アプリケーションのセキュリティを強化するため、elasticbeanstalk.com ドメインはパブリックサフィックスリスト (PSL) に登録されています。セキュリティ強化のため、Elastic Beanstalk アプリケーションのデフォルトドメイン名に機密な Cookie を設定する必要が生じた場合は、__Host- プレフィックスの付いた Cookie の使用をおすすめします。この方法は、ドメインをクロスサイトリクエストフォージェリ (CSRF) の攻撃から守るのに役立ちます。詳細については、Mozilla 開発者ネットワークの「Set-Cookie」ページを参照してください。

  3. 環境の作成が完了したら、eb open コマンドを使用して、デフォルトのブラウザでその環境の URL を開きます。

    ~/nodejs-example-dynamo$ eb open

これで、サンプルアプリケーションを使用して Node.js Elastic Beanstalk 環境が作成されました。独自のアプリケーションで更新できます。次に、Express フレームワークを使用するようサンプルアプリケーションを更新します。

環境内のインスタンスにアクセス許可を追加します

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

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

  • AmazonDynamoDBFullAccess

  • AmazonSNSFullAccess

デフォルトのインスタンスプロファイルにポリシーを追加するには
  1. IAM コンソールの [Roles (ロール)] ページを開きます。

  2. aws-elasticbeanstalk-ec2 ロールの を選択します。

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

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

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

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

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

これで、このチュートリアルのサンプルアプリケーションをデプロイして実行する準備が整いました: nodejs-example-dynamo.zip

チュートリアルのサンプルアプリケーションをデプロイして実行するには
  1. 現在の作業ディレクトリをアプリケーションディレクトリ nodejs-example-dynamo に変更します。

    ~$ cd nodejs-example-dynamo
  2. サンプルアプリケーションソースバンドル nodejs-example-dynamo.zip の内容をダウンロードしてアプリケーションディレクトリ に抽出しますnodejs-example-dynamo

  3. eb deploy コマンドを使用して、サンプルアプリケーションを Elastic Beanstalk 環境にデプロイします。

    ~/nodejs-example-dynamo$ eb deploy
    注記

    デフォルトでは、 eb deploy コマンドはプロジェクトフォルダの ZIP ファイルを作成します。プロジェクトフォルダの ZIP ファイルを作成する代わりにビルドプロセスからの中間生成物をデプロイするように EB CLI を設定できます。詳細については、「プロジェクトフォルダの代わりにアーティファクトをデプロイする」を参照してください。

  4. 環境の作成が完了したら、eb open コマンドを使用して、デフォルトのブラウザでその環境の URL を開きます。

    ~/nodejs-example-dynamo$ eb open

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

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

テーブルを表示するには
  1. DynamoDB コンソールで [テーブル] ページを開きます。

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

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

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

トピックを表示するには
  1. Amazon SNS コンソールで [トピック] ページを開きます。

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

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

アプリケーション (app.js) には 2 つのルートの定義があります。ルートパス (/) は、埋め込み JavaScript (EJS) テンプレートからレンダリングされたウェブページを、ユーザーが名前と E メールアドレスを登録するために入力するフォームとともに返します。フォームを送信すると、フォームデータとともに 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

  • プライマリ・キーemail

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

DynamoDB テーブルを作成するには
  1. DynamoDB マネジメントコンソールで [テーブル] ページを開きます。

  2. [Create table (テーブルの作成)] を選択します。

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

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

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

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

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

本稼働環境用にサンプルアプリケーションを更新するには
  1. 現在の作業ディレクトリをアプリケーションディレクトリ nodejs-example-dynamo に変更します。

    ~$ cd nodejs-example-dynamo
  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"

    これにより、アプリケーションに次の設定が適用されます。

    • Amazon SNS トピックが通知に使用するメールアドレスは、ユーザーのアドレス、または options.config ファイルに入力したアドレスに設定されます。

    • .ebextensions/create-dynamodb-table.config によって作成されたテーブルの代わりに、nodejs-tutorial テーブルが使用されます。

  3. .ebextensions/create-dynamodb-table.config を削除します。

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

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

  4. eb deploy コマンドを使用して、更新されたアプリケーションを Elastic Beanstalk 環境にデプロイします。

    ~/nodejs-example-dynamo$ eb deploy
  5. 環境の作成が完了したら、eb open コマンドを使用して、デフォルトのブラウザでその環境の URL を開きます。

    ~/nodejs-example-dynamo$ eb open

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

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

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

テーブルを表示するには
  1. DynamoDB コンソールで [テーブル] ページを開きます。

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

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

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

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

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

高可用性のために環境の Auto Scaling グループを設定するには
  1. Elastic Beanstalk コンソールを開き、リージョンリストで を選択します AWS リージョン。

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

    注記

    環境が多数ある場合は、検索バーを使用して環境リストをフィルタリングします。

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

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

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

  6. ページの最下部で [適用] を選択し変更を保存します。

クリーンアップ

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

Elastic Beanstalk 環境を終了するには
  1. Elastic Beanstalk コンソールを開き、リージョンリストで を選択します AWS リージョン。

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

    注記

    環境が多数ある場合は、検索バーを使用して環境リストをフィルタリングします。

  3. [Actions] (アクション)、[Terminate environment] (環境の終了) の順に選択します。

  4. 画面上のダイアログボックスを使用して、環境の終了を確認します。

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

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

DynamoDB テーブルを削除するには
  1. DynamoDB コンソールで [テーブル] ページを開きます。

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

  3. アクション を選択してから、テーブルの削除 を選択します。

  4. [削除] をクリックします。

次のステップ

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

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

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