Lambda 関数はコンテナイメージをパッケージ化してデプロイできるため、やってみました。
以下ドキュメントの AWS ベースイメージからのイメージの作成を参考にしています。
Lambda のコンテナイメージを使用する - AWS Lambda
AWS により提供されたベースイメージまたは代替のベースイメージを使用して、Lambda 関数のコンテナイメージを作成します。
Dockerイメージの準備
まず、LambdaのハンドラーコードやDockerfileを格納するディレクトリを作成し、移動します。
mkdir app
cd app
app ディレクトリ以下に、ハンドラーコードである app.py を作成します。
import json
def handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
次に、Dockerfileを作成します。
FROM public.ecr.aws/lambda/python:3.9
# 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" ]
requirements.txt を作成します(ハンドラーコードではrequestを利用していないため、意味はありません)。
requests
Dokcerイメージを作成・起動し、コンテナイメージで実行されている関数を呼び出します。
docker build -t hello-world .
docker run -p 9000:8080 hello-world
新たにターミナルを起動し、以下を実行します。
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
{"statusCode": 200, "body": "\"Hello from Lambda!\""}%
無事に関数が実行されていることがわかりました。
DockerイメージをECRにプッシュ
ECR に Docker CLI を認証します。
aws ecr get-login-password | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
次に、ECR リポジトリを作成します。
aws ecr create-repository --repository-name hello-world --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
最後に、Dockerイメージを ECRにプッシュします。
docker tag hello-world:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/hello-world:latest
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/hello-world:latest
Lambda関数を作成
コンテナイメージを選択し、Lambda関数を作成します。

テストを実行し、無事 Lambda 関数が実行されることを確認できました。
