LoginSignup
1
0

More than 1 year has passed since last update.

RIEを使ってLambdaコンテナイメージをローカルでエミュレートする

Posted at

はじめに

前回Lambdaコンテナイメージを、AWS以外のベースイメージから作る方法を記事にしました。

作成する際AWS Lambda Runtime Interface Emulator (RIE) を使って、ローカルでLambdaをエミュレートする方法を試しましたので記事にしました。

参考

やったこと

前回同様に、プロジェクトのディレクトリを作成し、Pythonのファイルを作成します。
Dockerfileは、エミュレータを含めるかどうかで記述が変わりますので、ここではファイルを作成するだけです。

# プロジェクトディレクトリ作成
mkdir sample-ecr-lambda
cd sample-ecr-lambda

# リージョンとアカウントIDを環境変数にセット
REGION="ap-northeast-1"
ACCOUNTID=$(aws sts get-caller-identity --output text --query Account)

# Dockerfile作成
## エミュレーターを組み込む/組み込まないで内容が異なるので、まだ記述しない
touch Dockerfile

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

def handler(event, context):
    return {
        "statusCode": 200,
        "body": json.dumps(
            {
                "message": "hello world",
            }
        ),
    }

次に、RIEをダウンロードします。

mkdir aws-lambda-rie

curl -Lo aws-lambda-rie/aws-lambda-rie \
 https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie

chmod +x aws-lambda-rie/aws-lambda-rie

RIEをイメージに組み込む場合

公式の説明は以下になります。

エントリポイントに指定するスクリプトファイルを記載します。
AWS_LAMBDA_RUNTIME_API 環境変数の有無で、RICを使うか、RIEでエミュレートするかに分かれます。

touch entry_script.sh
# 実行権限も付与
chmod +x entry_script.sh
entry_script.sh
#!/bin/sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
  exec /usr/bin/aws-lambda-rie /usr/bin/python3 -m awslambdaric $@
else
  exec /usr/bin/python3 -m awslambdaric $@
fi

Dockerfileを作ります。前回のものとは異なり、エントリポイントに上記ファイルを指定しています。

Dockerfile
FROM ubuntu:20.04

RUN apt-get update && apt-get install -y python3-pip

RUN mkdir /function && \
  pip install --target /function awslambdaric
  
COPY app.py /function/

COPY ./entry_script.sh /entry_script.sh
ADD ./aws-lambda-rie/aws-lambda-rie /usr/bin/aws-lambda-rie

WORKDIR /function

ENTRYPOINT [ "/entry_script.sh" ]

CMD [ "app.handler" ]

後はBuildして動かすだけです。

# Build
docker build -t func1 .

# コンテナ実行
docker run --rm -p 9000:8080 func1:latest

# テスト
## 別のターミナルから
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

# 終了
## docker runしたターミナルで
Ctrl+C

RIEを組み込まない場合

少しでもイメージを小さくしたい場合は、こちらのほうがいいかもしれません。

Dockerファイルの中身は前回と同じものです。

FROM ubuntu:20.04

RUN apt-get update && apt-get install -y python3-pip

RUN mkdir /function && \
  pip install --target /function awslambdaric
  
COPY app.py /function/

WORKDIR /function

ENTRYPOINT [ "/usr/bin/python3", "-m", "awslambdaric" ]

CMD [ "app.handler" ]

Buildします

# Build
docker build -t func1 .

RIEは、コンテナ実行時に、RIEがあるディレクトリをマウントして使用します。詳細は以下のページにあります。

docker run --rm -p 9000:8080 \
 -v `pwd`/aws-lambda-rie:/aws-lambda \
 --entrypoint /aws-lambda/aws-lambda-rie \
 func1:latest \
 /usr/bin/python3 -m awslambdaric app.handler
  • 2行目:ローカルのRIEファイルがあるディレクトリをマウント
  • 3行目:(マウントしたため、コンテナ内部で実行可能な)RIEファイルをエントリポイントに指定
  • 5行目:3行目に与える引数

となります。

あとは同じようにテストです。

# 別のターミナルから
$ curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

# docker runしたターミナルで
Ctrl+C

問題なければ、依然と同様にECRにPUSHして、Lambda作成に進みます。

おわりに

今回はRIEの使い方を記事にしました。
ベースイメージを自分で選んだものにしても、RIEを用いれば簡単にローカルでLambdaをエミュレートできるため、開発の敷居はかなり下がったと感じました。

1
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
1
0