これは ZOZO Advent Calendar 2022 カレンダー1の10日目の記事です。
はじめに
AWS Lambdaでは各言語のランタイムが提供されており、ランタイムのサポートがある言語に関しては実行したいコードをアップロードするだけで簡単にクラウド上で実行することができます。
このようにクラウド上で実行できる一方、ランタイムのサポート期限が切れる前にバージョンアップ対応が必要であったり、コードをアップロードするためのコンパイルやライブラリのダウンロードといった事前処理に時間がかかってしまうケースもあります。
そこで今回はLambdaにアップロードするコードをコンテナイメージ化し、Lambda上で実行できるまでを紹介します。
前提条件
今回は以下の環境でLambdaへコンテナイメージをデプロイできるようにします。
- 言語: Python3.9
- パッケージ管理ツール: Poetry
- Serverless Framework v2.41.0
- コードはappディレクトリ以下に配置
Serverless FrameworkでLambdaにコンテナイメージをデプロイする
まずはLambdaで実行するコンテナイメージを準備します。
# builder
FROM python:3.9-slim-buster as builder
RUN apt-get update \
&& apt-get install -y build-essential swig mecab libmecab-dev mecab-ipadic-utf8 \
&& pip install poetry Cython
WORKDIR /work/src
COPY pyproject.toml poetry.lock ./
RUN mkdir build \
&& poetry export --without-hashes -f requirements.txt --output requirements.txt \
&& pip install -q -t build -r requirements.txt
# executor
FROM public.ecr.aws/lambda/python:3.9 as executor
COPY app ${LAMBDA_TASK_ROOT}/app
COPY --from=builder /work/src/build ${LAMBDA_TASK_ROOT}
マルチステージビルドでPoetryで管理されたパッケージをビルドしつつ、AWSが提供しているLambda実行用のコンテナイメージにapp以下のファイルとビルドしたパッケージ群をCOPYするシンプルなDockerfileとなります。
次にServerless Frameworkの設定ファイルでコンテナイメージのビルド設定を行います。
provider:
ecr:
images:
containerImageApp:
path: ./
ビルド設定はprovider.ecr
以下に記述するだけです。この記述によってコンテナイメージのPush先となるECR作成からコンテナイメージのビルド・プッシュまで自動で行ってくれます。
images
以下はコンテナイメージ名を任意で指定します。今回の場合はcontainerImageApp
という名前にしています。
path
はDokcerImageの配置しているディレクトリを指定します。今回の場合はServerless Frameworkの設定ファイルと同階層にDockerfileを配置しているため、 ./
を指定しています。
次はLambda関数の設定になります。
functions:
LambdaContainerTest01Handler:
# handler: app.handler.lambda_container_test_01_handler
image:
name: containerImageApp
command:
- app.handler.lambda_container_test_01_handler
name: lambda-container-test-01-handler
description: Lambdaコンテナイメージテスト関数1
LambdaContainerTest02Handler:
# handler: app.handler.lambda_container_test_02_handler
image:
name: containerImageApp
command:
- app.handler.lambda_container_test_02_handler
name: lambda-container-test-02-handler
description: Lambdaコンテナイメージテスト関数2
Lambda関数の設定は通常handler
に起動したい関数名を指定しますが、コンテナイメージを起動する場合はimage
以下に起動したいコンテナイメージ名を指定します。
コンテナイメージのビルド設定ではcontainerImageApp
という名前をつけたため、その名前を記載します。
また、command
で起動する関数名を指定することで、1つのコンテナイメージで複数のLambda関数を実行できるようにします。
おわりに
以上、簡単ではありますがServerless Frameworkでコンテナイメージを作ってLambdaを動かすところまでやってみました。
Serverless Frameworkを使えば簡単にコンテナイメージをLambdaで動かすことが可能ですので、コンテナイメージをLambdaで動かそうと思っている方はぜひServerless Frameworkを使ってみてください!