Skip to main content

コンテナの起動時間を短縮する

Contrastエージェントを組み込んだアプリケーションを起動すると、アプリケーションとアプリケーションで読み込まれる依存関係コードの両方にコード変換が適用されます。このコードの変換によって、Contrastエージェントを使用するアプリケーションの起動時間が長くなります。

Node.jsエージェントのバージョン4.x以降、アプリケーションを起動する前にプリコンパイルできるコマンドラインユーティリティを提供するようになりました。Contrastエージェントを有効にしてプリコンパイルされたアプリケーションを起動すると、変換済みファイルがディスクからロードされて起動時間が大幅に改善されます。バージョン5以降のエージェントおよびエージェントのユーティリティでは、コマンドラインの引数(例、--agent.logger.path /dev/null)はサポートされなくなりました。

リライタを使用する

  1. Node.jsエージェントの設定ファイル(contrast_security.yaml)で以下を行います。

    • (オプション)リライタのキャッシュを有効にし、キャッシュのパスを指定します。

      • デフォルトでは、キャッシュは有効になっており、アプリケーションディレクトリの下にある.contrastフォルダに書き込まれます。

      • agent.node.rewrite.enable または agent.node.rewrite.cache.enableのいずれかが、「false」の場合、エラーが返ります。

    • (オプション)ログレベルを指定します。

      • リライタのログのデフォルトはINFOレベルで最小限のログが記録され、実行されているモードがユーザに通知されます。DEBUGレベルでは、リライタ処理での失敗がユーザに通知されます。TRACEレベルでは、変換された各ファイルに関する情報がログに記録されます。

    • リライタを実行するモードを指定するために、assessまたはprotectを有効にします。両方のモードが有効になっている場合は、リライタはassess モードで実行されます(assessにはprotectからのすべての変換が含まれるため)。

    • 注記

      実行時に-a--assessまたは -p--protectフラグを使用して、モードを指定することもできます。

    例:

    // example config
    agent:
      logger:
        level: TRACE // Default: INFO
      node:
        rewrite:
          enable: true // default: true
          cache:
            enable: true // default: true
            path: ./path/relative/to/app/root // default: .contrast/
    assess:
      enable: true
    
  2. (オプション)@contrast/cli パッケージをインストールします。

    • これは、実行時にエージェントによって使用されないため、 devDependency (本番環境に影響しないパッケージ)とすることができます。

    • 事前にパッケージをインストールしていない場合は、npxによって、手順3の実行時にパッケージのインストールを促すプロンプトが表示されます。これは問題ありませんが、手動でインストールする(そしてpackage.jsonに依存関係として@contrast/cliを含める)ことによって、指定したバージョンを確実に使用することができます。

    npm install --save-dev @contrast/cli
  3. アプリケーションのエントリポイント(例えば、index.js)を指定して、実行ファイルを起動します。例:

    npx -p @contrast/cli rewrite index.js
    # or
    npx -p @contrast/cli rewrite -a index.js # force assess mode
    npx -p @contrast/cli rewrite -p index.js # force protect mode
  4. リライタ処理が完了したら、通常と同じようにContrastを有効にしてアプリケーションを起動します。 (例、node --import @contrast/agent index.js)

既知の制限事項

現在、リライタCLIでは処理できないシナリオがいくつかあります。

リライタCLIでは、静的解析を使用して変換するファイルを決定するため、動的な読み込み(動的なimportやrequire)は処理できません。ファイルが以下のいずれかの方法でインクルードされる場合、エージェントによって、実行時にインクルードされたファイルが変換されます。

// dynamic imports or requires
const name = 'foo.js';
await import(name);require(name);

// direct calls to createRequire
createRequire(import.meta.url)('foo.js');
// this should work, however:
const require = createRequire(import.meta.url);
require('foo.js');

// renamed require functions
const r = createRequire('...');
r('foo.js');
const myRequire = require;
myRequire('bar.js');