4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ZOZOAdvent Calendar 2022

Day 10

Serverless Frameworkでコンテナイメージを作ってLambdaを動かす

Last updated at Posted at 2022-12-09

これは ZOZO Advent Calendar 2022 カレンダー1の10日目の記事です。

はじめに

AWS Lambdaでは各言語のランタイムが提供されており、ランタイムのサポートがある言語に関しては実行したいコードをアップロードするだけで簡単にクラウド上で実行することができます。
このようにクラウド上で実行できる一方、ランタイムのサポート期限が切れる前にバージョンアップ対応が必要であったり、コードをアップロードするためのコンパイルやライブラリのダウンロードといった事前処理に時間がかかってしまうケースもあります。

そこで今回はLambdaにアップロードするコードをコンテナイメージ化し、Lambda上で実行できるまでを紹介します。

前提条件

今回は以下の環境でLambdaへコンテナイメージをデプロイできるようにします。

  • 言語: Python3.9
  • パッケージ管理ツール: Poetry
  • Serverless Framework v2.41.0
  • コードはappディレクトリ以下に配置

Serverless FrameworkでLambdaにコンテナイメージをデプロイする

まずはLambdaで実行するコンテナイメージを準備します。

# builder
FROM python:3.9-slim-buster as builder
RUN apt-get update \
    && apt-get install -y build-essential swig mecab libmecab-dev mecab-ipadic-utf8 \
    && pip install poetry Cython
WORKDIR /work/src
COPY pyproject.toml poetry.lock ./
RUN mkdir build  \
    && poetry export --without-hashes -f requirements.txt --output requirements.txt \
    && pip install -q -t build -r requirements.txt

# executor
FROM public.ecr.aws/lambda/python:3.9 as executor
COPY app ${LAMBDA_TASK_ROOT}/app
COPY --from=builder /work/src/build ${LAMBDA_TASK_ROOT}

マルチステージビルドでPoetryで管理されたパッケージをビルドしつつ、AWSが提供しているLambda実行用のコンテナイメージにapp以下のファイルとビルドしたパッケージ群をCOPYするシンプルなDockerfileとなります。

次にServerless Frameworkの設定ファイルでコンテナイメージのビルド設定を行います。

provider:
  ecr:
    images:
      containerImageApp:
        path: ./

ビルド設定はprovider.ecr以下に記述するだけです。この記述によってコンテナイメージのPush先となるECR作成からコンテナイメージのビルド・プッシュまで自動で行ってくれます。
images以下はコンテナイメージ名を任意で指定します。今回の場合はcontainerImageAppという名前にしています。
pathはDokcerImageの配置しているディレクトリを指定します。今回の場合はServerless Frameworkの設定ファイルと同階層にDockerfileを配置しているため、 ./を指定しています。

次はLambda関数の設定になります。

functions:
  LambdaContainerTest01Handler:
    # handler: app.handler.lambda_container_test_01_handler
    image:
      name: containerImageApp
      command:
        - app.handler.lambda_container_test_01_handler
    name: lambda-container-test-01-handler
    description: Lambdaコンテナイメージテスト関数1
  LambdaContainerTest02Handler:
    # handler: app.handler.lambda_container_test_02_handler
    image:
      name: containerImageApp
      command:
        - app.handler.lambda_container_test_02_handler
    name: lambda-container-test-02-handler
    description: Lambdaコンテナイメージテスト関数2

Lambda関数の設定は通常handlerに起動したい関数名を指定しますが、コンテナイメージを起動する場合はimage以下に起動したいコンテナイメージ名を指定します。
コンテナイメージのビルド設定ではcontainerImageAppという名前をつけたため、その名前を記載します。
また、commandで起動する関数名を指定することで、1つのコンテナイメージで複数のLambda関数を実行できるようにします。

おわりに

以上、簡単ではありますがServerless Frameworkでコンテナイメージを作ってLambdaを動かすところまでやってみました。
Serverless Frameworkを使えば簡単にコンテナイメージをLambdaで動かすことが可能ですので、コンテナイメージをLambdaで動かそうと思っている方はぜひServerless Frameworkを使ってみてください!

4
2
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
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?