Lamda関数とコンテナイメージ(#AWS)

<タイトル> Lamda関数とコンテナイメージ(#AWS)

2025年06月20日 2025年07月28日 カテゴリ: python

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 デプロイ方式とは異なる運用方法を確認することができた。効率的な管理を実現するには、ローカル側での検証体制を整備することが大切になるのかな?



コメント(一覧)

コメント(入力画面)

空港MAP(#WIKI)
※現在の時刻 週間天気予報 (東京)
バックナンバー(年別)