はじめに
機械学習用のライブラリを利用したAPIをLambdaで構築しようとした場合など、
デプロイパッケージサイズ制限(250MB)により利用できないケースがあります。
その場合の対応方法としてコンテナイメージをLambdaで利用できるようになっていますが、
実際にLambdaコンテナイメージを使って構築/動作確認するまでに結構ハマったところがあるのでdockerfile作成からAmazon ECRへのプッシュまでを本記事にまとめます。同じくハマっているひとの参考になればと。
※リポジトリの作成等の操作はSKIPしています
環境
Windows 10 Pro (WSL2を利用)
Docker v20.10.17
目次
- dockerfileを用意する(例としてPythonが動作するコンテナを作成)
- dockerでコンテナを作成する
- 作成したコンテナをAmazon ECRにプッシュする
- ハマったところ
1. 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を外部公開するまでがスムーズにできるので、今後も様々な場面で活用できそうです。