イメージを作成する
以下のドキュメントを参考に Dockerfile を作成します。
Dockerfile
FROM public.ecr.aws/lambda/python:3.8
# Copy function code
COPY app.py ${LAMBDA_TASK_ROOT}
# Install the function's dependencies using file requirements.txt
# from your project folder.
COPY requirements.txt .
RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"
# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.handler" ]
LAMBDA_TASK_ROOT
を定義します。
export LAMBDA_TASK_ROOT=/var/task
CMD
で指定している python スクリプトを作成します。トップレベルコードには引数が 2 つ必要です。
app.py
import boto3
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
def draw_image():
# グラフを作成し、/tmp ディレクトリに保存する
x = np.arange(-5, 5, 0.1)
y = np.sin(x)
plt.plot(x, y)
image_file = '/tmp/sin_curve.png'
plt.savefig(image_file)
# アップロード先バケット、アップロード先オブジェクト名を指定する
bucket = 'python-lambda-bucket'
object_name = 'sin_curve.png'
# ファイルをアップロードする
client = boto3.client('s3')
client.upload_file(image_file, bucket, object_name)
def handler(event, lambda_context):
# Dockerfile で CMD ["app.handler"] と記述しているので、ここがトップレベルコード
draw_image()
上記の matplotlib を使用したグラフの作成方法は以下を参考にしました。
依存パッケージ用に requirements.txt を作成します。
requirements.txt
matplotlib
ECR にイメージをプッシュする
以下を実行します。
# ECR にログイン
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ${ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com
# ビルド
docker build -t python-lambda-image .
# タグ付け
docker tag python-lambda-image:latest ${ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/python-lambda-image:latest
# イメージプッシュ
docker push ${ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/python-lambda-image:latest
Lambda 関数を作成・実行する
関数のオプションはコンテナイメージを選択し、Lambda 関数を作成します。イメージをプッシュするごとに、以下の「新しいイメージをデプロイ」を行う必要があります。
作成後、「テスト」タブからテストを行い、指定した S3 バケットに画像ファイルが格納されることを確認します。
以下はテスト実行時のログになります。
テスト実行後、以下のようにバケットにオブジェクトが格納されます。
参考記事