先日はEC2上でLambda関数の開発を行いましたが、EC2を立てるのが手間・費用がかかるのがちょっと...という方は、docker-lambdaを使用することでLambdaコンテナの動作をエミュレートすることができます。
docker-lambdaについて
lambda関数build用のlambci/lambda:build-python3.7
コンテナとエミュレート用のlambci/lambda:python3.7
の2つが存在します。言語の部分は使用するruntime及びバージョンに読み替えてください。
開発環境の構築
まず開発環境の構築はlambci/lambda:build-python3.7
でビルドしたライブラリを使用できるよう準備します。CPU依存のライブラリ等含まれる可能性がある場合はコンテナアーキテクチャ上でビルドを行います。
ビルド用コンテナの取得
$ docker pull lambci/lambda:python3.7
Lambda関数ファイルの作成
$ touch lambda_function.py
関数開発用のライブラリビルド
Dockerfile
FROM lambci/lambda:build-python3.7 ENV AWS_DEFAULT_REGION ap-northeast-1 ADD . . CMD pip3 install boto3 -t /var/task && \ zip -9 deploy_package.zip lambda_function.py && \ zip -r9 deploy_package.zip *
pip3 install
するライブラリは使用するものに適宜修正する。オプション-t
は指定のパスにライブラリインストールを行える。
ビルドの実行と成果物のexport。pip3 install
したライブラリをローカルにマウントします。
$ docker build -t mylambda . $ docker run -v "$PWD":/var/task mylambda
以上でローカル上でソースコードを編集できる構成となる。
$ ls -la drwxr-xr-x 24 username staff 768 6 5 09:58 . drwxr-xr-x 3 username staff 96 6 5 09:19 .. -rw-r--r-- 1 username staff 316 6 5 09:02 Dockerfile drwxr-xr-x 5 username staff 160 6 5 10:03 __pycache__ drwxr-xr-x 16 username staff 512 6 5 09:03 bin drwxr-xr-x 15 username staff 480 6 5 09:03 boto3 drwxr-xr-x 9 username staff 288 6 5 09:03 boto3-1.13.23.dist-info drwxr-xr-x 43 username staff 1376 6 5 09:03 botocore drwxr-xr-x 9 username staff 288 6 5 09:03 botocore-1.16.23.dist-info drwxr-xr-x 14 username staff 448 6 5 09:03 dateutil -rw-r--r-- 1 username staff 8764327 6 5 09:04 deploy_package.zip drwxr-xr-x 17 username staff 544 6 5 09:03 docutils drwxr-xr-x 8 username staff 256 6 5 09:03 docutils-0.15.2.dist-info drwxr-xr-x 11 username staff 352 6 5 09:03 jmespath drwxr-xr-x 10 username staff 320 6 5 09:03 jmespath-0.10.0.dist-info -rw-r--r-- 1 username staff 181 6 5 10:02 lambda_function.py drwxr-xr-x 9 username staff 288 6 5 09:03 python_dateutil-2.8.1.dist-info drwxr-xr-x 18 username staff 576 6 5 09:03 s3transfer drwxr-xr-x 9 username staff 288 6 5 09:03 s3transfer-0.3.3.dist-info drwxr-xr-x 8 username staff 256 6 5 09:03 six-1.15.0.dist-info -rw-r--r-- 1 username staff 34159 6 5 09:03 six.py drwxr-xr-x 16 username staff 512 6 5 09:03 urllib3 drwxr-xr-x 8 username staff 256 6 5 09:03 urllib3-1.25.9.dist-info
Lambda関数の作成
サンプルとしてinstallしたboto3を使用した関数の例を示します。
import json import boto3 def lambda_handler(event, context): s3 = boto3.resource('s3') obj = s3.Object('bucketName', 'filename') res = obj.get() return res['Body'].read()
Dockerからboto3を通してS3へアクセスするには、S3アクセスの権限があるIAMユーザのクレデンシャルが必要。 docker-lambdaには環境変数でクレデンシャルを指定できる。
./.credential
AWS_ACCESS_KEY_ID=**** AWS_SECRET_ACCESS_KEY=****
作成した関数の実行
作成した関数をローカルで実行するにはlambci/lambda:python3.7
コンテナ上で実行します。/var/task
に作業ファイル及びビルドしたライブラリをマウントした後、CMD引数で関数名を指定して実行します。credential
は必要に応じて指定します。
$ docker run --env-file ./.credential -v "$PWD":/var/task lambci/lambda:python3.7 lambda_function.lambda_handler
AWS Lambdaへのデプロイ
関数作成後、再度ビルドし直せばdeploy_package.zip
がLambda関数パッケージとなるので、このファイルをLambdaへアップロードします。
$ docker build -t mylambda . $ docker run -v "$PWD":/var/task mylambda