AWS docker-lambdaでローカル環境でlambda関数の開発を行う

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

先日はEC2上でLambda関数の開発を行いましたが、EC2を立てるのが手間・費用がかかるのがちょっと...という方は、docker-lambdaを使用することでLambdaコンテナの動作をエミュレートすることができます。

GitHub - lambci/docker-lambda: Docker images and test runners that replicate the live AWS Lambda environment


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