0
0

More than 1 year has passed since last update.

Lambda用コンテナイメージ作成時、コンテナ内でテストする方法

Posted at

はじめに

前回AWS Lambdaを、コンテナイメージから作成しました。

その中でローカルテストとして、RIEを使ってローカルでLambdaをエミュレートする内容を記載しました。
ですがさらにその前段階の、コンテナ上でコードが動くのかを確認する方法を記載します。

Dockerを使い慣れた方には当たり前のことかもしれませんが、自分のような初学者や、備忘録として記事にしました。

結論

  • docker runの際に、--entrypoint= でエントリポイントを無効化
  • ホスト-コンテナ間はdocker cpでファイルをやり取り

環境

いつものCloud9だけです。

やったこと

イメージ作成まで

イメージ作成までは前回と同じです。

# ファイル作成
$ touch app.py
$ touch Dockerfile
app.py
import json

def handler(event, context):
    return {
        "statusCode": 200,
        "body": json.dumps(
            {
                "message": "hello world",
            }
        ),
    }
Dockerfile
FROM public.ecr.aws/lambda/python:3.8
COPY app.py   ./
CMD ["app.handler"]
$ docker build -t func1 .

コンテナ作成・スクリプト実行

この後コンテナを作成して中に入ろうと思いますが、(恐らく)エントリポイントとして以下のページにあるentry.shのような「環境変数が指定されていなければRIEを使いローカルでLambdaをエミュレート、あればRICで動作」というシェルを指定しているものと思われます。

entry.sh
#!/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をコンテナから作る、という方々の助けになれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0