ファイル構成
. |-- 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をダウンロードして梱包してい る。
RUN curl -Lo ~/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && chmod +x ~/aws-lambda-rie && mv ~/aws-lambda-rie /usr/bin/
Dockerfileの全体は次のようになっている。
# image: sximada/example_lambda_runtime_interface_client
FROM python:3.9.6-slim-buster
RUN apt-get update && \
apt-get install -y \
g++ \
make \
cmake \
unzip \
curl \
libcurl4-openssl-dev
RUN curl -Lo ~/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && chmod +x ~/aws-lambda-rie && mv ~/aws-lambda-rie /usr/bin/
RUN mkdir -p /app
COPY main.py /app/main.py
WORKDIR /app
RUN pip install awslambdaric
COPY docker-entrypoint.sh /app/
ENTRYPOINT [ "/bin/bash"]
CMD [ "docker-entrypoint.sh" ]
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