0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Serverless×Pillowで沼った話:Appleシリコン→Lambda(arm64)で通した手順

Last updated at Posted at 2025-09-09

はじめに

「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スタンプガチャ(仮称)

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?