LoginSignup
0
0

AWS Lambdaに画像を送信する

Posted at

この記事は?

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