Node.js モジュールの Edge サポートについて

Apigee Edge でサポートされている Node.js のバージョン

現在、Edge は Node.js 0.10.32 をサポートしています。

Edge でサポートされている Node.js 標準モジュール

どの Node.js 標準モジュールが Edge に含まれているかについては、以下の表をご覧ください。部分的にしかサポートされていないモジュールもあります。以下が Node.js に組み込まれているモジュールです。

モジュール ステータス
assert サポート対象
buffer サポート対象
child_process 制限付き 子プロセスを生成しようとすると、例外が発生します。ただし、サブスクリプトを生成するための「fork」はサポートされます。
cluster 無効 cluster.isMaster は常に true を返し、他のメソッドは未実装です。 各 Node.js スクリプトのコピー 1 つが、各 Edge メッセージ プロセッサにデプロイされます。
crypto サポート対象
dns サポート対象
domain サポート対象
dgram 制限付き Apigee 環境の Node.js アプリケーションは、ネットワーク アーキテクチャが理由で、UDP 経由でインターネット上のサービスにアクセスできません。
events サポート対象
fs 制限付き ファイル システムへのアクセスは、スクリプトが起動されたディレクトリである /resources/node ディレクトリに限定されています。Node.js スクリプトでは、一時的なスクラッチ領域などとして、このディレクトリ内のファイルの読み取り、書き込みができます。ただし、ファイルが保持される期間は保証されません。
http サポート対象 受信リクエストの仮想ホストとパスは、HTTP モジュールではなく、API プロキシで指定されます。詳細については、http モジュールおよび https モジュールのサポートについてをご覧ください。
https サポート対象 「https」サーバーの作成は「http」サーバーとまったく同じです。詳細については、http モジュールおよび https モジュールのサポートについてをご覧ください。
module サポート対象
net 制限付き TCP 受信接続をリッスンしようとすると、例外が生成されます。
path サポート対象
module サポート対象
process 部分的にサポート ユーザー ID、グループ メンバーシップ、作業ディレクトリを操作する機能は、サポートされていません。
punycode サポート対象
querystring サポート対象
readline 無効 Apigee Edge で実行されているスクリプトには標準入力がありません。
repl 無効 Apigee Edge で実行されているスクリプトには標準入力がありません。
module 組み込み
STDIO サポート対象

標準出力と標準エラー出力は Apigee Edge インフラストラクチャ内のログファイルへ送られます。これらのログは、API プロキシの Apigee Edge 管理 UI の [Node.js Logs] ボタンをクリックすると表示できます。

Apigee Edge で実行されているスクリプトには標準入力がありません。ただし、TargetEndpoint の ScriptTarget 要素で引数を渡すことはできます。詳細については、ScriptTarget の高度な構成をご覧ください。

stream サポート対象
string_decoder サポート対象
timers 組み込み
tls サポート対象 Transport Layer Security(TLS)のパラメータは、基本的に通常の Node.js と同じように動作します。詳細については、Apigee Edge での TLS(SSL)Node.js モジュールの使用をご覧ください。
tty 無効 Apigee Edge で実行されているスクリプトには標準入力がありません。
url サポート対象
util サポート対象
vm サポート対象
zlib サポート対象

サポートされているその他のモジュール

このセクションでは、標準の Node.js ではサポートされていないものの、Trireme と Apigee Edge で実行されている Trireme ではサポートされているその他のモジュールについて説明します。Trireme は、Apigee Edge で実行されているオープンソースの Node.js コンテナです。Java 仮想マシン(JVM)の中で Node.js スクリプトが動作するよう設計されています。以下のモジュールはすべて NPM で入手できます。

モジュール 説明
apigee-access このモジュールにより、Apigee Edge プラットフォームで実行されている Node.js アプリケーションが Apigee 固有の機能にアクセスできます。このモジュールを使用すると、フロー変数にアクセスして変更したり、セキュアストアからデータを取得したり、Edge キャッシュ、割り当て、および OAuth サービスを使用したりできます。apigee-access モジュールの使用もご覧ください。
trireme-support Node.js アプリケーションで Trireme 固有の機能を利用できます。現在サポートされている唯一の機能は、Java で作成された Node.js モジュールの読み込みです。注: loadJars は、Edge Cloud ではサポートされていません。
trireme-xslt XLST 処理を抽象化します。Node.js アプリケーションが Java で実行されている場合に、Trireme プラットフォームで XSLT を効率的に処理するように設計されています。
trireme-jdbc Node.js から JDBC へのアクセスを提供します。注: Edge Cloud ではサポートされていません。Edge Private Cloud の場合は、クラスパスに JDPC JAR ファイルを置き、このモジュールを使用できます。

一般的に使用されている Node.js モジュールのサポート

Node.js スクリプトに対する制限

Edge では Node.js スクリプトに次のような一定の制限があるので注意してください。

  • Apigee Edge 環境の Node.js アプリケーションでは、Edge ネットワーク アーキテクチャが理由で、UDP を使ってインターネット上のサービスにアクセスできません。
  • ファイル システムへのアクセスは、Node.js スクリプトが起動されたディレクトリ /resources/node に限定されています。Node.js スクリプトでは、一時的なスクラッチ領域などとして、このディレクトリ内のファイルの読み取り、書き込みができます。ただし、ファイルが保持される期間は保証されません。
  • TCP 受信接続をリッスンしようとすると、例外が生成されます。
  • ユーザー ID、グループ メンバーシップ、作業ディレクトリを操作する機能は、サポートされていません。
  • 標準入力については、TargetEndpoint の ScriptTarget 要素による引数の引き渡しに制限されています。詳細については、ScriptTarget の高度な構成をご覧ください。
  • 標準出力については、プロキシの Edge 管理 UI での [Node.js Logs] ボタンの使用に制限されています。また、「apigeetool getlogs」コマンドも使えます。詳細については、スタンドアロン Node.js アプリのデプロイをご覧ください。
  • ネイティブ コードに依存するモジュールはサポートされていません。
  • Promise や Generator などの ECMAScript 6 の機能に依存したモジュールはサポートされません。
  • 「harmony-proxies」などの Node.js のランタイム フラグはサポートされていません。

Edge for Private Cloud での IP 接続制限の設定

Edge for Private Cloud では、Node.js のコードが「10.」あるいは「192.168.」から始まる IP アドレス、およびローカルホストからアクセスするのを制限できます。これらの IP アドレスからアクセスしようとすると、次の形のエラーが発生します。

{ [Error: connect EINVAL] message: 'connect EINVAL', code: 'EINVAL', errno: 'EINVAL', syscall: 'connect' }

これらの制限を変更するには、各 Message Processor の message-processors.properties ファイルで conf_nodejs_connect.ranges.denied プロパティを設定します。デフォルト値は以下のとおりです。

  • Edge 4.17.05 以前: conf_nodejs_connect.ranges.denied=10.0.0.0/8,192.168.0.0/16,127.0.0.1/32
  • Edge 4.17.09 以降: conf_nodejs_connect.ranges.denied=(制限なし)

このプロパティを設定するには:

  1. エディタで message-processor.properties ファイルを開きます。ファイルが存在しない場合は作成します。
    > vi /<inst_root>/apigee/customer/application/message-processor.properties
  2. 必要なプロパティを設定します。たとえば、ローカルホストからのアクセスのみ拒否する場合は次のとおりです。
    conf_nodejs_connect.ranges.denied=127.0.0.1/32
  3. 変更を保存します。
  4. プロパティ ファイルの所有者を「apigee」ユーザーにします。
    > chown apigee:apigee /<inst_root>/apigee/customer/application/message-processor.properties
  5. Message Processor を再起動します。
    > /<inst_root>/apigee/apigee-service/bin/apigee-service edge-message-processor restart

http モジュールおよび https モジュールのサポートについて

Apigee Edge で実行されているすべての Node.js アプリケーションが着信リクエストをリッスンするには、http モジュールまたは https モジュールを使用する必要があります。受信リクエストをリッスンしないスクリプトをデプロイする場合、単に実行され、終了します。

Node.js の http モジュールと https モジュールの listen メソッドでは、パラメータとしてポート番号をとります。例:

svr.listen(process.env.PORT || 9000, function() {
   console.log('The server is running.');
});

「port」引数は、Node.js では必要ですが、Apigee Edge では無視されます。そのかわり、Node.js スクリプトが実行される API プロキシは、リッスンする「仮想ホスト」を指定し、その Node.js アプリケーションは、他の Apigee Edge プロキシと同じように、同じ仮想ホストを使います。

Apigee のすべての環境には、少なくとも 1 つの仮想ホストがあります。仮想ホストは、Apigee 組織と接続するための HTTP 設定を定義します。環境内のすべての API プロキシは同じ仮想ホストを共有します。デフォルトでは、環境ごとに defaultsecure の 2 つの仮想ホストを使用できます。詳細については、Get Virtual HostAPI の開発ライフサイクルをご覧ください。

apigeetool deploynodeapp コマンドでは、Node.js アプリケーションの周りに Apigee Edge プロキシ ラッパーを生成します。デプロイすると、Node.js アプリケーションは、その環境に対して定義されたデフォルト仮想ホストをリッスンします。Node.js アプリケーションの URL は常に http://{org_name}-{env_name}.apigee.net になります。

受信リクエストの処理

他の Apigee Edge アプリケーションと同様に、secure 仮想ホストをリッスンするように設定されている場合は、プロキシ アプリケーションでは HTTPS を使用して受信リクエストを受け入れます。

送信リクエストの処理

受信トラフィックの受信の他、Apigee Edge 内の Node.js アプリケーションは、他の Node.js アプリケーションと同様に、http モジュールと https モジュールを使用して、送信リクエストを行います。これらのモジュールは、常に Node.js 内で実行されているように機能します。

tls モジュールのサポートについて

Apigee Edge では Node.js tls モジュールがサポートされています。このモジュールでは OpenSSL を使用して、Transport Layer Security(TLS)とセキュア ソケット レイヤー(SSL)の両方またはどちらか一方の暗号化ストリーム通信を提供しています。tls モジュールを使用すると、Edge で実行されている Node.js アプリケーションからバックエンド サービスへのセキュリティで保護された接続を作成できます。

Apigee Edge での tls モジュールの機能を理解するには、Apigee Edge での virtual hosts の使用方法を理解することが重要です。Apigee のすべての環境には、少なくとも 1 つの仮想ホストがあります。仮想ホストは、Apigee 組織と接続するための HTTP 設定を定義します。環境内のすべての API プロキシは同じ仮想ホストを共有します。デフォルトでは、環境ごとに defaultsecure の 2 つの仮想ホストを使用できます。仮想ホストの詳細については、Get Virtual HostAPI の開発ライフサイクルをご覧ください。

次に、Apigee Edge が Node.js アプリケーションで受信あるいは送信するリクエストのための TLS(SSL)通信を処理する方法について確認します。

受信リクエストの処理

Edge では、組織での仮想ホストの構成方法に応じて、次の選択肢があります。

  • API プロキシが default 仮想ホストをリッスンするように構成されている場合は、このプロキシでは HTTP を介して受信リクエストを受け入れます。
  • API プロキシが secure 仮想ホストをリッスンするように構成されている場合は、このプロキシでは HTTPS を介して受信リクエストを受け入れます。URL は apigee.net ドメインの URL になり、*.apigee.net のワイルドカード SSL 証明書が使用されます。アプリが apigee.net ドメインに対してリクエストを行う限り、SSL 証明書は正常に検証されます。

送信リクエストの処理

Node.js で通常行うのと同じ方法で tls モジュールを使用して送信リクエストを行えます。基本的には、クライアント側の鍵と証明書(.pem ファイル)を resources/node ディレクトリに追加してスクリプト内に読み込む必要があります。tls モジュールとそのメソッドの使用方法については、Node.js の tls モジュールのドキュメントをご覧ください。

ScriptTarget の高度な構成

<TargetEndpoint> の定義では、<ScriptTarget> 要素として <ResourceURL> のほかにもパラメータを追加することができます。また、次のように <Arguments> パラメータと <EnvironmentVariables> パラメータを使って、Node.js スクリプトにコマンドライン引数と環境変数を渡すこともできます。
<TargetEndpoint name="default">
  <ScriptTarget>
     <ResourceURL>node://hello.js</ResourceURL>
     <EnvironmentVariables>
         <EnvironmentVariable name="NAME">VALUE</EnvironmentVariable>
     </EnvironmentVariables>
     <Arguments>
         <Argument>ARG</Argument>
     </Arguments>
  </ScriptTarget>
</TargetEndpoint>