コンテナの起動時間を短縮する
Contrastエージェントを組み込んだアプリケーションを起動すると、アプリケーションとアプリケーションで読み込まれる依存関係コードの両方にコード変換が適用されます。このコードの変換によって、Contrastエージェントを使用するアプリケーションの起動時間が長くなります。
Node.jsエージェントのバージョン4.x以降、アプリケーションを起動する前にプリコンパイルできるコマンドラインユーティリティを提供するようになりました。Contrastエージェントを有効にしてプリコンパイルされたアプリケーションを起動すると、変換済みファイルがディスクからロードされて起動時間が大幅に改善されます。バージョン5以降のエージェントおよびエージェントのユーティリティでは、コマンドラインの引数(例、--agent.logger.path /dev/null
)はサポートされなくなりました。
リライタを使用する
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
(オプション)
@contrast/cli
パッケージをインストールします。これは、実行時にエージェントによって使用されないため、
devDependency
(本番環境に影響しないパッケージ)とすることができます。事前にパッケージをインストールしていない場合は、npxによって、手順3の実行時にパッケージのインストールを促すプロンプトが表示されます。これは問題ありませんが、手動でインストールする(そして
package.json
に依存関係として@contrast/cli
を含める)ことによって、指定したバージョンを確実に使用することができます。
npm install --save-dev @contrast/cli
アプリケーションのエントリポイント(例えば、
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
リライタ処理が完了したら、通常と同じように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');