LoginSignup
0
1

More than 1 year has passed since last update.

【AWS】Lambdaコンテナイメージ利用に対する覚え書き

Last updated at Posted at 2022-09-18

はじめに

機械学習用のライブラリを利用したAPIをLambdaで構築しようとした場合など、
デプロイパッケージサイズ制限(250MB)により利用できないケースがあります。

その場合の対応方法としてコンテナイメージをLambdaで利用できるようになっていますが、
実際にLambdaコンテナイメージを使って構築/動作確認するまでに結構ハマったところがあるのでdockerfile作成からAmazon ECRへのプッシュまでを本記事にまとめます。同じくハマっているひとの参考になればと。

※リポジトリの作成等の操作はSKIPしています


環境

Windows 10 Pro (WSL2を利用)
Docker v20.10.17

目次

  1. dockerfileを用意する(例としてPythonが動作するコンテナを作成)
  2. dockerでコンテナを作成する
  3. 作成したコンテナをAmazon ECRにプッシュする
  4. ハマったところ

1. dockerfileを用意する

dockerfile
# Define function directory
ARG FUNCTION_DIR="/function"

FROM python as build-image

USER root

# Install aws-lambda-cpp build dependencies
RUN apt-get update && \
  apt-get install -y \
  g++ \
  make \
  cmake \
  unzip \
  libcurl4-openssl-dev

# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Create function directory
RUN mkdir -p ${FUNCTION_DIR}

# Copy function code
COPY app.py ${FUNCTION_DIR}
COPY aws-lambda-rie ${FUNCTION_DIR}

# Install the runtime interface client
COPY requirements.txt  /
RUN pip install --upgrade pip && \  
    pip install awslambdaric && \
    pip install --target ${FUNCTION_DIR} --no-cache-dir -r requirements.txt 

# Set working directory to function root directory
WORKDIR ${FUNCTION_DIR}

# (optional) for TEST
COPY aws-lambda-rie /usr/bin/
RUN chmod 755 /usr/bin/aws-lambda-rie

ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]
CMD [ "app.lambda_handler" ]

2. dockerでコンテナを作成する

コンテナの作成

docker build -t serverless-function:latest .

デバッグ作業用に立ち上げ

docker run  -p 9000:8080 --entrypoint /usr/bin/aws-lambda-rie  --name serverless  --rm serverless-function:latest  /usr/local/bin/python -m awslambdaric app.lambda_handler

3. 作成したコンテナをAmazon ECRにアップロードする

Amazon Elastic Container Registry に接続するための認証を実施

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin {Amazon ECRのリポジトリURI}.dkr.ecr.ap-northeast-1.amazonaws.com

コンテナの一覧を表示

docker images

dockerコンテナのタグ名称をAmazon Elastic Container Registry用に変更

docker tag {docker imagesで確認したIMAGE ID} {Amazon ECRのリポジトリURI}.dkr.ecr.ap-northeast-1.amazonaws.com/{Amazon ECRのリポジトリ名}

Amazon Elastic Container Registryにpushする

docker push {Amazon ECRのリポジトリURI}.dkr.ecr.ap-northeast-1.amazonaws.com/{Amazon ECRのリポジトリ名}

4. ハマったところ

  • [ERROR] ValueError: Could not reserve memory block

    関数が起動せず、メモリ不足のErrorがCloudWatchで確認できた。AWS初心者のため、ソースコード側でswapファイルを作成したりしていたが解決せず。最終的にはLambda側の設定で利用メモリ設定を大きくすることで解消できた。

  • [ERROR] OperationalError: (sqlite3.OperationalError) unable to open database file

    関数が起動せず、機械学習用のデータベースが開けない旨のErrorがCloudWatchで確認できた。コンテナにDBファイルをあらかじめ用意しておいても同様のErrorが発生する。最終的にはLambda処理内では/tmp配下のみ書き込み可能との記載を発見し、データベースファイルを/tmpに格納することで正常動作を確認できた。

振り返り

詰まったときはAWSの公式ドキュメントをまず確認すべきだったなと。。今回初めてAWSを触ってみましたがドキュメントや機能の充実を実感しました。構築したAPIを外部公開するまでがスムーズにできるので、今後も様々な場面で活用できそうです。

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