とある用途で日本語文字列→読みがなの変換処理が必要となったので、AWS Lambda で動作する関数を作成しました。ひらがなに変換する処理で MeCab を、ひらがなからローマ字に変換する処理で KAKASI を使います。KAKASI にもひらがな変換の機能は有りますが、今回の用途では MeCab の方が精度が良かったため、こういう構成となりました。
Python であれば mecab-python3 と pykakasi を使えばプログラムから呼び出せるので、Lambda レイヤーで mecab-python3, pykakasi の環境を作って Lambda 関数で呼び出すようにします。
mecab-python3, pykakasi がインストールされたディレクトリを zip ファイルにまとめてから Lambda コンソールにアップロードします。Lambda は内部的には Amazon Linux 2023 なので、一旦別の Amazon Linux 2023 環境で mecab-python3, pykakasi をインストールしてから zip ファイルを作ります。Amazon Linux 2023 を利用できる環境としては EC2, Docker イメージ, AWS Cloud9 などがありますが、今回は Docker イメージでやりました。
Lambda のランタイムとしては python3.12 も使えますが、Amazon Linux 2023 でパッケージインストールできる python3.11 を採用しました。
$ mkdir mecab-kakasi-python3.11
$ cd mecab-kakasi-python3.11
$ mkdir layers
$ vi Dockerfile
$ vi docker-compose.yml
$ vi laysers/requirements.txt
Dockerfile
FROM amazonlinux:2023
RUN dnf install -y zip python3.11
RUN dnf install -y python3.11-pip
RUN curl https://bootstrap.pypa.io/get-pip.py -o /tmp/get-pip.py
RUN python3 /tmp/get-pip.py
RUN pip3 install setuptools
RUN mkdir /home/layers
RUN mkdir /home/python
docker-compose.yml
version: '3'
services:
aws-lambda-layers:
build: .
volumes:
- './layers:/home/layers'
working_dir: '/home/'
command: sh -c "python3.11 -m pip install -r layers/requirements.txt -t python/ && zip -r layers/file.zip python/"
requirements.txt
boto3==1.34.54
mecab-python3==1.0.8
ipadic==1.0.0
pykakasi==2.2.1
Docker コンテナ上で上記の設定ファイルを使って環境構築します。
$ sudo docker compose build
$ sudo docker compose up
layers/file.zip が作られたことを確認します。
$ unzip -l layers/file.zip |head
Archive: layers/file.zip
Length Date Time Name
--------- ---------- ----- ----
0 2024-03-03 16:10 python/
0 2024-03-03 16:10 python/boto3-1.34.54.dist-info/
10174 2024-03-03 16:10 python/boto3-1.34.54.dist-info/LICENSE
7546 2024-03-03 16:10 python/boto3-1.34.54.dist-info/RECORD
6620 2024-03-03 16:10 python/boto3-1.34.54.dist-info/METADATA
4 2024-03-03 16:10 python/boto3-1.34.54.dist-info/INSTALLER
92 2024-03-03 16:10 python/boto3-1.34.54.dist-info/WHEEL
file.zip を S3 にアップロード(約30MBあって Lambda コンソールで直接アップロードできないため)してから Lambda レイヤーを作成します。
Lambda コンソール > レイヤー > レイヤーの作成
- 名前: mecab-kakasi
- Amazon S3 のリンク URL: アップロードした先の URL
- ランタイム: python3.11
Lambda コンソール > Lambda 関数 > 関数の作成
- 一から作成
- 関数名: hiragana_roman
- ランタイム: python3.11
- アーキテクチャ: x86_64
import json
import MeCab
import ipadic
import pykakasi
def lambda_handler(event, context):
mecab = MeCab.Tagger(f'-Oyomi {ipadic.MECAB_ARGS}')
kks = pykakasi.kakasi()
return {
'statusCode': 200,
'body': kks.convert(mecab.parse(event['src']).rstrip())
}
テスト用のイベントJSONとテスト実行結果です。
{
"statusCode": 200,
"mecab": "SPLOUT カブシキガイシャ\n",
"body": [
{
"orig": "SPLOUT",
"hira": "SPLOUT",
"kana": "SPLOUT",
"hepburn": "SPLOUT",
"kunrei": "SPLOUT",
"passport": "SPLOUT"
},
{
"orig": "カブシキガイシャ",
"hira": "かぶしきがいしゃ",
"kana": "カブシキガイシャ",
"hepburn": "kabushikigaisha",
"kunrei": "kabusikigaisya",
"passport": "kabushikigaisha"
}
}