AWS SAMでLambdaを構築するときにハマった話
↓私のやろうとしていたことに当てはまる人です
構成
- M2 Mac(後述します。こいつが一番悪さをしていました)
- Docker(筆者は諸事情でLima上に構築しています)
- Python(Lambda環境)
- AWS SAM
経緯
- pythonパッケージをLambdaに構築する必要が出た
(筆者はopencv、処理速度向上や料金的にarmアーキテクチャで構築したかった) - layer化するにはサイズ上限250MBをオーバーすることが判明
モデルファイル、パッケージ含め500MBと大幅オーバー。 - ローカルからLambda環境をコンテナ化してアップロードしよう!
→ ここでハマりました
Lambda環境を構築する際、パッケージの用意に困る方が多いと思います。
公開済みのLayerで対応できることが一番よいのですが、
パッケージを多様していたり自前でLayer作成することになると
「Lambda環境にパッケージってどうやって環境構築するんだ・・・?」
となり先駆者の方々を参考にpython環境をzip化しようと苦戦していました。
そんなときに見つけた、AWS SAMでコンテナイメージを作成してアップロードする方法にて
パッケージ他丸ごとあげちゃお〜!!と思ったら解決まで5日かかりましたね・・・
結局どこでハマったか
ハマりポイント①
「Dockerfileでpullするイメージのアーキテクチャが開発環境のM2 Macに合っていなかった」
以下、From ~ でECRイメージを記載する際、M2 Macなのでarm64アーキテクチャを指定する必要があります。
※ここではpython3.9-arm64を選択する必要があった。
From public.ecr.aws/lambda/python:3.9-arm64
COPY app.py "モデルファイルやらなんやら" requirements.txt ./
RUN yum install -y "入れたいもの"
RUN pip install -r requirements.txt -t .
CMD ["app.lambda_handler"]
詳しく調べられていませんが、試した組み合わせ的にはarmアーキテクチャのPCでコンテナイメージをpullする際はコンテナイメージ自体のアーキテクチャもarmを選択する必要があるようです。
x86_64の場合は指定不要。後述のlambda設定でarmアーキテクチャを指定しましょう。
ハマりポイント②
「template.yamlでアーキテクチャをarm64指定する必要があった」
sam initで生成されたsamプロジェクト内にtemplate.yamlが含まれていますが、Lambda環境をarmアーキテクチャで構築する際はlambda設定も合わせましょう。
Architectures:
# - x86_64 コメントアウト
- arm64
AWS CLIの準備〜初期状態のディレクトリ構造等は以下の記事を参考にしております。
普段はqiitaを漁る側なのですが、Dockerfileでイメージ指定する際にarm選択されている方を見つけられず
M1/M2 Mac環境で構築される方も増えてきそうだなと思い記事投稿しました。
GitHub上でも私と同じ問題で迷宮入り(笑)になっているケースも見かけたので、
本記事を見て解決の助けになれたら嬉しいです。