コンテナイメージで Python Lambda 関数をデプロイする
Python Lambda 関数のコンテナイメージを構築するには 3 つの方法があります。
-
AWS ベースイメージには、言語ランタイム、Lambda と関数コード間のやり取りを管理するランタイムインターフェースクライアント、ローカルテスト用のランタイムインターフェースエミュレーターがあらかじめロードされています。
-
AWS OS 専用ベースイメージ
には、Amazon Linux ディストリビューションおよびランタイムインターフェイスエミュレータ が含まれています。これらのイメージは、Go や Rust などのコンパイル済み言語や、Lambda がベースイメージを提供していない言語または言語バージョン (Node.js 19 など) のコンテナイメージの作成によく使用されます。OS 専用のベースイメージを使用してカスタムランタイムを実装することもできます。イメージに Lambda との互換性を持たせるには、Python のランタイムインターフェイスクライアントをイメージに含める必要があります。 -
Alpine Linux や Debian など、別のコンテナレジストリの代替ベースイメージを使用することができます。組織が作成したカスタムイメージを使用することもできます。イメージに Lambda との互換性を持たせるには、Python のランタイムインターフェイスクライアントをイメージに含める必要があります。
ヒント
Lambda コンテナ関数がアクティブになるまでの時間を短縮するには、「Docker ドキュメント」の「マルチステージビルドを使用する
このページでは、Lambda のコンテナイメージを構築、テスト、デプロイする方法について説明します。
Python の AWS ベースイメージ
AWS は、Python 用の次のベースイメージを提供します。
| タグ | ランタイム | オペレーティングシステム | Dockerfile | 非推奨 |
|---|---|---|---|---|
3.13 |
Python 3.13 | Amazon Linux 2023 | GitHub の Python 3.13 用 Dockerfile |
2029 年 6 月 30 日 |
3.12 |
Python 3.12 | Amazon Linux 2023 | GitHub の Python 3.12 用 Dockerfile |
2028 年 10 月 31 日 |
3.11 |
Python 3.11 | Amazon Linux 2 | GitHub の Python 3.11 用 Dockerfile |
2026 年 6 月 30 日 |
3.10 |
Python 3.10 | Amazon Linux 2 | GitHub の Python 3.10 用 Dockerfile |
2026 年 6 月 30 日 |
3.9 |
Python 3.9 | Amazon Linux 2 | GitHub の Python 3.9 用 Dockerfile |
2025 年 12 月 15 日 |
Amazon ECR リポジトリ: gallery.ecr.aws/lambda/python
Python 3.12 以降のベースイメージは、Amazon Linux 2023 の最小コンテナイメージに基づいています。Python 3.8~3.11 のベースイメージは、Amazon Linux 2 のイメージに基づいています。AL2023 ベースのイメージには、デプロイのフットプリントが小さいことや、glibc などのライブラリのバージョンが更新されていることなど、Amazon Linux 2 に比べていくつかの利点があります。
AL2023 ベースのイメージでは、Amazon Linux 2 のデフォルトのパッケージマネージャである yum の代わりに microdnf (dnf としてシンボリックリンク) がパッケージマネージャとして使用されています。microdnf は dnf のスタンドアロン実装です。AL2023 ベースのイメージに含まれるパッケージのリストについては、「Comparing packages installed on Amazon Linux 2023 Container Images」の「Minimal Container」列を参照してください。AL2023 と Amazon Linux 2 の違いの詳細については、AWS コンピューティングブログの「Introducing the Amazon Linux 2023 runtime for AWS Lambda
注記
AWS Serverless Application Model (AWS SAM) を含む AL2023 ベースのイメージをローカルで実行するには、Docker バージョン 20.10.10 以降を使用する必要があります。
ベースイメージ内の依存関係の検索パス
コードで import ステートメントを使用すると、Python ランタイムはモジュールまたはパッケージが見つかるまで検索パス内のディレクトリを検索します。デフォルトでは、ランタイムは {LAMBDA_TASK_ROOT} ディレクトリを先に検索します。ランタイムに含まれるライブラリのバージョンをイメージに含める場合、そのバージョンが、ランタイムに含まれるバージョンよりも優先されます。
検索パスの他のステップは、使用している Python 用 Lambda ベースイメージのバージョンによって次のように異なります。
-
Python 3.11 以降: ランタイムに含まれるライブラリと pip でインストールされるライブラリは
/var/lang/lib/python3.11/site-packagesディレクトリにインストールされます。このディレクトリは、検索パス内で/var/runtimeよりも優先されます。pip を使用して新しいバージョンをインストールすることで、SDK をオーバーライドできます。pip を使用して、ランタイムに含まれる SDK とその依存関係が、インストールする任意のパッケージと互換性があることを確認できます。 -
Python 3.8-3.10: ランタイムに含まれるライブラリは
/var/runtimeディレクトリにインストールされます。pip でインストールされるライブラリは/var/lang/lib/python3.x/site-packagesディレクトリにインストールされます。/var/runtimeディレクトリは検索パス内で/var/lang/lib/python3.x/site-packagesより優先されます。
次のコードスニペットを追加すると、Lambda 関数の完全な検索パスを確認できます。
import sys search_path = sys.path print(search_path)
Python の AWS ベースイメージを使用する
このセクションの手順を完了するには、以下が必要です。
-
Docker
(最小バージョン 25.0.0) -
Docker buildx プラグイン
。 -
Python
Python の AWS ベースイメージからコンテナイメージを作成するには
-
プロジェクト用のディレクトリを作成し、そのディレクトリに切り替えます。
mkdir example cd example -
lambda_function.pyという名前の新しいファイルを作成します。テスト用に次のサンプル関数コードをファイルに追加することも、独自のコードを使用することもできます。例 Python 関数
import sys def handler(event, context): return 'Hello from AWS Lambda using Python' + sys.version + '!' -
requirements.txtという名前の新しいファイルを作成します。前のステップのサンプル関数コードを使用している場合、依存関係がないためファイルを空のままにしておくことができます。それ以外の場合は、必要なライブラリをそれぞれリストしてください。たとえば、関数で AWS SDK for Python (Boto3) を使用している場合、requirements.txtは次のようになります。例 requirements.txt
boto3 -
次の設定で新しい Dockerfile を作成します。
-
FROMプロパティを「ベースイメージの URI」に設定します。 -
COPY コマンドを使用し、関数コードおよびランタイムの依存関係を
{LAMBDA_TASK_ROOT}(Lambda 定義の環境変数) にコピーします。 -
CMD引数を Lambda 関数ハンドラーに設定します。
この例の Dockerfile には USER 命令
が含まれていないことに注意してください。コンテナイメージを Lambda にデプロイすると、最小特権のアクセス許可を付与したデフォルトの Linux ユーザーを Lambda が自動的に定義します。これは標準の Docker 動作とは異なります。標準の動作とは、 USER命令を指定しなかったときにrootユーザーのデフォルトとなる動作のことです。例 Dockerfile
FROM public.ecr.aws/lambda/python:3.12 # Copy requirements.txt COPY requirements.txt ${LAMBDA_TASK_ROOT} # Install the specified packages RUN pip install -r requirements.txt # Copy function code COPY lambda_function.py ${LAMBDA_TASK_ROOT} # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "lambda_function.handler" ] -
-
Docker イメージを「Docker の構築
」コマンドで構築します。次の例では、イメージを docker-imageと名付けてtestタグを付けます。Lambda互換のイメージを作成するには、 --provenance=falseオプションを使用する必要があります。docker buildx build --platform linux/amd64 --provenance=false -tdocker-image:test.注記
このコマンドは、ビルドマシンのアーキテクチャに関係なく、コンテナが Lambda の実行環境と互換性があることを確認する
--platform linux/amd64オプションを特定します。ARM64 命令セットアーキテクチャを使用して Lambda 関数を作成する場合は、代わりに--platform linux/arm64オプションを使用するようにコマンドを変更してください。
-
docker run コマンドを使用して、Docker イメージを起動します。この例では、
docker-imageはイメージ名、testはタグです。docker run --platform linux/amd64 -p 9000:8080docker-image:testこのコマンドはイメージをコンテナとして実行し、
localhost:9000/2015-03-31/functions/function/invocationsでローカルエンドポイントを作成します。注記
ARM64 命令セットアーキテクチャ用に Docker イメージをビルドした場合は、
--platform linux/の代わりにamd64--platform linux/オプションを使用してください。arm64 -
新しいターミナルウィンドウから、イベントをローカルエンドポイントにポストします。
-
コンテナ ID を取得します。
docker ps -
「docker kill
」コマンドを使用してコンテナを停止します。このコマンドでは、 3766c4ab331cを前のステップのコンテナ ID で置き換えます。docker kill3766c4ab331c
Amazon ECR にイメージをアップロードして Lambda 関数を作成するには
-
「get-login-password
」コマンドを実行して Amazon ECR レジストリに Docker CLI を認証します。 -
--region値を Amazon ECR リポジトリを作成する AWS リージョン に設定します。 -
111122223333を AWS アカウント ID に置き換えます。
aws ecr get-login-password --regionus-east-1| docker login --username AWS --password-stdin111122223333.dkr.ecr.us-east-1.amazonaws.com -
-
「create-repository
」コマンドを使用して Amazon ECR にリポジトリを作成します。 aws ecr create-repository --repository-namehello-world--regionus-east-1--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE注記
Amazon ECR リポジトリは Lambda 関数と同じ AWS リージョン に配置されている必要があります。
成功すると、次のようなレスポンスが表示されます。
{ "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } } -
前のステップの出力から
repositoryUriをコピーします。 -
「docker tag
」コマンドを実行して、最新バージョンとしてローカルイメージを Amazon ECR リポジトリにタグ付けします。このコマンドで: -
docker-image:testは、Docker イメージの名前とタグです。これは、 docker buildコマンドに指定したイメージの名前とタグです。 -
<ECRrepositoryUri>を、コピーしたrepositoryUriに置き換えます。URI の末尾には必ず:latestを含めてください。
docker tag docker-image:test<ECRrepositoryUri>:latest例:
docker tagdocker-image:test111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest -
-
「docker push
」コマンドを実行して Amazon ECR リポジトリにローカルイメージをデプロイします リポジトリ URI の末尾には必ず :latestを含めてください。docker push111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest -
まだ作成済みでない場合、関数に「実行ロールの作成」を実行してください。次のステップではロールの Amazon リソースネーム (ARN) が必要です。
-
Lambda 関数を作成します。
ImageUriには、先ほど使用したリポジトリ URI を指定します。URI の末尾には必ず:latestを含めてください。aws lambda create-function \ --function-namehello-world\ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --rolearn:aws:iam::111122223333:role/lambda-ex注記
イメージが Lambda 関数と同じリージョンに配置されていれば、別の AWS アカウントのイメージを使用して関数を作成することができます。詳細については、「 Amazon ECR クロスアカウント許可」を参照してください。
-
関数を呼び出します。
aws lambda invoke --function-namehello-worldresponse.json次のような結果が表示されます。
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 } -
関数の出力を確認するには、
response.jsonファイルをチェックします。
関数コードを更新するには、イメージを再構築し、新しいイメージを Amazon ECR リポジトリにアップロードしてから、update-function-code
Lambda は、イメージタグを特定のイメージダイジェストに解決します。これは、関数のデプロイに使用されたイメージタグを Amazon ECR 内の新しいイメージを指すように変更しても、Lambda は新しいイメージを使用するように自動的に関数を更新しないことを意味します。
新しいイメージを同じ Lambda 関数にデプロイするには、Amazon ECR のイメージタグが同じままであっても、update-function-code--publish オプションが最新のコンテナイメージを使用して関数の新しいバージョンを作成しています。
aws lambda update-function-code \ --function-namehello-world\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest\ --publish
ランタイムインターフェイスクライアントで代替ベースイメージを使用する
OS 専用ベースイメージまたは代替のベースイメージを使用する場合、イメージにランタイムインターフェイスクライアントを含める必要があります。ランタイムインターフェイスクライアントは、Lambda と関数コード間の相互作用を管理する ランタイム API を拡張します。
pip パッケージマネージャーを使用して、Python 用のランタイムインターフェイスクライアント
pip install awslambdaric
Python ランタイムインターフェイスクライアント
次の例は、非 AWS ベースイメージを使用して Python 用のコンテナイメージを構築する方法を示しています。サンプルの Dockerfile は公式の Python ベースイメージを使用しています。Dockerfile には、Python 用のランタイムインターフェイスクライアントが含まれます。
このセクションの手順を完了するには、以下が必要です。
-
Docker
(最小バージョン 25.0.0) -
Docker buildx プラグイン
。 -
Python
非 AWS ベースイメージからコンテナイメージを作成するには
-
プロジェクト用のディレクトリを作成し、そのディレクトリに切り替えます。
mkdir example cd example -
lambda_function.pyという名前の新しいファイルを作成します。テスト用に次のサンプル関数コードをファイルに追加することも、独自のコードを使用することもできます。例 Python 関数
import sys def handler(event, context): return 'Hello from AWS Lambda using Python' + sys.version + '!' -
requirements.txtという名前の新しいファイルを作成します。前のステップのサンプル関数コードを使用している場合、依存関係がないためファイルを空のままにしておくことができます。それ以外の場合は、必要なライブラリをそれぞれリストしてください。たとえば、関数で AWS SDK for Python (Boto3) を使用している場合、requirements.txtは次のようになります。例 requirements.txt
boto3 -
新しい Dockerfile を作成します。次の Dockerfile は、AWS ベースイメージの代わりに公式の Python ベースイメージを使用しています。Dockerfile には、イメージに Lambda との互換性を持たせるランタイムインターフェイスクライアント
が含まれています。次の Dockerfile の例では、「マルチステージビルド 」が使用されます。 -
FROMプロパティにベースイメージを設定します。 -
ENTRYPOINTを、Docker コンテナの起動時に実行させるモジュールに設定します。この場合、モジュールはランタイムインターフェイスクライアントです。 -
CMDを Lambda 関数ハンドラーに設定します。
この例の Dockerfile には USER 命令
が含まれていないことに注意してください。コンテナイメージを Lambda にデプロイすると、最小特権のアクセス許可を付与したデフォルトの Linux ユーザーを Lambda が自動的に定義します。これは標準の Docker 動作とは異なります。標準の動作とは、 USER命令を指定しなかったときにrootユーザーのデフォルトとなる動作のことです。例 Dockerfile
# Define custom function directory ARG FUNCTION_DIR="/function" FROMpython:3.12AS build-image # Include global arg in this stage of the build ARG FUNCTION_DIR # Copy function code RUN mkdir -p ${FUNCTION_DIR} COPY . ${FUNCTION_DIR} # Install the function's dependencies RUN pip install \ --target ${FUNCTION_DIR} \ awslambdaric # Use a slim version of the base Python image to reduce the final image size FROMpython:3.12-slim# Include global arg in this stage of the build ARG FUNCTION_DIR # Set working directory to function root directory WORKDIR ${FUNCTION_DIR} # Copy in the built dependencies COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR} # Set runtime interface client as default command for the container runtime ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ] # Pass the name of the function handler as an argument to the runtime CMD [ "lambda_function.handler" ] -
-
Docker イメージを「Docker の構築
」コマンドで構築します。次の例では、イメージを docker-imageと名付けてtestタグを付けます。Lambda互換のイメージを作成するには、 --provenance=falseオプションを使用する必要があります。docker buildx build --platform linux/amd64 --provenance=false -tdocker-image:test.注記
このコマンドは、ビルドマシンのアーキテクチャに関係なく、コンテナが Lambda の実行環境と互換性があることを確認する
--platform linux/amd64オプションを特定します。ARM64 命令セットアーキテクチャを使用して Lambda 関数を作成する場合は、代わりに--platform linux/arm64オプションを使用するようにコマンドを変更してください。
ランタイムインターフェイスエミュレーター
ローカルマシンにランタイムインターフェイスエミュレーターをインストールして実行するには
-
プロジェクトディレクトリから次のコマンドを実行して、GitHub からランタイムインターフェイスエミュレーター (x86-64 アーキテクチャ) をダウンロードし、ローカルマシンにインストールします。
-
docker run コマンドを使用して、Docker イメージを起動します。次の点に注意してください:
-
docker-imageはイメージ名、testはタグです。 -
/usr/local/bin/python -m awslambdaric lambda_function.handlerはENTRYPOINTで、その後に Dockerfile のCMDが続きます。
このコマンドはイメージをコンテナとして実行し、
localhost:9000/2015-03-31/functions/function/invocationsでローカルエンドポイントを作成します。注記
ARM64 命令セットアーキテクチャ用に Docker イメージをビルドした場合は、
--platform linux/の代わりにamd64--platform linux/オプションを使用してください。arm64 -
-
イベントをローカルエンドポイントにポストします。
-
コンテナ ID を取得します。
docker ps -
「docker kill
」コマンドを使用してコンテナを停止します。このコマンドでは、 3766c4ab331cを前のステップのコンテナ ID で置き換えます。docker kill3766c4ab331c
Amazon ECR にイメージをアップロードして Lambda 関数を作成するには
-
「get-login-password
」コマンドを実行して Amazon ECR レジストリに Docker CLI を認証します。 -
--region値を Amazon ECR リポジトリを作成する AWS リージョン に設定します。 -
111122223333を AWS アカウント ID に置き換えます。
aws ecr get-login-password --regionus-east-1| docker login --username AWS --password-stdin111122223333.dkr.ecr.us-east-1.amazonaws.com -
-
「create-repository
」コマンドを使用して Amazon ECR にリポジトリを作成します。 aws ecr create-repository --repository-namehello-world--regionus-east-1--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE注記
Amazon ECR リポジトリは Lambda 関数と同じ AWS リージョン に配置されている必要があります。
成功すると、次のようなレスポンスが表示されます。
{ "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } } -
前のステップの出力から
repositoryUriをコピーします。 -
「docker tag
」コマンドを実行して、最新バージョンとしてローカルイメージを Amazon ECR リポジトリにタグ付けします。このコマンドで: -
docker-image:testは、Docker イメージの名前とタグです。これは、 docker buildコマンドに指定したイメージの名前とタグです。 -
<ECRrepositoryUri>を、コピーしたrepositoryUriに置き換えます。URI の末尾には必ず:latestを含めてください。
docker tag docker-image:test<ECRrepositoryUri>:latest例:
docker tagdocker-image:test111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest -
-
「docker push
」コマンドを実行して Amazon ECR リポジトリにローカルイメージをデプロイします リポジトリ URI の末尾には必ず :latestを含めてください。docker push111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest -
まだ作成済みでない場合、関数に「実行ロールの作成」を実行してください。次のステップではロールの Amazon リソースネーム (ARN) が必要です。
-
Lambda 関数を作成します。
ImageUriには、先ほど使用したリポジトリ URI を指定します。URI の末尾には必ず:latestを含めてください。aws lambda create-function \ --function-namehello-world\ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --rolearn:aws:iam::111122223333:role/lambda-ex注記
イメージが Lambda 関数と同じリージョンに配置されていれば、別の AWS アカウントのイメージを使用して関数を作成することができます。詳細については、「 Amazon ECR クロスアカウント許可」を参照してください。
-
関数を呼び出します。
aws lambda invoke --function-namehello-worldresponse.json次のような結果が表示されます。
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 } -
関数の出力を確認するには、
response.jsonファイルをチェックします。
関数コードを更新するには、イメージを再構築し、新しいイメージを Amazon ECR リポジトリにアップロードしてから、update-function-code
Lambda は、イメージタグを特定のイメージダイジェストに解決します。これは、関数のデプロイに使用されたイメージタグを Amazon ECR 内の新しいイメージを指すように変更しても、Lambda は新しいイメージを使用するように自動的に関数を更新しないことを意味します。
新しいイメージを同じ Lambda 関数にデプロイするには、Amazon ECR のイメージタグが同じままであっても、update-function-code--publish オプションが最新のコンテナイメージを使用して関数の新しいバージョンを作成しています。
aws lambda update-function-code \ --function-namehello-world\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest\ --publish
Alpine ベースイメージから Python イメージを作成する方法の例については、AWS ブログの「Lambda のコンテナイメージのサポート