はじめに
前回AWS Lambdaを、コンテナイメージから作成しました。
その中でローカルテストとして、RIEを使ってローカルでLambdaをエミュレートする内容を記載しました。
ですがさらにその前段階の、コンテナ上でコードが動くのかを確認する方法を記載します。
Dockerを使い慣れた方には当たり前のことかもしれませんが、自分のような初学者や、備忘録として記事にしました。
結論
-
docker run
の際に、--entrypoint=
でエントリポイントを無効化 - ホスト-コンテナ間は
docker cp
でファイルをやり取り
環境
いつものCloud9だけです。
やったこと
イメージ作成まで
イメージ作成までは前回と同じです。
# ファイル作成
$ touch app.py
$ touch Dockerfile
import json
def handler(event, context):
return {
"statusCode": 200,
"body": json.dumps(
{
"message": "hello world",
}
),
}
FROM public.ecr.aws/lambda/python:3.8
COPY app.py ./
CMD ["app.handler"]
$ docker build -t func1 .
コンテナ作成・スクリプト実行
この後コンテナを作成して中に入ろうと思いますが、(恐らく)エントリポイントとして以下のページにあるentry.sh
のような「環境変数が指定されていなければRIEを使いローカルでLambdaをエミュレート、あればRICで動作」というシェルを指定しているものと思われます。
#!/bin/sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
exec /usr/bin/aws-lambda-rie /usr/local/bin/python -m awslambdaric $1
else
exec /usr/local/bin/python -m awslambdaric $1
fi
なので、docker run
する際に引数でエントリポイントを無視するようにします。
$ docker run --rm -it \
--entrypoint= \
func1 bash
これでコンテナの中に入れましたので、Pythonでapp.pyのhandlerを実行できます。
$ python
>>> import app
>>> app.handler(None,None)
{'statusCode': 200, 'body': '{"message": "hello world"}'}
修正する場合はdocker cp
を使えば、ローカルとコンテナ内のファイルをやり取りできそうです。
# コンテナのワークディレクトリを確認。AWS公式のイメージだと以下
$ pwd
/var/task
# 別ターミナルより
$ docker ps
# 上記で確認したIDを指定
$ docker cp app.py <コンテナID>:/var/task/app.py
おわりに
Lambdaをコンテナから作成する際に知った、エントリポイントを無視する方法と、ホストからコンテナへのファイルのコピーを記事にしました。
自分のような、Docker素人でLambdaをコンテナから作る、という方々の助けになれば幸いです。