Lambda で Python 3.6 のコンテナイメージを使用してみた
Lambda のマネージドランタイムとしての Python 3.6 は 2022 年 7 月 18 日に廃止されているため、現状では新規関数作成時に Python 3.6 のランタイムを指定することはできません。
しかし、検証用にどうしても Lambda で Python 3.6 を使用する必要がある場合にはコンテナイメージを利用する方法もあるかと思うのでやってみました。
前提
- 開発環境は Cloud9
- AWS CLI バージョン 2 をインストール済み
- Docker をインストール済み
- Python をインストール済み
手順概要
コンテナイメージで Python Lambda 関数をデプロイする - AWS Lambda
上記ドキュメントの手順を参考に実施します。
- ベースイメージからイメージを作成
- ECR リポジトリへのプッシュ
- Lambda 関数作成
- 動作確認
1. ベースイメージからイメージを作成
1-1. プロジェクト用のディレクトリを作成し、そのディレクトリに切り替えます。
$ mkdir example
$ cd example
1-2. lambda_function.py の作成
lambda_function.py ファイルを作成し、以下のコードを書き込みます。
import sys
def handler(event, context):
return 'Hello from AWS Lambda using Python' + sys.version + '!'
1-3. Dockerfile の作成
Dockerfile を作成し、以下のコードを書き込みます。
FROM public.ecr.aws/lambda/python:3.6
# 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" ]
FROM のイメージには ECR パブリックギャラリーで公開されている Python 3.6 のイメージを指定しました。
Amazon ECR Public Gallery - AWS Lambda/python
2. ECR リポジトリへのプッシュ
2-1. ECR リポジトリはコンソールからデフォルト設定で作成しました。
2-2. ECR リポジトリへのプッシュ
ECR リポジトリのプッシュコマンドを順番に実行しました。
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 012345678901.dkr.ecr.ap-northeast-1.amazonaws.com
$ docker build -t test .
$ docker tag test:latest 012345678901.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest
$ docker push 012345678901.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest
3. Lambda 関数作成
3-1. コンソールからコンテナイメージを指定して Lambda 関数を作成します。
4. 動作確認
4-1. コンソールからテスト実行して、以下の結果が表示されれば成功です。
"Hello from AWS Lambda using Python3.6.15 (default, Nov 3 2022, 12:39:40) \n[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)]!"
ベースイメージのサポートについて
ランタイムが非推奨になると、 Lambda のマネージドランタイムとコンテナベースイメージの更新はサポートされなくなります。サポートされているランタイムまたはベースイメージの使用における関数のアップグレードは、お客様の責任で行ってください。
上述の通り、Python 3.6 のランタイムは非推奨になっているため、今回使用した Python 3.6 のベースイメージも非推奨です。
そのため、問題が発生した場合はユーザーの責任範囲となりますのでご注意ください。
まとめ
今回は Lambda で Python 3.6 のコンテナイメージを使用してみました。
どなたかの参考になれば幸いです。
Discussion