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 接続の待ち受け(listen)をしようとすると、例外が発生します。
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 サポート対象 トランスポート層セキュリティ(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 接続の待ち受け(listen)をしようとすると、例外が発生します。
  • ユーザー 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 アプリケーションは、受信するリクエストの待ち受け(listen)に、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 プロキシは、待ち受け(listen)する「仮想ホスト」を指定し、その Node.js アプリケーションは、他の Apigee Edge プロキシと同じように、同じ仮想ホストを使います。

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

apigeetool deploynodeapp コマンドで、Node.js アプリケーションに対する Apigee Edge プロキシ ラッパーが生成されます。デプロイすると、Node.js アプリケーションは、その環境で定義されたデフォルト仮想ホストで待ち受け(listen)します。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 を使用して、トランスポート層セキュリティ(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 のドメイン下となり、*.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>