Lambdaレイヤーの作成と統計解析の実行環境
データ関連処理における主な AWS サービス
- 関数処理(軽量・リアルタイム) → Lambda
- データ前処理 → Glue Brew
- データ分析 → Athena / SageMaker
- フロー制御 → Step Functions
- 可視化・共有 → QuickSight
AWS クラウド上で統計解析を実行する際、小規模な前処理やリアルタイム応答が求められる場合には、Lambda 関数を利用する。具体的には、S3 や API Gateway からのイベントをトリガーとして、軽量なデータ前処理を行いたいケースなどに適している。
Lambdaレイヤー(軽量・リアルタイム)
- データサイズは1レイヤーあたり最大 50MB(解凍後は250MB)
- 50MBを超えるファイルは S3 経由で参照する
- 最大 5レイヤーまで関数に適用できる
- 処理時間は最大15分(Lambda実行時間)
- イベント駆動処理(API Gateway や S3 など)
- 実行環境は ※Amazon Linux ベースであるため、対応する OS 上でビルドすること(Zip)
AWS Lambda では、numpy や scipy などのライブラリはデフォルトで提供されていないため、これらのライブラリを利用する場合には、Lambda レイヤーを各自で作成し、関数に追加する必要があります。
ただし、Lambda レイヤーには制限があり、1レイヤーあたりの解凍後サイズは最大 250MB(50MB×最大5層)に限られています。そのため、pytorch や tensorflow など、容量が大きいライブラリはレイヤーに収めることができず、Lambda での利用は現実的ではない。また、依存関係が複雑なライブラリやシステムレベルのパッケージを含むような処理を行う場合、Lambda 関数では環境構築や管理が煩雑になるケースもあります。
そのような場合には、AWS Fargate(ECS) のようなコンテナベースのサービスを活用することで、より柔軟かつスケーラブルな実行環境を構築できます。Fargate では、Docker イメージを用いて任意のライブラリや環境を自由に組み込むことができるため、管理や保守の負担を大幅に軽減できます。
Lambda レイヤー 作成関数(Docker-compose.yml)
AWS Lambda レイヤーの作成手順について、ローカル環境を汚さないDockerコンテナを利用したLambda レイヤーの作成を目指します。具体的には、Python 3.11 を採用し、NumPy と pandas を含む Lambda レイヤーを構築する docker-compose.yml をメモしています。その際、Lambda の実行環境に合わせた Amazon Linux 2023 の Docker イメージを使用し、コンテナ内で pip install -t を用いて依存ライブラリをインストールします。そして、ZIPファイルとして圧縮することでLambda レイヤーに登録可能なZIP形式にする。このZIPファイルを lambdaレイヤーに追加することで、NumPy や pandasライブラリを含んだ統計解析処理を Lambda上で実行できるようになります。
#ディレクトリ#
mylambda
- Mount_Directory # マウント先ディレクトリ(任意の名)
- docker-compose.yml # Lambdaレイヤー用ZIPファイル作成($docker-compose up --build)
#Docker-compose.yml#
NumPy と pandas を含む Lambda レイヤーを用意する場合
services:
build-layer:
image: amazonlinux:2023 # Amazon Linux ベース
container_name: lambda-layer-builder
volumes:
- ./Mount_Directory:/lambda-layer
working_dir: /lambda-layer
command: >
/bin/bash -c "
dnf update -y &&
dnf install -y python3.11 python3.11-pip zip &&
python3.11 -m pip install --upgrade pip &&
'''' ここのコードを使用するライブラリに書き換える(50MB以内) ''''
python3.11 -m pip install numpy==2.1.1 pandas==2.2.2 --no-cache-dir -t /lambda-layer/python &&
''''
zip -r9 /lambda-layer/layer.zip python"
tty: true
Lambda レイヤー作成のフォーマット
# "$docker-compose up --build"コマンドで実行する(数分かかる)
services:
build-layer:
image: public.ecr.aws/lambda/python:3.XX # AWS公式イメージ
container_name: lambda-layer-builder
volumes:
- ./Mount_Directory:/lambda-layer
working_dir: /lambda-layer
entrypoint: ["/bin/sh", "-c"]
command: |
"yum install -y XXX XXX XXX && \
pip3 install --upgrade pip && \
pip3 install XXX XXX --no-cache-dir -t /lambda-layer/python && \
cd /lambda-layer && \
zip -r9 Lambda-Layer.zip python"
tty: true
- XXX:各自対応するバージョンやライブラリに置き換える
- 作成後のZIPファイルはマウント先ディレクトリに配置される
- AWS公式イメージを利用しないと上手くLamda関数が実行されない場合もあった
Lamdaレイヤー基本手順
- AWS画面:[Lambda]→[その他のリソース/レイヤー]から「レイヤーを作成」する。
- 本記事の関数を使用して用意したZIPファイルをレイヤー設定に適用する。
- Pythonスクリプトを実行する場合、アーキテクチャ(x86_64)&ランタイム(Python3.XX)
- ZIPファイル(250MB)より小さい:直接アップロードできる
- ZIPファイル(250MB)より大きい:AWS S3 に配置してアップロードする
検証用コード(Numpy+Pandas)
# lambda_function.py
import json
import numpy as np
import pandas as pd
def lambda_handler(event, context):
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'score': [90, 80]
})
total = int(df['score'].sum())
return {
'statusCode': 200,
'body': json.dumps({
'sum': total
})
}
正常に機能している場合
{
"statusCode": 200,
"body": "{\"sum\": 170}"
}
やってみて
numpy、pandas、scipy等のライブラリは、Lambda レイヤーの容量制限内に収められた。
そのため、これらライブラリを利用する統計処理用の Python スクリプトをLambda関数で実行するのには有効かもしれない。
ただし、sklearnやpytorchなどのサイズが大きいライブラリには対応できなかった。
そのため、lamdaコンテナイメージを利用するケースが望ましい場合もある(別途記事でメモする)
コメント(一覧)