メニュー
AWS Elastic Beanstalk
開発者ガイド (API Version 2010-12-01)

AWS Elastic Beanstalk Node.js プラットフォームを使用する

AWS Elastic Beanstalk Node.js プラットフォームは、Node.js ウェブアプリケーションのプラットフォーム設定として、nginx プロキシサーバーの背後、Apache サーバーの背後、または単独で実行できます。

Elastic Beanstalk には、Elastic Beanstalk 環境内の EC2 インスタンスで実行されるソフトウェアのカスタマイズに使用できる設定オプションが用意されています。アプリケーションの前面で実行するプロキシサーバー、実行する Node.js の特定のバージョン、およびアプリケーションの実行に使用するコマンドを選択できます。また、必要に応じてアプリケーションの環境変数を設定し、Amazon S3 へのログローテーションを有効にできます。

プラットフォームに固有の設定オプションは AWS マネジメントコンソール で実行中の環境の設定を変更するために利用できます。環境を終了したときにその設定が失われないようにするため、保存済み設定を使用して設定を保存し、それを後で他の環境に適用することができます。

ソースコードの設定を保存する場合、設定ファイルを含めることができます。設定ファイルの設定は、環境を作成するたびに、またはアプリケーションをデプロイするたびに適用されます。設定ファイルを使用して、デプロイの間にパッケージをインストールしたり、スクリプトを実行したり、他のインスタンスのカスタマイズオペレーションを実行することもできます。

デプロイの間にパッケージをインストールするために、ソースバンドルに Package.json ファイルを含めることができます。また、依存関係のバージョンをロックダウンするために、npm-shrinkwrap.json ファイルを含めることができます。

Node.js プラットフォームには、静的なアセットに対応し、アプリケーションにトラフィックを転送して、レスポンスを圧縮するためのプロキシサーバーが含まれています。高度なシナリオでは、デフォルトのプロキシ設定を拡張また上書きできます。

AWS マネジメントコンソール で適用される設定は、設定ファイルに同じ設定があれば、それらの設定を上書きします。これにより、設定ファイルでデフォルト設定を定義し、コンソールでそのデフォルト設定を環境に固有の設定で上書きできます。設定の優先順位の詳細と設定の他の変更方法については、「設定オプション」を参照してください。

AWS マネジメントコンソールでの Node.js 環境の設定

[Node.js] 設定を使用すると、Amazon EC2 インスタンスの動作を微調整し、Amazon S3 ログのローテーションを有効または無効にできます。Elastic Beanstalk 環境の Amazon EC2 インスタンス設定を編集するには、AWS マネジメントコンソールを使用します。

Elastic Beanstalk アプリケーションの Node.js コンテナの設定にアクセスするには

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

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

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

  4. [Software Configuration] セクションで、設定アイコン (  を編集します。 ) を選択します。

コンテナオプション

設定ページで、次のように指定します。

  • Proxy Server – Node.js への接続のプロキシに使用するウェブサーバーを指定します。デフォルトでは、nginx が使用されます。[none] を選択すると、静的なファイルマッピングは有効にならず、gzip 圧縮は無効になります。

  • Node Version – Node.js のバージョンを指定します。サポートされている のバージョンについては、Elastic Beanstalk でサポートされているプラットフォーム を参照してください。

    注記

    お使いの Node.js バージョンのサポートがプラットフォーム設定から削除された場合には、プラットフォームアップグレードの前に、バージョン設定の変更または削除を行ってください。これによって、いくつかの Node.js のバージョンにセキュリティの脆弱性が見つかる場合があります

    この場合、設定された NodeVersion をサポートしない新しいバージョンのプラットフォームにアップグレードしようとすると、失敗します。新しい環境の作成を回避するためには、古い設定バージョンと新しいバージョンの両方をサポートするバージョンに NodeVersion 設定オプションを変更するか、オプション設定を削除してから、プラットフォームのアップグレードを行ってください。

  • Gzip Compression – gzip 圧縮が有効かどうかを指定します。デフォルトでは、gzip 圧縮は有効です。

  • Node Command – Node.js アプリケーションの起動に使用するコマンドを入力できます。空の文字列(デフォルト)は、Elastic Beanstalk が app.jsserver.jsnpm start をこの順序で使用することを意味しています。

ログオプション

[Log Options] セクションには、2 つの設定があります。

  • Instance profile – アプリケーションに関連付けられた Amazon S3 バケットへのアクセス許可が付与されているインスタンスプロファイルを指定します。

  • Enable log file rotation to Amazon S3 – アプリケーションの Amazon EC2 インスタンスのログファイルを、アプリケーションに関連付けられている Amazon S3 バケットにコピーするかどうかを指定します。

静的ファイル

パフォーマンスを向上させるには、ウェブアプリケーション内の一連のディレクトリから静的ファイル(HTML、画像など)を提供するように nginx または Apache を設定します。仮想パスおよびディレクトリマッピングは、[Static Files] セクションの [Container] タブで設定できます。複数のマッピングを追加するには、[Add Path] をクリックします。マッピングを削除するには、[Remove] をクリックします。

環境プロパティ

[Environment Properties] セクションでは、アプリケーションを実行している Amazon EC2 インスタンスの環境設定を指定できます。これらの設定は、キーと値のペアでアプリケーションに渡されます。

AWS Elastic Beanstalk で実行中の Node.js 環境内部で、以下の例と同様の process.env.ENV_VARIABLE を使用して環境変数にアクセスできます。

process.env.PARAM1
process.env.PARAM2

注記

環境設定では、アクセント記号(`、ASCII 96)は除く、印刷可能な ASCII 文字を使用できます。また、200 文字を超えることはできません。

Node.js プラットフォームは、プロキシサーバーがトラフィックを渡すポートに PORT 環境変数を設定します。「プロキシサーバーを設定する」を参照してください。

設定ファイル

設定ファイル を使用して、設定オプションを設定し、デプロイの間、他のインスタンス設定タスクを実行できます。 以下の設定ファイルでは、"npm start" を使用してアプリケーションを実行し、プロキシタイプを Apache に設定して、圧縮を有効にするよう Elastic Beanstalk に指示し、/images パスの myimages ディレクトリから静的画像を提供するようプロキシを設定します。

例 .ebextensions/node-settings.config

option_settings:
  aws:elasticbeanstalk:container:nodejs: 
    NodeCommand: "npm start"
    ProxyServer: apache
    GzipCompression: true
  aws:elasticbeanstalk:container:nodejs:staticfiles:
    /images: myimages

設定の一覧については、「Node.js プラットフォームのオプション」を参照してください。

Package.json ファイルを使用したパッケージのインストール

プロジェクトソースのルートで package.json ファイルを使用し、npm を使用してアプリケーションに必要なパッケージをインストールします。

例 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 ファイルがある場合は、Elastic Beanstalk では依存関係をインストールするために npm install が実行されます。

npm shrinkwrap による依存関係のロック

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

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

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

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

プロキシサーバーを設定する

Node.js プラットフォームはリバースプロキシを使用して、インスタンスのポート 80 から、ポート 8081 でリッスンしているアプリケーションにリクエストを中継します。Elastic Beanstalk は、拡張または独自の設定で完全に上書きできるデフォルトのプロキシ設定を提供します。

デフォルト設定を拡張するには、設定ファイルで /etc/nginx/conf.d.conf ファイルを追加します。例については、「Node.js を実行している EC2 インスタンスで HTTPS を終了する」を参照してください。

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/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 圧縮を定義する必要があります。