Lamda関数とコンテナイメージ(#AWS)
Lambda レイヤーは、1レイヤーあたりの解凍後サイズは最大 250MBに限られている。そのため、tensorflow などのサイズが大きいライブラリを使用するPythonスクリプトをlambda関数で扱うには、「コンテナイメージ」 を利用する必要がある。本記事では「コンテナイメージ」 を導入するためには、コマンド操作が必須となるらしいため、それらの手順についてメモしている。
プロジェクト(ディレクトリ構成)
mylamda-container
- Dockerfile :内容設定(カスタムコンテナ)
- requirements.txt :利用するライブラリ(250MB超えてもOK)
- app
- lambda_function.py :実行内容(Pythonスクリプト)
#Dockerfile#
# AWS Lambda専用(Python イメージ)
FROM public.ecr.aws/lambda/python:3.11
# 必要なライブラリ
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
# Lambda 関数のコードをコンテナ側にコピーする
COPY app/ ${LAMBDA_TASK_ROOT}
# ハンドラーを指定する(ファイル名.関数名)
CMD ["lambda_function.lambda_handler"]
#requirements.txt#
# 利用するライブラリ(250MB超えてもOK)
numpy==2.1.1
pandas==2.2.2
matplotlib==3.9.2
japanize-matplotlib==1.1.3
scipy==1.14.1
scikit-learn==1.5.1
#app/lambda_function.py#
import json
import numpy as np
import pandas as pd
from scipy.spatial import distance
'''
(テスト) :タグlatest
250MBを超えるライブラリが扱えているか検証用コード例(numpy+pandas+scipy)
'''
def lambda_handler(event, context):
a = np.array([1, 2, 3])
df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
vec1 = a[:2]
vec2 = df.iloc[0].values
return {
'statusCode': 200,
'body': json.dumps({
'numpy_sum': int(np.sum(a)),
'pandas_shape': df.shape,
'scipy_distance':distance.euclidean(vec1, vec2),
})
}
(Step01)Dockerイメージを作成する
# プロジェクト・ディレクトリに移動する
cd mylamda-container
# イメージファイルを作成する(任意名)
docker build -t mylambda .
(Step02)AWS ECR側でリポジトリを作成する
[Elastic Container Service] → [Amazon ECR] → [リポジトリの作成]※本記事では「myrepository」とする
(Step03)Dockerイメージを「タグ」付けする
docker tag mylambda:latest XXXXXXXXXXXX.dkr.ecr..amazonaws.com/mylambda:latest
- mylambda : Dockerイメージ(Step01)
- latest : ※タグ管理
- XXXXXXXXXXXX : AWSアカウントID(12桁)
- : 東京リージョン(ap-northeast-1)
※「同じベースイメージ+ライブラリ構成」は共通だが、実行関数だけ異なる場合に有効である。
→ タグでイメージを区別し、Lambda関数で必要なタグを指定する。(例: v1, v2, latestなど)
→ これによって AWS ECRリポジトリを無駄に増やすことを回避することができる。
(Step04)AWS ECR にログインする
# AWS ECR ログイン(コマンド操作#決まり文句)
aws ecr get-login-password --region | docker login --username AWS --password-stdin XXXXXXXXXXXX.dkr.ecr..amazonaws.com
- XXXXXXXXXXXX : AWSアカウントID(12桁)
- : 東京リージョン(ap-northeast-1)
(Step05)AWS ECR側にDockerイメージをプッシュする
docker push XXXXXXXXXXXX.dkr.ecr..amazonaws.com/myrepository:latest
- XXXXXXXXXXXX : AWSアカウントID(12桁)
- : 東京リージョン(ap-northeast-1)
- myrepository: AWS ECR側で作成したリポジトリ名
- latest : ※タグ管理
(Step06)Lambda関数を作成する(コンテナイメージ)
「コンテナイメージ」を選択したlambda関数は、AWS画面から関数の「コードプレビュー」を利用できない。そのため、関数の編集や検証はローカル環境で行い、動作確認を済ませたうえでコンテナイメージを作成・プッシュ等の本記事メモの作業をする必要がある。
また、ライブラリや依存環境は共通だが、実行関数の処理内容だけが異なる場合には、同一の AWS ECRリポジトリに対して、※タグ管理を活用することによって、ステージングや本番環境への切り替え等のイメージ管理を効率化することに繋がる。
総括
コンテナイメージ型の Lambda 関数は高い柔軟性を持つ一方で、従来型の Zip デプロイ方式とは異なる運用方法を確認することができた。効率的な管理を実現するには、ローカル側での検証体制を整備することが大切になるのかな?
コメント(一覧)