質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

LambdaでMecabを実装したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 626

aizai2

score 4

前提・実現したいこと

以下のサイトを参考にLambdaでMecabを動かしたいのですが、上手くいきません。
https://qiita.com/rtaguchi/items/e6cb594196fa8186e9a2
https://dev.classmethod.jp/cloud/aws-lambda-with-mecab/
https://github.com/KunihikoKido/docs/blob/8608849b1abfce67dbb4d97eddac50e0d85570d0/_posts/2016-02-12-aws-lambda-with-mecab-improved.md

手順としては以下の順番でMecabパッケージを作り、Lambdaにアップロードしましたが、import Mecabでエラーが起きてしまいます。

(1)Amazon SageMakerのターミナルを使って(Amazon Linux)、Mecab、IPA辞書、mecab-python-3をインストール。インストール先のフォルダは、/var/taskとしています。

フォルダ作成

sudo mkdir task
cd ~
sudo ln -s /usr/libexec/gcc/x86_64-amazon-linux/4.8.5/cc1plus /usr/local/bin/

MeCabのダウンロードとビルド

curl -L "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE" -o mecab-0.996.tar.gz
tar -zxvf mecab-0.996.tar.gz
cd mecab-0.996
sudo ./configure --prefix=/var/task --with-charset=utf8
sudo make
sudo make install

IPA辞書のダウンロードとビルド

cd ~
curl -L "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM" -o mecab-ipadic-2.7.0-20070801.tar.gz
tar -zxvf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
sudo ./configure --prefix=/var/task --with-charset=utf8 --with-mecab-config=/var/task/bin/mecab-config
sudo make
sudo make install

mecab-python-3のインストール

cd ~
sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
sudo yum makecache
sudo yum -y install mecab-devel


mkdir temp
cd temp

pip install mecab-python3 -t .

sudo mv ./* /var/task

(2)1のパックをZipで圧縮して一旦ローカルに落とし、Pycharmで書いたlambda_function.py、settings.py、local_settings.pyとまとめて再度Zipファイルを作成。

zip /home/ec2-user/mecabpack -r var/task

ローカル環境でZip化したフォルダ構成
lambda_function.py
settings.py
local_settings.py
var
└task

taskの下
pycache
├bin
├etc
├include
├lib
├libexec
├mecab_python3-0.996.1.dist-info
└share

mecabrcに記述されている内容
⇒dicdir =  /var/task/lib/mecab/dic/ipadic

(3)2をS3にアップロードした上でLambda関数を作成し、S3からZipファイルを解凍・コード生成。

ランタイム:Python3.6(後はディフォルトの設定をそのまま利用)

(4)この状態でコンパイルできるかテストをしたところ、エラーが発生。import mecabで問題が起きてしまいます。

発生している問題・エラーメッセージ

START RequestId: 53a16fbc-63de-40c3-b636-08d1090f639f Version: $LATEST
Unable to import module 'lambda_function': No module named 'MeCab'

END RequestId: 53a16fbc-63de-40c3-b636-08d1090f639f
REPORT RequestId: 53a16fbc-63de-40c3-b636-08d1090f639f    Duration: 0.45 ms    Billed Duration: 100 ms     Memory Size: 128 MB    Max Memory Used: 57 MB    

該当のソースコード

##lambda_function.py
# coding=utf-8
import os
import settings

import json

import logging
logger = logging.getLogger(__name__)
logger.setLevel(settings.LOG_LEVEL)

# preload libmecab
import ctypes
libdir = os.path.join(os.getcwd(), './var/task/lib')
libmecab = ctypes.cdll.LoadLibrary(os.path.join(libdir, 'libmecab.so'))

import MeCab


def lambda_handler(event, context):
    slack_comment = '金曜日は中華屋で台湾ラーメン&ミニチャーハン '
    return {"slack_comment": slack_comment}
## settings.py
import logging

DEBUG = False

LOG_LEVEL = logging.INFO

try:
  from local_settings import *
except ImportError:
  pass
## local_settings.py
import logging

DEBUG = True

LOG_LEVEL = logging.DEBUG

試したこと

次の3つのどれかに問題があると考え、それぞれ対応を試みました。

①Mecabパッケージのフォルダ構成
フォルダ構成に問題があるのではないかと考え、/var/task以外に/var/task/mecabや/home/ec2-user/var/taskなどのパターンも作成しましたが、結果は同じでした。

②Python3のバインディング
当初はmecab-python-3のインストールでmecab-configが見つからないというエラーが起きました。仕方なくsetup.pyファイルを書き換えて対応しましたが、Groongaリポジトリを導入するとimport mecab-python-3でエラーが起きなくなりました(ただ、どちらにしてもLambdaでは動きません)。

③import mecabのサブプロセス化
lambda_function.pyでimport mecabをするのではなく、サブプロセス内(tokenizer.py)でmecabを呼び出してみましたが、結果は同じでNo module named 'MeCab'とのエラーが発生します。

呼び出し方に問題があるのか、呼ばれる方の構造に問題があるのか、全く分からなくなってしまいました。どなたか知見のある方のアドバイスをお待ちしております。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • t_obara

    2019/03/01 19:26

    この手の問題はきちんと再現できる手順を記載していただかないと、なかなか解決には結びつかないと思いますよ。ちょっとした手順の違いで問題が発生する可能性もありますので。

    キャンセル

  • aizai2

    2019/03/01 20:39

    ご指摘ありがとうございます。具体的なコマンドなども追記させて頂きました。

    キャンセル

回答 1

check解決した方法

0

自己解決しました。Zipフォルダの構成に問題があったようです。

Lambdaの環境は/var/taskで動いているようですが、ここにvar/task/~のフォルダ構成で作ったMecabパックを置いたのが問題でした(/var/task/var/taskとなってw)。Zipファイル作成には気を付けないと・・。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる