はじめに (対象読者・この記事でわかること)

本記事は、Windows でローカル開発を行っているエンジニアや、Node.js アプリに形態素解析エンジン MeCab を組み込み、Heroku へデプロイしたい方を対象としています。
この記事を読むことで、以下のことができるようになります。

  • Windows 環境で MeCab をビルドする方法と、必要な依存ライブラリの取得手順
  • Heroku のビルドパックや Dockerfile を利用した MeCab の組み込み方
  • デプロイ時に頻出するエラーとその具体的な対処法

背景や動機として、ローカルで動作確認はできても、Heroku に移行した際に「ライブラリが見つからない」や「バイナリ形式が合わない」などの壁にぶつかるケースが多く報告されているため、実践的な解決策をまとめました。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。

  • Node.js(v14 以上)と npm の基本的な使い方
  • Git と Heroku CLI の基本操作
  • 基本的な Linux シェルコマンド(curl, tar, make など)

MeCab と Heroku の概要、そして Windows 環境で直面する課題

MeCab は日本語の形態素解析エンジンで、C++ で実装された高速なコアライブラリと、辞書データ(IPA 辞書や NEologd など)から構成されます。ローカル環境(特に Windows)では、公式サイトが提供するインストーラや、mecab-ipadic-utf8 のバイナリを利用すれば簡単にインストールできますが、Heroku のような Linux ベースのプラットフォームへ持ち込む際にはいくつかの障壁があります。

  1. バイナリ互換性の問題
    Windows 用にビルドされた MeCab のバイナリは ELF 形式ではなく PE 形式です。そのため、そのまま Heroku の dyno に配置しても実行できません。

  2. 辞書ファイルのサイズ制限
    Heroku の slug サイズは最大 500 MB で、辞書データ(特に NEologd)は 100 MB 前後になることがあります。サイズが大きすぎると slug が超過し、デプロイが失敗します。

  3. ビルド時の依存関係
    MeCab のビルドには libmecab-devpkg-configmakegcc などの開発ツールが必要です。Heroku の標準ビルド環境にはこれらが含まれていないため、カスタムビルドパックや Docker コンテナを用意する必要があります。

以上の課題を踏まえて、Windows 開発者が Heroku に MeCab を持ち込むための具体的な手順と、実運用で遭遇しやすいエラーの対処法を以下に示します。

Windows 開発環境から Heroku へ MeCab をデプロイする具体的手順

ステップ 1:ローカルで MeCab と辞書をビルド(Linux 環境をシミュレート)

Windows でも Linux バイナリを取得できるように、WSL2(Windows Subsystem for Linux) を利用します。WSL2 上で Ubuntu 20.04 を立ち上げ、以下のコマンドで MeCab と辞書をビルドします。

Bash
# WSL2 の Ubuntu に入る wsl # 必要パッケージのインストール sudo apt update && sudo apt install -y build-essential mecab libmecab-dev git curl # MeCab の最新版を取得 git clone https://github.com/taku910/mecab.git cd mecab/mecab ./configure --enable-utf8-only make && sudo make install # 辞書(IPA 辞書)を取得してビルド cd ../mecab-ipadic ./configure --with-charset=utf8 make && sudo make install # 任意で NEologd を取得(辞書サイズが大きくなる点に注意) git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git cd mecab-ipadic-neologd ./bin/install-mecab-ipadic-neologd -n -y

ビルドが完了すると、/usr/local/lib/libmecab.so と辞書ファイル(デフォルトは /usr/local/lib/mecab/dic/ipadic もしくは NEologd のパス)が生成されます。次に、これらのファイルを Heroku 用にパッケージ化します。

ファイルの抽出と整理

Bash
# 作業ディレクトリを作成 mkdir -p ~/heroku-mecab/lib mkdir -p ~/heroku-mecab/dic # 必要なバイナリと辞書だけをコピー cp /usr/local/lib/libmecab.so ~/heroku-mecab/lib/ cp -r /usr/local/lib/mecab/dic/ipadic ~/heroku-mecab/dic/ # NEologd を使う場合 cp -r /usr/local/lib/mecab/dic/mecab-ipadic-neologd ~/heroku-mecab/dic/

この段階で heroku-mecab ディレクトリ以下に以下の構造ができています。

heroku-mecab/
├─ lib/
│   └─ libmecab.so
└─ dic/
    ├─ ipadic/
    └─ mecab-ipadic-neologd/

ステップ 2:Heroku 用のビルドパックまたは Dockerfile を作成

方法 A: カスタムビルドパック

Heroku の公式ビルドパックは heroku-buildpack-apt が便利です。Aptfile に必要なパッケージ(libmecab2 等)を記述し、ビルドしたバイナリを slug に含めます。

  1. Aptfile の作成(プロジェクトルートに配置)
libmecab2
  1. .profile.d スクリプトでライブラリロードパスを設定
    bin/loader.sh(実行権限付与)を作成し、lib ディレクトリを LD_LIBRARY_PATH に追加します。
Bash
#!/bin/bash export LD_LIBRARY_PATH=$HOME/heroku-mecab/lib:$LD_LIBRARY_PATH export MECAB_DICDIR=$HOME/heroku-mecab/dic/ipadic # NEologd を使うなら mecab-ipadic-neologd に変更
  1. heroku.yml(Heroku Container Registry 用) は不要ですが、app.jsonbuildpacks を列挙します。
Json
{ "name": "mecab-heroku-app", "description": "Node.js + MeCab on Heroku", "buildpacks": [ { "url": "heroku/heroku-buildpack-apt" }, { "url": "heroku/nodejs" } ] }
  1. package.json にスクリプトを追加(起動時にロードスクリプトを呼び出す)。
Json
"scripts": { "start": "sh ./bin/loader.sh && node index.js" }
  1. 作成した heroku-mecab ディレクトリをリポジトリにコミットし、Heroku にプッシュ。
Bash
git add heroku-mecab bin/loader.sh app.json package.json git commit -m "Add MeCab binaries for Heroku" git push heroku main

方法 B: Dockerfile を使う(Heroku Container Registry 推奨)

Dockerfile で Ubuntu ベースのイメージに MeCab と辞書をインストールし、Node.js アプリを走らせます。

Dockerfile
# ベースイメージ FROM node:18-bullseye-slim # 必要ツールのインストール RUN apt-get update && apt-get install -y \ build-essential \ mecab libmecab-dev \ mecab-ipadic-utf8 \ git curl \ && rm -rf /var/lib/apt/lists/* # MeCab と NEologd のビルド(省略可:既にローカルでビルドしたものを COPY でも可) RUN git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git /tmp/neologd && \ /tmp/neologd/bin/install-mecab-ipadic-neologd -n -y && \ rm -rf /tmp/neologd # アプリケーションコードをコピー WORKDIR /app COPY package*.json ./ RUN npm ci --production COPY . . # 環境変数設定 ENV MECAB_DICDIR=/usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd ENV LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu # 起動 CMD ["node", "index.js"]

Dockerfile をリポジトリに置き、以下の手順で Heroku にデプロイします。

Bash
heroku login heroku container:login heroku create mecab-demo git push heroku main # まずはコードだけプッシュ heroku container:push web --app mecab-demo heroku container:release web --app mecab-demo heroku open --app mecab-demo

ハマった点やエラー解決

エラー 1:Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds

  • 原因:Node.js アプリが MeCab のロードに失敗し、process.exit(1) が走っている。
  • 解決策LD_LIBRARY_PATH が正しく設定されていないケースが多い。bin/loader.shexport LD_LIBRARY_PATH=$HOME/heroku-mecab/lib:$LD_LIBRARY_PATH を確実に実行するか、Dockerfile で ENV LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu を追加する。

エラー 2:ImportError: libmecab.so.2: cannot open shared object file: No such file or directory

  • 原因:MeCab のバイナリが slug に含まれていない、またはパスが間違っている。
  • 解決策heroku-mecab/lib/libmecab.so が正しくコミットされたか確認し、git ls-files | grep libmecab.so で存在をチェック。さらに、npm install mecab-async 等の Node ラッパーが require('mecab-async') 前に process.env.LD_LIBRARY_PATH を設定するコードを追加。

エラー 3:slug サイズ超過(500 MB 超過)

  • 原因:NEologd 辞書が大型(約 100 MB)だけでなく、ビルドツールや不要なファイルも含めて slug が肥大化している。
  • 解決策heroku.ymlbuild セクションで --strip オプションを使い、libmecab.so のシンボル情報を除去。docker runstrip /app/heroku-mecab/lib/libmecab.so を実行する。さらに、git rm -r --cached heroku-mecab/**/*.o などでオブジェクトファイルを除外。

エラー 4:mecab: command not found

  • 原因:CLI が PATH に登録されていない。
  • 解決策:Dockerfile で RUN ln -s /usr/bin/mecab /usr/local/bin/mecab を追加、または bin/loader.shexport PATH=$HOME/heroku-mecab/bin:$PATH を入れる。

解決策の総括

  1. Linux 環境でビルド:WSL2 や CI (GitHub Actions) を活用し、Heroku と同一環境で MeCab と辞書をビルド。
  2. バイナリと辞書を slug に同梱heroku-mecab ディレクトリ構造で管理し、LD_LIBRARY_PATHMECAB_DICDIR を明示的に設定。
  3. カスタムビルドパックか Dockerfile を選択:シンプルな Node.js アプリならビルドパック、複数言語や高度な依存関係がある場合は Docker が安全。
  4. エラーはパス・サイズ・権限が主因LD_LIBRARY_PATHMECAB_DICDIR、slug サイズの最適化を常に確認する。

まとめ

本記事では、Windows でローカル開発した MeCab を Heroku の Linux 環境へ正しくデプロイする手順 と、実装時に頻出するエラーとその対処法を体系的に解説しました。

  • バイナリ互換性の壁は WSL2 または Docker で Linux ビルドを行うことで回避できる
  • 辞書サイズ超過は不要ファイルの除去と strip によるサイズ削減で解決できる
  • 環境変数(LD_LIBRARY_PATH, MECAB_DICDIR)の設定ミスが最も多く、起動スクリプトで一元管理すると安全

これらを実践すれば、Windows 開発者でも Heroku 上で高速かつ正確な形態素解析サービスを提供できるようになります。次回は、Heroku のスケーリングとログ監視を組み合わせた本番運用ノウハウについて解説する予定です。

参考資料