node:19.5.0-alpine3.16
のイメージをECRにプッシュした後、ECRのタスクにそのイメージをデプロイしたところ次のエラーが発生しました。
確認にはtracerコマンドを使用しています。
2023-01-28T12:40:45.379+09:00 /scripts/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessagePort.js:19
2023-01-28T12:40:45.379+09:00 closedError = new RpcIpcMessagePortClosedError_1.RpcIpcMessagePortClosedError(code ^
2023-01-28T12:40:45.379+09:00 RpcIpcMessagePortClosedError: Process 37 exited [SIGKILL].
20ipts/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessagePort.js:19:23
ローカル環境では問題無く動作していたのに、ECSではなぜか上手く動作しない状況でした。
結論
エラー文で調べたところ記事が出て、nodeのバージョン上げれば解決するという記載があったので、コンテナイメージを最新にしてみましたがダメでした。
https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/issues/674
次にRpcIpcMessagePort.js
で検索したところ下記記事が見つかりました。
https://stackoverflow.com/questions/72622773/how-can-be-fixed-react-scripts-build-error
どうやらメモリが足りない場合にこのエラーが出るそうです。
試しにECSのメモリを512MBから2G(2048MB)にしてみたところ上手くデプロイできるようになりました。
ECSのメモリはCPUの大きさと合わせる必要があります。
対応表はマニュアルに記載されています。
Dockerfile
今回ECSにデプロイしたDockerfileを記載しています。
# Dockerfile
# debianのコンテナ(bullseye, slim等)だとcodeデプロイでエラーになるのでalpineを使用
FROM node:19.5.0-alpine3.16
# FROM node:19-bullseye
# 静的コンテンツを配信するシンプルな http サーバをインストールする
RUN npm install -g http-server
# カレントワーキングディレクトリとして 'app' フォルダを指定する
WORKDIR /app
# `package.json` と `package-lock.json` (あれば)を両方コピーする
COPY package*.json ./
# プロジェクトの依存ライブラリをインストールする
RUN npm install
# カレントワーキングディレクトリ(つまり 'app' フォルダ)にプロジェクトのファイルやフォルダをコピーする
COPY . .
# 本番向けに圧縮しながらアプリケーションをビルドする(ここが足りていなかった)
RUN npm run build
EXPOSE 8080
ENV HOST 0.0.0.0
CMD [ "http-server", "dist" ]
ローカルでは下記コマンドでvueのスタート画面が起動する状態でした。
docker build -t test -f ./docker/Dockerfile .
docker run -it -p 8080:8080 test
RPCとIPC
RpcIpcMessagePort.js
のRpc
とIpc
が何者か調べてみました。
RPC
RPCとは「遠隔手続き呼出し」のこと。(remote procedure call)
プログラムから別のアドレス空間(通常、共有ネットワーク上の別のコンピュータ上)にあるサブルーチンや手続きを実行することを可能にする技術。その際に遠隔相互作用の詳細を明示的にコーディングする必要がない。(引用)
IPC
IPCとはプロセス間通信のこと(InterProcess Communication)
コンピュータ上で実行中のプログラムの間でデータをやり取りするための仕組み。あるプログラムから別のプログラムへデータやメッセージを通知したり、データの提供依頼や処理依頼を行ったり、依頼に対する結果を返したりすることができる。(引用)