この記事は?
AWS Lambdaエンドポイントに画像を送って処理をする方法のメモ。結論、base64でエンコードしてjsonとして画像を送れば良い。
本文
リクエストの方法
Lambdaではバイナリとして画像を受信できないようである。バイナリとして画像を送信すると次のようなエラーが出る。
Unable to unmarshal input: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
エラー内容からすると、Lambdaはリクエストをutf-8として解釈するようだ。なので、画像を送信するときはbase64でエンコードして、jsonとして送ってやる必要があると推察される。サイズの大きい画像を送る場合、curlにエンコードした画像をそのまま渡すと、引数が長すぎてエラーが出るため、一度jsonファイルに変換してやる必要がある。
画像ファイルをbase64でエンコードしてjsonに変換.bash
echo "{\"body\": \"$(base64 path/to/image)\"}" > sample.json
jsonに変換した画像をcurlで送信.bash
curl -X POST "lambda/endpoint" \
-H "Content-Type: application/json" \
-d @sample.json
Lambdaの実装
body
キーにbase64でエンコードした画像を割り当てたので、値を取り出してデコードする。以下はデコードした画像のサイズを返すサンプル関数。
import base64
import io
import os
from PIL import Image
def handler(event, context):
image_b64 = event['body']
image_bytes = base64.b64decode(image_b64)
image = Image.open(io.BytesIO(image_bytes))
return str(image.size)