ファイル構成

.
|-- 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抜粋

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" ]
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

脚注