〽️

Next.js に New Relic 導入し、docker コンテナの起動に失敗した話

2023/12/11に公開

はじめに

以前より、Next.js のプロジェクトに New Relic というサービスを導入し、
フロントエンド全般の監視体制を構築している最中に遭遇した事象を書いていきます。

後でも述べますが、色々と文献を漁ってみたのですが同様の事象が起きている記事が見当たらず。
私の記事でどなたかの救いとなればと思い、記事にすることにしました。

経緯

Next.js に New Relic を導入するというお話は、
先日 miko さんがあげてくださった記事が参考になるかと思います。
https://zenn.dev/collabostyle/articles/337329e62cff2f

一通り、必要なライブラリ等をインストールしローカルでもビルド、起動ができることを確認しました。
しかしいざ、Next.js のソース一式を docker のイメージに上げてコンテナにて起動を試みたところ、エラーが出て起動ができなくなりました。

事象

Next.js のプロジェクト直下で、npm run dev 等で起動する分にはエラーが起きず、
docker のビルドを実行し、イメージを作成、コンテナでサーバー起動時に以下のようなエラーが起きました。

info  - Loaded env from /.env
Listening on port 3000 url: http://localhost:3000
Error: Cannot find module './api'
Require stack:
- /node_modules/newrelic/index.js
- /.next/server/pages/_document.js
- /node_modules/next/dist/server/require.js
- /node_modules/next/dist/server/next-server.js
- /server.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1134:15)
    at mod._resolveFilename (/node_modules/next/dist/build/webpack/require-hook.js:23:32)
    at Module._load (node:internal/modules/cjs/loader:975:27)
    at Module.require (node:internal/modules/cjs/loader:1225:19)
    at Hook._require.Module.require (/node_modules/require-in-the-middle/index.js:167:34)
    at Hook._require.Module.require (/node_modules/require-in-the-middle/index.js:167:34)
    at Hook._require.Module.require (/node_modules/require-in-the-middle/index.js:167:34)
    at require (node:internal/modules/helpers:177:18)
    at initApi (/node_modules/newrelic/index.js:43:15)
    at initialize (/node_modules/newrelic/index.js:118:23) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/node_modules/newrelic/index.js',
    '/.next/server/pages/_document.js',
    '/node_modules/next/dist/server/require.js',
    '/node_modules/next/dist/server/next-server.js',
    '/server.js'
  ]
}

Error: Cannot find module './api' ん・・?!
作成したイメージ(成果物)のファイル群を探索すると、
node_modules/newrelic/api.jsnode_modules/newrelic/stub_api.js等のファイルがないことに気が付きました。
この事象に関して、ドキュメント等で文献を探してみましたが見当たらず・・

/node_modules/newrelic/index.js等のファイルは存在していて、
そこから node_modules/newrelic/api.js ファイルを読もうとしているので当然エラーになっているという状況です。

解決策

ひとまず、原因は /node_modules/newrelic/index.jsnode_modules/newrelic/api.jsを呼び出しているが、api.js が存在しないこと(ビルド時の成果物にないこと)でした。

Dockerfile にて、ローカルにある./node_modules/newrelic 以下のファイル群をビルド時にコピーするように対策を打つことにしました。

Dockerfile
COPY --from=builder /usr/src/app/node_modules/newrelic ./node_modules/newrelic

これで無事に起動ができることを確認しました。

おわりに

Next.js の New Relic 導入を通してみて、参考となりそうな文献が比較的少ないのかなと感じました。。
今回の記事は構築時に起きた苦労話にフォーカスしましたが、全体を通しての記事、所感等も記事化していければと考えています。

では。

コラボスタイル Developers

Discussion