AWS OpsWorks
ユーザーガイド (API バージョン 2013-02-18)

Node.js スタックの初回作成

この例では、Node.js アプリケーションサーバーをサポートする Linux スタックの作成方法と、シンプルなアプリケーションのデプロイ方法について説明します。スタックは以下のコンポーネントから構成されます。

前提条件

このウォークスルーでは、以下のことを前提としています。

  • AWS アカウントがあり、AWS OpsWorks スタックの基本的な使用方法を理解している。

    AWS OpsWorks スタックまたは AWS に慣れていない場合は、入門チュートリアル「Chef 11 Linux スタックの使用開始」を完了して、基本事項を学習してください。

  • Node.js アプリケーションの基本的な実装方法を理解している。

    Node.js に慣れていない場合は、「Node: Up and Running」などの入門チュートリアルを完了して、基本事項を学習してください。

  • この例で使用する予定の AWS リージョンで 1 つ以上のスタックを作成済みである。

    リージョンで初めてスタックを作成すると、AWS OpsWorks スタックによって、レイヤータイプごとに Amazon Elastic Compute Cloud (Amazon EC2) セキュリティグループが作成されます。これらのセキュリティグループは、Amazon RDS データベース (DB) インスタンスを作成する必要があります。AWS OpsWorks スタックに慣れていない場合は、「Chef 11 Linux スタックの使用開始」のチュートリアルで使用したのと同じリージョンをこの例でも使用することをお勧めします。新しいリージョンを使用する場合は、リージョンに新しいスタックを作成します。このスタックに Layer やインスタンスは必要ありません。スタックを作成すると、AWS OpsWorks スタックによって一連のセキュリティグループがリージョンに自動的に追加されます。

  • デフォルトの VPC にスタックを作成する。

    このウォークスルーには EC2-Classic を使用できますが、一部の詳細はわずかに異なります。たとえば EC2-Classic では、サブネットではなくインスタンスのアベイラビリティーゾーン (AZ) を指定します。

  • AWS Identity and Access Management (IAM) ユーザーが AWS OpsWorks スタックに対するフルアクセス権限を持っている。

    セキュリティ上の理由から、ウォークスルー用にアカウントのルート認証情報を指定しないことを強くお勧めします。代わりに、AWS OpsWorks スタックの完全アクセス権限を持つ IAM ユーザーを作成し、その認証情報を AWS OpsWorks スタックで使用します。詳細については、「管理ユーザーの作成」を参照してください。

アプリケーションの実装

このウォークスルーでは、Amazon RDS DB インスタンスに接続して、インスタンスのデータベースを一覧表示する、シンプルな Express アプリケーションを使用します。

アプリケーションを実装するには、ワークステーション上の使いやすい場所に nodedb という名前のディレクトリを作成し、以下に示す 3 つのファイルを追加します。

パッケージディスクリプター

アプリケーションのパッケージディスクリプターを作成するには、以下に示す内容の package.json というファイルを nodedb ディレクトリに追加します。package.json は、Express アプリケーションに必要であり、アプリケーションのルートディレクトリに配置されている必要があります。

{ "name": "Nodejs-DB", "description": "Node.js example application", "version": "0.0.1", "dependencies": { "express": "*", "ejs": "*", "mysql": "*" } }

この例の package.json は、ほぼ最小限の内容です。必要な name 属性と version 属性が定義され、従属パッケージがリストされています。

  • express は、Express パッケージを参照しています。

  • ejs は、テキストを HTML レイアウトファイルに挿入するためにアプリケーションで使用される EJS パッケージを参照しています。

  • mysql は、RDS インスタンスに接続するためにアプリケーションで使用される node-mysql パッケージを参照しています。

パッケージディスクリプターファイルの詳細については、「package.json」を参照してください。

レイアウトファイル

アプリケーションのレイアウトファイルを作成するには、views ディレクトリに nodedb ディレクトリを追加し、以下に示す内容の views というファイルを index.html に追加します。

<!DOCTYPE html> <html> <head> <title>AWS Opsworks Node.js Example</title> </head> <body> <h1>AWS OpsWorks Node.js Example</h1> <p>Amazon RDS Endpoint: <i><%= hostname %></i></p> <p>User: <i><%= username %></i></p> <p>Password: <i><%= password %></i></p> <p>Port: <i><%= port %></i></p> <p>Database: <i><%= database %></i></p> <p>Connection: <%= connectionerror %></p> <p>Databases: <%= databases %></p> </body> </html>

この例のファイルレイアウトは、Amazon RDS からのデータを表示する簡単な HTML ドキュメントです。各 <%= ... => 要素は、次に作成するコードファイル内で定義されている変数の値を示します。

コードファイル

アプリケーションのコードファイルを作成するには、以下に示す内容の server.js ファイルを nodedb ディレクトリに追加します。

重要

AWS OpsWorks スタックでは、Node.js アプリケーションのメインコードファイルを server.js という名前にし、アプリケーションのルートフォルダに置く必要があります。

var express = require('express'); var mysql = require('mysql'); var dbconfig = require('opsworks'); //[1] Include database connection data var app = express(); var outputString = ""; app.engine('html', require('ejs').renderFile); //[2] Get database connection data app.locals.hostname = dbconfig.db['host']; app.locals.username = dbconfig.db['username']; app.locals.password = dbconfig.db['password']; app.locals.port = dbconfig.db['port']; app.locals.database = dbconfig.db['database']; app.locals.connectionerror = 'successful'; app.locals.databases = ''; //[3] Connect to the Amazon RDS instance var connection = mysql.createConnection({ host: dbconfig.db['host'], user: dbconfig.db['username'], password: dbconfig.db['password'], port: dbconfig.db['port'], database: dbconfig.db['database'] }); connection.connect(function(err) { if (err) { app.locals.connectionerror = err.stack; return; } }); // [4] Query the database connection.query('SHOW DATABASES', function (err, results) { if (err) { app.locals.databases = err.stack; } if (results) { for (var i in results) { outputString = outputString + results[i].Database + ', '; } app.locals.databases = outputString.slice(0, outputString.length-2); } }); connection.end(); app.get('/', function(req, res) { res.render('./index.html'); }); app.use(express.static('public')); //[5] Listen for incoming requests app.listen(process.env.PORT);

この例では、データベース接続情報を表示し、データベースサーバーに照会して、サーバーのデータベースを表示しています。これは、必要に応じてデータベースとやり取りするために簡単に一般化することができます。コード内の番号付きのコメントに対応する注釈を以下に示します。

[1] Include database connection data (データベース接続データを含める)

この require ステートメントでは、データベース接続データを含めています。後で説明しますが、データベースインスタンスをアプリケーションにアタッチすると、AWS OpsWorks スタックによって以下のような内容の接続データが opsworks.js というファイルに記述されます。

exports.db = { "host":"nodeexample.cdlqlk5uwd0k.us-west-2.rds.amazonaws.com", "database":"nodeexampledb", "port":3306, "username":"opsworksuser", "password":"your_pwd", "reconnect":true, "data_source_provider":"rds", "type":"mysql"}

opsworks.js はアプリケーションの shared/config ディレクトリ /srv/www/app_shortname/shared/config にあります。ただし、AWS OpsWorks スタックによって opsworks.js へのシンボリックリンクがアプリケーションのルートディレクトリに配置されるため、require 'opsworks' を使用するだけで、このオブジェクトをインクルードすることができます。

[2] Get database connection data (データベース接続データを取得する)

これら一連のステートメントは、opsworks.js に記述されている接続データを表示します。そのために、db オブジェクトの値を一連の app.locals プロパティに割り当てています。これらのプロパティはそれぞれ、index.html ファイル内の <%= ... %> 要素のいずれかに対応しています。レンダリング後のドキュメントでは、<%= ... %> 要素が、対応するプロパティ値に置き換わります。

[3] Connect to the Amazon RDS instance (Amazon RDS インスタンスに接続する)

この例では、node-mysql を使用してデータベースにアクセスしています。データベースに接続するために、接続データを connection に渡して createConnection オブジェクトを作成し、connection.connect を呼び出して接続を確立しています。

[4] Query the database (データベースを照会する)

接続を確立した後、データベースを照会するために connection.query 呼び出します。この例では単純に、サーバーのデータベース名を照会しています。query は、データベース名を Database プロパティに割り当てて、各データベースに対応する results オブジェクトの配列を返します。この例では、名前を連結して app.locals.databases, に割り当てます。これにより、レンダリングされた HTML ページに一覧が表示されます。

この例では、データベースが 5 つあります。1 つは、RDS インスタンスの作成時に指定した nodeexampledb データベースで、他の 4 つは、Amazon RDS によって自動的に作成されます。

[5] Listen for incoming requests(受信されるリクエストをリッスンする)

最後のステートメントは、指定されたポートで受信されるリクエストをリッスンします。明示的なポート値を指定する必要はありません。スタックにアプリケーションを追加する際には、アプリケーションで HTTP リクエストと HTTPS リクエストのいずれをサポートするか指定します。これを受けて、AWS OpsWorks スタックによって PORT 環境変数が 80 (HTTP) または 443 (HTTPS) に設定され、この変数をアプリケーションで使用できます。

他のポートでリッスンすることは可能ですが、Node.js アプリケーションサーバー Layer の組み込みセキュリティグループである AWS-OpsWorks-nodejs-App-Server では、ポート 80、443、および 22 (SSH) への着信ユーザートラフィックのみが許可されています。他のポートへの着信ユーザートラフィックを許可するには、適切なインバウンドルールを指定してセキュリティグループを作成し、Node.js アプリケーションサーバー Layer に割り当てます。組み込みのセキュリティグループを編集することでインバウンドルールを変更しないでください。AWS OpsWorks スタックでは、スタックを作成するたびに組み込みセキュリティグループが標準設定で上書きされるため、その変更内容は失われます。

注記

関連するアプリケーションを作成または更新するときに、カスタムの環境変数をアプリケーションに関連付けることができます。また、カスタムの JSON とカスタムレシピを使用してデータをアプリケーションに渡すこともできます。詳細については、「アプリケーションへのデータの引き渡し」を参照してください。

データベースサーバーとロードバランサーの作成

この例では、Amazon RDS データベースサーバーと Elastic Load Balancing ロードバランサーのインスタンスを使用しています。各インスタンスは別々に作成し、スタックに組み込む必要があります。このセクションでは、新しいデータベースとロードバランサーのインスタンスを作成する方法を説明します。既存のインスタンスを使用することもできますが、この手順を読み、そのインスタンスが正しく設定されているか確認することをお勧めします。

この例で十分使用できる、最小設定の RDS DB インスタンスを作成する方法を次に説明します。詳細については、「Amazon RDS ユーザーガイド」を参照してください。

RDS DB インスタンスを作成するには

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

    Amazon RDS コンソールを開き、リージョンを 米国西部 (オレゴン) に設定します。ナビゲーションペインで [RDS Dashboard] を選択し、[Launch DB Instance] を選択します。

  2. データベースエンジンを指定します。

    データベースエンジンとして、[MySQL Community Edition] を選択します。

  3. マルチ AZ 配置を拒否します。

    [No, this instance...] を選択し、[Next] を選択します。この例にマルチ AZ 配置は必要ありません。

  4. 基本的な設定を指定します。

    [DB Instance Details] ページで、次の設定を指定します。

    • DB Instance Class: db.t2.micro

    • Multi-AZ Deployment: No

    • ストレージ割り当て: 5 GB

    • DB インスタンス識別子: nodeexample

    • マスターユーザーの名前: opsworksuser

    • Master Password: 任意のパスワード

    後で使用できるようにインスタンス識別子、ユーザー名、およびパスワードを書き留め、その他のオプションについてはデフォルト設定をそのままにして、[Next] を選択します。

  5. 詳細設定を指定します。

    [Configure Advanced Settings] ページで、以下の設定を指定します。

    • データベース名: nodeexampledb

    • DB Security Group(s): AWS-OpsWorks-DB-Master-Server

    注記

    AWS-OpsWorks-DB-Master-Server セキュリティグループでは、スタックのインスタンスからのみデータベースへのアクセスが許可されます。データベースに直接アクセスするには、適切なインバウンドルールを指定して追加のセキュリティグループを RDS DB インスタンスにアタッチします。詳細については、「Amazon RDS セキュリティグループ」を参照してください。VPC にインスタンスを配置することによってアクセスを制御することもできます。詳細については、「VPC でのスタックの実行」を参照してください。

    後で使用できるようにデータベース名を書き留め、その他の設定についてはデフォルト値をそのままにして、[Launch DB Instance] を選択します。

以下の手順では、この例で使用する Elastic Load Balancing ロードバランサーを作成する方法を説明します。詳細については、「Elastic Load Balancing ユーザーガイド」を参照してください。

ロードバランサーを作成するには

  1. Amazon EC2 コンソールを開きます。

    Amazon EC2 コンソールを開き、リージョンが 米国西部 (オレゴン) に設定されていることを確認します。ナビゲーションペインで、[Load Balancers] を選択し、[Create Load Balancer] を選択します。

  2. ロードバランサーを定義します。

    [Define Load Balancer] ページで、以下の設定を指定します。

    • Name (名前)Node-LB

    • Create LB Inside (ロードバランサーを作成する場所)My Default VPC

    その他のオプションについてはデフォルト設定をそのままにして、[Next] を選択します。

  3. セキュリティグループを割り当てます。

    [Assign Security Groups] ページで、以下のグループを指定します。

    • デフォルト VPC セキュリティグループ

    • AWS-OpsWorks-nodejs-App-Server

    [Next (次へ)] を選択します。[Configure Security Settings] ページで、[Next] を選択します。この例にセキュアリスナーは必要ありません。

  4. ヘルスチェックを設定します。

    [Configure Health Check (ヘルスチェックの設定)] ページで、[Ping Path (ping パス)] を / に設定し、その他の設定についてはデフォルト値をそのままにします。[Next (次へ)] を選択します。[Add EC2 Instances] ページで、[Next] を選択します。[Add Tags] ページで、[Review and Create] を選択します。EC2 インスタンスをロードバランサーに追加するタスクは AWS OpsWorks スタックによって処理されるため、この例のタグは必要ありません。

  5. ロードバランサーを作成します。

    [Review] ページで、[Create] を選択してロードバランサーを作成します。

スタックの作成

必要なコンポーネントがすべて揃ったので、スタックを作成できます。

スタックを作成するには

  1. AWS OpsWorks スタックコンソールにサインインします。

    AWS OpsWorks スタックコンソールにサインインし、[Add Stack (スタックを追加)] を選択します。

  2. スタックを作成します。

    新しいスタックを作成するには、[Chef 11 stack] を選択して、以下の設定を指定します。

    • NodeStack

    • Region (リージョン)米国西部 (オレゴン)

      スタックは任意の AWS リージョンに作成できますが、このチュートリアルでは 米国西部 (オレゴン) の使用をお勧めします。

    [Add Stack] を選択します。スタック設定の詳細については、「新しいスタックを作成する」を参照してください。

  3. ロードバランサーがアタッチされた Node.js アプリケーションサーバー レイヤーを追加します。

    [NodeStack] ページで [Add a layer] を追加し、次の設定を指定します。

    • Layer type (レイヤータイプ)Node.js アプリケーションサーバー

    • Elastic Load BalancerNode-LB

    その他の設定についてはデフォルト値をそのままにして、[Add Layer] を選択します。

  4. インスタンスを Layer に追加して起動します。

    ナビゲーションペインで、[Instances] を選択し、次の手順に従って 2 つのインスタンスを Rails アプリケーションサーバー Layer に追加します。

    1. [Node.js アプリケーションサーバー] の下で、[Add instance] を選択します。

      [Size] を [t2.micro] に設定し、その他の設定についてはデフォルト値をそのままにして、[Add Instance] を選択します。

    2. [+Instance] を選択し、2 番目の t2.micro インスタンスを別のサブネット内の Layer に追加します。

      これにより、インスタンスが別のアベイラビリティーゾーン (AZ) に配置されます。

    3. [Add instance] を選択します。

    4. 両方のインスタンスを起動するには、[Start All Instances] を選択します。

    Elastic Load Balancing ロードバランサーをこの Layer に割り当てます。インスタンスがオンライン状態に移行またはオンライン状態から移行すると、AWS OpsWorks スタックによって自動的にそのインスタンスがロードバランサーに登録または登録解除されます。

    注記

    本稼働スタックでは、アプリケーションサーバーインスタンスを複数の AZ に分散することをお勧めします。分散しておくと、ユーザーが 1 つの AZ に接続できない場合、着信トラフィックがロードバランサーによって別のゾーンにルーティングされるため、サイトの機能が続行します。

  5. RDS DB インスタンスをスタックに登録します。

    ナビゲーションペインで、[Resources] を選択し、次の手順に従って RDS DB インスタンスをスタックに登録します。

    1. [RDS] タブを選択し、[Show Unregistered RDS DB instances] を選択します。

    2. nodeexampledb インスタンスを選択し、以下の設定を指定します。

      • User (ユーザー) – インスタンスの作成時に指定したマスターユーザー名 (この例では opsworksuser)。

      • Password (パスワード) – インスタンスの作成時に指定したマスターパスワード。

    3. [Register with Stack] を選択し、RDS DB インスタンスを Amazon RDS サービス Layer としてスタックに追加します。

    警告

    AWS OpsWorks スタックは、[User (ユーザー)] の値や [Password (パスワード)] の値を検証せずに、アプリケーションに渡すだけです。これらを誤って入力すると、アプリケーションがデータベースに接続できません。

    RDS DB インスタンスを Amazon RDS サービス Layer としてスタックに追加するには、[Register with Stack] を選択します。

アプリケーションのデプロイ

アプリケーションはリモートリポジトリに保存する必要があります。アプリケーションをデプロイする場合、AWS OpsWorks スタックはコードおよび関連するファイルをリポジトリからアプリケーションサーバーインスタンスにデプロイします。この例では、わかりやすくするためにパブリックの Amazon Simple Storage Service (Amazon S3) アーカイブをリポジトリとして使用していますが、Git や Subversion など、いくつか他の種類のリポジトリも使用できます。詳細については、「Application Source」を参照してください。

アプリケーションをデプロイするには

  1. アプリケーションをアーカイブファイルにパッケージ化します。

    .zip ディレクトリおよびサブディレクトリの nodedb アーカイブを nodedb.zip という名前で作成します。gzip、bzip2、tarball など、他の種類のアーカイブファイルを使用することもできます。AWS OpsWorks スタックでは非圧縮の tarball がサポートされないことに注意してください。詳細については、「Application Source」を参照してください。

  2. アーカイブファイルを Amazon S3 にアップロードします。

    nodedb.zip を Amazon S3 バケットにアップロードし、ファイルをパブリックにして、後で使用できるようにファイルの URL を書き留めます。バケットの作成方法とファイルのアップロード方法の詳細については、「Amazon Simple Storage Service の使用開始」を参照してください。

    注記

    AWS OpsWorks スタックでは Amazon S3 バケットからプライベートファイルをデプロイすることもできますが、この例では、わかりやすくするためにパブリックファイルを使用しています。詳細については、「Application Source」を参照してください。

  3. AWS OpsWorks スタックアプリケーションを作成します。

    AWS OpsWorks スタックコンソールに戻り、ナビゲーションペインで [Apps (アプリ)] を選択し、[Add an app (アプリを追加)] を選択します。以下の設定を指定します。

    • Name (名前)NodeDB

      この文字列は、アプリケーションの表示名です。多くの目的でアプリケーションの短縮名が必要ですが、これは、表示名からすべての文字を小文字にして区切り文字を取り除くことで AWS OpsWorks スタックによって生成されます。この例の場合、短縮名は nodedb になります。アプリケーションの短縮名を確認するには、アプリケーションの作成後、[Apps] ページでアプリケーションを選択して詳細ページを表示します。

    • Type (タイプ)Node.js

    • Data source type (データソースタイプ)RDS

    • Database instance (データベースインスタンス) – 登録しておいた Amazon RDS DB インスタンスを選択します。

    • Database name (データベース名) – 作成しておいたデータベースの名前を指定します (この例の場合は nodeexampledb)。

    • Repository type (リポジトリタイプ)Http Archive

      パブリック Amazon S3 ファイルには、このリポジトリの種類を使用する必要があります。S3 Archive は、プライベートアーカイブにのみ使用する種類です。

    • Repository URL (リポジトリの URL) – アーカイブファイルの Amazon S3 URL。https://s3.amazonaws.com/node_example/nodedb.zip のようになります。

    残りの設定にはデフォルト値を使用し、[Add App] をクリックしてアプリケーションを作成します。

  4. アプリケーションをデプロイします。

    [Apps] ページに移動し、NodeDB アプリケーションの [Actions] 列で、[deploy] を選択します。次に、[Deploy] を選択して、アプリケーションをサーバーインスタンスにデプロイします。AWS OpsWorks スタックによって各インスタンスに対して Deploy レシピが実行されます。これにより、アプリケーションがリポジトリからダウンロードされ、サーバーが再起動されます。各インスタンスに緑色のチェックマークが付き、[Status] が [successful] であれば、デプロイが完了しており、アプリケーションでリクエストの処理を開始できる状態になっています。

    注記

    デプロイが失敗した場合は、[Log] 列の [show] を選択して、デプロイの Chef ログを表示します。エラー情報は下の方にあります。

  5. アプリケーションを開きます。

    アプリケーションを開くには、[Layers] を選択し、ロードバランサーを選択して、ロードバランサーの DNS 名を選択します。これにより、HTTP リクエストがロードバランサーに送信されます。次のような内容が表示されます。

注記

アプリケーションは、セットアップ時に AWS OpsWorks スタックによって自動的に新しいインスタンスにデプロイされます。オンラインインスタンスに対してのみ、手動のデプロイが必要になります。詳細については、「アプリケーションのデプロイ」を参照してください。高度なデプロイ方法など、デプロイ全般については、「アプリケーションとクックブックの管理とデプロイ」を参照してください。

次のステップ

このウォークスルーでは、シンプルな Node.js アプリケーションサーバースタックのセットアップの基本について説明しました。ここでは、次のステップに関する推奨事項をいくつか示します。

Node.js の組み込みクックブックを調べる

インスタンスがどのように設定されているか詳細に調べるには、レイヤーの組み込みクックブック opsworks_nodejs を参照してください。これには、ソフトウェアをインストールして設定するために AWS OpsWorks スタックによって使用されるレシピおよび関連ファイルが含まれています。また、deploy クックブックには、アプリをデプロイするために AWS OpsWorks スタックによって使用されるレシピが含まれています。

サーバー設定をカスタマイズする

例では、基本的なスタックを使用しています。本稼働用に使用する場合は、スタックをカスタマイズすることをお勧めします。詳細については、「AWS OpsWorks スタックのカスタマイズ」を参照してください。

SSL サポートを追加する

アプリケーションを作成するときに、アプリケーションの SSL サポートを有効にし、適切な証明書を AWS OpsWorks スタックに提供できます。AWS OpsWorks スタックによって、その証明書が適切なディレクトリにインストールされます。詳細については、「SSL の使用」を参照してください。

メモリ内データのキャッシュを追加する

本稼働レベルのサイトでは、多くの場合、Redis や Memcache などのメモリ内キー値ストアにデータをキャッシュすることでパフォーマンスが向上します。AWS OpsWorks スタックのスタックではどちらも使用できます。詳細については、「ElastiCache Redis」および「Memcached」を参照してください。

高度なデプロイ方法を使用する

ここに示した例では、すべてのインスタンスに更新を同時にデプロイするというシンプルな方法でアプリをデプロイしました。このアプローチは、シンプルで高速ですが、エラーに対する許容範囲がありません。デプロイが失敗した場合や、更新に問題がある場合、本稼働スタックのすべてのインスタンスが影響を受けることがあります。問題が解決されるまで、サイトのサービスが中断されるか無効になる可能性があります。デプロイ方法の詳細については、「アプリケーションとクックブックの管理とデプロイ」を参照してください。

Node.js アプリケーションサーバー Layer を拡張する

Layer は、さまざまな方法で拡張できます。たとえば、インスタンスに対してスクリプトを実行するためのレシピや、アプリのデプロイをカスタマイズするための Chef デプロイフックを実装することができます。詳細については、「Layer の拡張」を参照してください。

環境変数を定義する

関連付けられたアプリケーションの環境変数を定義することによって、アプリケーションにデータを渡すことができます。アプリケーションをデプロイすると、AWS OpsWorks スタックによってこれらの変数がエクスポートされ、アプリケーションからのアクセスが可能になります。詳細については、「環境変数の使用」を参照してください。