はじめに
「LINEスタンプガチャ(仮称)」というサービスを作る過程で、画像を16分割してZIPにまとめる処理を AWS Lambda + Serverless Framework + Pillow で実装しました。
ところが、AppleシリコンのMacで開発→Lambdaにデプロイする流れで、想定外のエラーに何度もハマりました。
同じように「Serverless × Python × Pillow」を使おうとしている方の参考になればと思い、詰まったポイントと解決策を整理しておきます。
この記事では、この backend 部分(Lambda + Serverless Framework)のハマりポイントを中心にまとめています。
プロジェクト構成
~/Projects/line-gacha/
├── backend/ # バックエンド (AWS Lambda + Serverless Framework)
│ ├── serverless.yml # デプロイ設定
│ ├── requirements.txt # Python依存 (Pillowなど)
│ └── lambda/
│ ├── process.py # 画像分割 & ZIP作成
│ └── download.py # 署名付きURLを返す
└── frontend/ # フロントエンド (Next.js/React)
├── package.json
├── pages/
└── components/
詰まったポイントと解決策
1. Serverless Framework v4 のライセンス罠
原因: v4 からは無料利用でも「ログイン or ライセンスキー必須」になっていた
npm install -g serverlessを実行すると自動で最新版のv4がインストールされた。
解決: v3 に固定して再インストール
npm uninstall -g serverless
npm install -g serverless@3
sls --version
学び: 新規環境はまず sls --version を確認すること
2. Pillowの地雷(No module named 'PIL')
原因: Pillowはネイティブ依存あり。
MacでビルドしたものをそのままLambdaに持っていくと動かない
解決: dockerizePip: true を指定して、Amazon Linux互換環境でビルド
serverless.yml
custom:
pythonRequirements:
dockerizePip: true
slim: true
zip: true
学び: ネイティブ依存は必ずDockerビルドに寄せる
3. アーキテクチャ不一致
原因: Appleシリコン(arm64)でDockerビルド → Lambdaのデフォルトはx86_64で不一致
解決: serverless.yml の provider.architecture: arm64 に揃える
provider:
name: aws
runtime: python3.11
region: ap-northeast-1
architecture: arm64 # ← Apple/Dockerと統一
学び: ビルド環境とLambdaの実行環境は必ず揃えること
4. Internal Server Errorでログが出ない
原因: API Gateway経由だと「500 Internal Server Error」しか返らず、Lambdaの詳細が見えなかった
解決: sls invoke -f で直接Lambdaを叩き、CloudWatchログも確認
sls invoke -f process -d '{"key":"raw/sample.png"}'
学び: デバッグは「直接叩く」が最短ルート
その他ちょっと詰まったポイント
詳しく説明するほどでもないけれど、ちょっと足止めされたところもありました。
macを新調したばかりなので開発環境は全く整っていなかった😅
-
npmが見つからない → Node.js がインストールされていなかったのでbrew install node - IAMユーザーは作成していたけれどアクセスキー、シークレットキーの取得をしていなかった → アクセスキーとシークレットキーを取得して解決
- AWS CLI 未ログイン →
aws configureを実行してアクセスキー/シークレットキーを設定 -
serverless-python-requirementsが無い →npm i -D serverless-python-requirementsですぐ解決
チェックリスト(原因 / 解決 / 再発防止)
| 事象 | 原因 | 解決 | 再発防止メモ |
|---|---|---|---|
| v4ライセンス要求 | v4はアカウント必須 | v3へダウングレード |
sls --version で系統確認 |
| plugin未導入 |
serverless-python-requirementsなし |
npm i -D serverless-python-requirements |
plugins: に追記 |
python3.11なし |
brew未導入 | brew install python@3.11 |
python3.11 -V を確認 |
No module named 'PIL' |
Macビルド非互換 | dockerizePip: true |
常にDockerビルド |
| アーキ不一致 | ARM vs x86_64 |
architecture: arm64 統一 |
ビルド/実行/デプロイで揃える |
| API 500 | API Gateway表層のみ |
sls invoke -f 直叩き |
CloudWatch Insightsで構造化ログ |
最小の serverless.yml
これはサンプル用に最小化したserverless.ymlで、環境変数やバケット名は.envから読み込むようにしています
service: line-stamp-gacha
frameworkVersion: "3"
provider:
name: aws
runtime: python3.11
region: ap-northeast-1
architecture: arm64
memorySize: 1536
timeout: 30
plugins:
- serverless-python-requirements
custom:
pythonRequirements:
dockerizePip: true
slim: true
zip: true
useStaticCache: true
functions:
process:
handler: lambda/process.handler
events:
- http:
path: process
method: post
cors: true
download:
handler: lambda/download.handler
events:
- http:
path: download
method: post
cors: true
実際に動いたレスポンス
{
"statusCode": 200,
"body": "{\"ok\": true, \"jobId\": \"2c9d619e-fe9e-4aa4-9b38-5d72cab19943\", \"zipKey\": \"zips/2c9d619e-fe9e-4aa4-9b38-5d72cab19943.zip\"}"
}
まとめ
- Serverless v3を使う
- dockerizePipでAmazon Linux互換ビルド
- Appleシリコン環境では arm64 に統一
- 500で詰まったら sls invoke -f で直叩き
この4つを押さえれば、Pillowを含むLambdaデプロイはかなり安定します。
同じようにハマった方の助けになれば嬉しいです。
次回はfrontendで詰まったところを紹介します。
紹介
別記事でサービスの紹介も書いています。合わせてどうぞ!
LINEスタンプガチャ(仮称)サービス公開のきっかけになったブログ
LINEスタンプガチャ(仮称)サービスの紹介
週末でサービス公開までやった AWS ベストプラクティス
LINEスタンプガチャ(仮称)