AWS Lambda で読みがな変換関数を作成する

とある用途で日本語文字列→読みがなの変換処理が必要となったので、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とテスト実行結果です。

{ "src": "SPLOUT株式会社" }
{
  "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"
    }
}
Related Post