プライム・ストラテジー「KUSANAGI」開発チームの謝です。
最近、AWS LambdaではDockerコンテナイメージを使用して関数をデプロイすることも可能となりました。この機能を利用すれば、より柔軟な環境をLambdaで実現することが出来ます。今回はその構築方法を紹介します。
概要
今回のプロセスは以下のステップが含まれます:
- Dockerfileの作成: Pythonランタイムと必要な拡張を含むDockerイメージを作成。
- コンテナイメージのビルド: Dockerfileを利用してイメージをビルド。
- ECRへのプッシュ: Amazon ECRにプッシュ。
- Lambda関数の作成: ECRにアップロードされたイメージを使ってLambda関数を作成。
- Lambda関数のテスト: 関数を実行して動作を確認。
今回の操作はLinux(Alamlinux8)上で行っているので、全操作はコマンドで行います。
前提条件
AWS CLI、Dockerがインストールされていること、それぞれのインストール方法は公式サイトにて確認してください。
コンテナイメージをAWS Lambda関数にデプロイ
Dockerfileの作成
プロジェクト用フォルダを作成し、そのフォルダに切り替え
mkdir lambda-container
cd lambda-container/
Dockerfileを作成します。これはLambdaがサポートするPythonのランタイム環境を含むコンテナイメージを構築するためのものです。
このDockerfileでは、まず公式のLambda Pythonランタイムベースイメージを使用しています。
FROM public.ecr.aws/lambda/python:3.12
# app.py を {LAMBDA_TASK_ROOT} にコピーしています。
COPY app.py ${LAMBDA_TASK_ROOT}
# Lambda 関数ハンドラーに設定します。
CMD ["app.handler"]
{LAMBDA_TASK_ROOT}はLambdaで定義されたランタイム環境変数です。
上記に利用しているapp.pyを作成します。
import sys
def handler(event, context):
return 'AWS Lambda using Python ' + sys.version + '!'
コンテナイメージのビルド
ビルドコマンドを使用して、ローカルでDockerイメージを作成します。
docker build --platform linux/amd64 -t docker-image:lambda .
このイメージをテストするには、AWS SAM CLIを使用するか、直接Dockerで実行することができます。
docker run --platform linux/amd64 -p 9000:8080 docker-image:lambda
そして、以下のコマンドを新しいターミナルで実行して、ローカルのLambda関数にリクエストを送信します。
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
こちらのような結果「”AWS Lambda using Python 3.12.2 (main, Mar 15 2024, 11:05:00) [GCC 11.4.1 20230605 (Red Hat 11.4.1-2)]!”」が表示されたら、成功です。
ECRへのプッシュ
AWSにデプロイする前に、イメージをAmazon ECRにプッシュする必要があります。以下はそのステップです。
ECRリポジトリの作成 。
aws ecr create-repository --repository-name my-lambda-repo --region ap-northeast-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
成功すると、次のようなレスポンスが表示されます。
{
"repository": {
"repositoryArn": "arn:aws:ecr:ap-northeast-1:123456789012:repository/my-lambda-repo",
"registryId": "123456789012",
"repositoryName": "my-lambda-repo",
"repositoryUri": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-lambda-repo",
"createdAt": "2024-05-09T18:50:55.505000+09:00",
"imageTagMutability": "MUTABLE",
"imageScanningConfiguration": {
"scanOnPush": true
},
"encryptionConfiguration": {
"encryptionType": "AES256"
}
「123456789012」の部分は自分のアカウントIDになります。
Dockerにログイン 。
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
DockerイメージをECRにプッシュ。
docker tag docker-image:lambda 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-lambda-repo:latest
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-lambda-repo:latest
Lambda関数の作成
新しいLambda関数を作成し、コンテナイメージを指定、Lambda関数作成権限がなかったら、「実行ロールの作成」を実行してください。
aws lambda create-function \
--function-name my-lambda-func \
--package-type Image \
--code ImageUri=123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-lambda-repo:latest \
--role arn:aws:iam::123456789012:role/lambda-ex
Lambda関数のテスト
設定が完了したら、下記のコマンドで実際にLambda関数を実行して、期待通りに動作するかテストします。
aws lambda invoke --function-name my-lambda-func response.json && cat response.json
下記のようなメッセージが表示されたら、AWS Lambda関数にデプロイ成功です。
{
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
"AWS Lambda using Python 3.12.2 (main, Mar 15 2024, 11:05:00) [GCC 11.4.1 20230605 (Red Hat 11.4.1-2)]!"
以上のステップにより、Lambda関数のコンテナが完成します。この方法で、PythonアプリケーションをAWS クラウド環境に簡単に統合し、管理することができます。