LambdaのDockerコンテナイメージの導入

この記事は最終更新日から1年以上が経過しています。

Pythonで処理をするAPIを作成するにあたり、LambdaのDockerコンテナイメージを導入しましたので、個人メモとして書き起こしました。

公式(https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images-create.html)のリファレンスを参照し導入しました。

AWS ベースイメージから Lambda用のイメージを作成していきます。

FROM public.ecr.aws/lambda/python:3.8

# Copy function code
COPY app.py ${LAMBDA_TASK_ROOT}

# Install the function's dependencies using file requirements.txt
# from your project folder.

COPY requirements.txt  .
RUN  pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"

# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.handler" ] 

docker-compose派なのでdocker-compose.ymlも作成します。

version: '3'

services:
  app:
    container_name: あなたのコンテナ名
    image: あなたのイメージ名
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - './:/app'
    ports:
      - '9000:8080'

./appフォルダを作成しapp.pyを作成します。

def handler(event, context):
    return 'XXXXXXXXXXXXXX'

ではbuildします。

$ docker-compose build

エラーでした!

requirements.txtを作成し忘れていました。

からのrequirements.txtを作成しもう一度

$ docker-compose build

build成功しました。

ではコンテナを立ち上げます。

$ docker-compose up

立ち上がったのでAPIを叩いてみます。

$ curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

無事でした!

あっさりとAPIの開発環境ができてしまいました!

感謝です。

続いてイメージをAmazon ECRにデプロイをします。

Amazon ECR レジストリに対し、Docker CLI を認証します。

$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin アカウントID.dkr.ecr.ap-northeast-1.amazonaws.com

regionはap-northeast-1にしました。

そして、create-repository コマンドを使用して、Amazon ECR にリポジトリを作成します。

$ aws ecr create-repository --repository-name リポジトリ名 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE

無事に作成されていました!

続いて、リポジトリ名と一致するタグをイメージに付けます。

$ docker tag タグ名:latest アカウントID.dkr.ecr.ap-northeast-1.amazonaws.com/イメージ名:latest

では、Amazon ECR にデプロイします。

$ docker push アカウントID.dkr.ecr.ap-northeast-1.amazonaws.com/イメージ名:latest

リファレンスに従いながら、APIの開発環境が構築できました。

ありがとうございます。Lambdaライフを楽しみます。

ここまでお読みいただきありがとうございました。