ファイル構成
. |-- Dockerfile # Docker Imageを作成するためのファイル |-- Procfile # 開発時に利用するForemanのための設定ファイル (必須ではない) |-- docker-entrypoint.sh # Dockerコンテナの起動時に呼び出すスクリプト |-- index.org # この文書 (必須ではない) `-- main.py # AWS Lambda関数を実装したPythonスクリプト 0 directories, 5 files
Docker Image
Dockerfile
docker buildコマンドを用いてビルドする。Dockerfile内にlocalでAWS Lambdaをエミュレーションするaws-lambda-rieをダウンロードして梱包してい る。
Dockerfileの全体は次のようになっている。
docker-entrypoint.sh
docker-entrypoint.shではAWS_LAMBDA_RUNTIME_API環境変数の有無によってエ ミュレーターを使って起動するのかを切り替えている。この方法は公式の READMEに記載がある1。
#!/bin/sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]
then
echo "START AWS LAMBDA INTERFACE EMULATOR"
exec aws-lambda-rie python -m awslambdaric main.lambda_handler
else
echo "START AWS LAMBDA FUNCTION"
exec python -m awslambdaric main.lambda_handler
fi
main.py
これはAWS Lambdaで動作させるアプリケーションコードだ。それぞれの要求に よって変わる。今回はテスト用のため、OKという文字列を表示するだけのシン プルな関数lambda_handlerを一つだけ実装した。
def lambda_handler(context, environment):
print("OK")
Docker Imageのビルド
docker buildコマンドでイメージをビルドする。
docker build --tag sximada/example_lambda_runtime_interface_client -f ./Dockerfile .
実行
エミュレーターを用いて起動する
docker runコマンドで起動する。エミュレータを用いるためには AWS_LAMBDA_API環境変数を設定する。9000ポートを8080ポートに流すように設 定した。
docker run --env AWS_LAMBDA_API=1 -p 9000:8080 sximada/example_lambda_runtime_interface_client
エミュレーターが提供しているAPIを用いてLambda関数を呼び出す
エミュレーターがWeb APIを提供しているのでそれに対してHTTPリクエストを 送信することでAWS Lambda関数を呼び出せる。
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
AWSが提供しているリソース
awslambdaric - AWS Lambda Pythonランタイムインターフェースクライアント
AWSはPython用のクライアントを提供している。DockerコンテナサポートのAWS LambdaをPythonで実装する場合は概ねこれを使うことになる。
https://github.com/aws/aws-lambda-python-runtime-interface-client/
aws-lambda-rie - Localで実行可能なAWS Lmabda Interfaceのエミュレータ
aws-lambda-rieはAWS Lmabdaの動作をエミュレーションする。AWS Lmabda Interfaceに準拠したものを実行できる。
https://github.com/aws/aws-lambda-runtime-interface-emulator
参考
https://docs.aws.amazon.com/lambda/latest/dg/runtimes-images.html#runtimes-test-emulator