API Gateway の Lambda プロキシ統合でバイナリデータをレスポンスする(Python3.6)

結構情報転がってる割になぜかハマり続けたので一応メモ

Lambdaのコード

bodyにbase64エンコードしたバイナリデータを指定、isBase64EncodedをTrueに指定します。

def lambda_handler(event, context):

    # binary_dataを用意(省略)
    binary_data = xxxxx

    response = {
       "statusCode": 200,
       "headers":{
           "Content-Type": "image/jpeg",
       },
       "isBase64Encoded": True,
        "body" : base64.b64encode(binary_data).decode('utf-8')
       }
    return response

API Gatewayの設定

統合リクエスト

Lambda プロキシ統合の使用にチェックを入れないと、PythonコードのレスポンスがそのままHTTPのレスポンスとして返却されるので注意。

スクリーンショット 2018-04-01 1.18.57.png

バイナリメディアタイプの指定

スクリーンショット 2018-04-01 1.19.06.png

設定から指定できます。

スクリーンショット 2018-04-01 1.19.14.png

バイナリメディアタイプに、バイナリとして扱いたいコンテンツタイプを指定します。
これがないと常にエンコードされた文字列がそのまま返却されます。

エンドポイントを叩く

これだとデコードされずに返却されます。

curl https://xxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/test > image.jpeg

バイナリメディアタイプに指定したコンテンツタイプをAcceptに指定するとデコードされて返却されます。

curl -v --request GET -H "Accept: image/jpeg" https://xxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/test > image.jpeg

CloudFrontをかませてAcceptの指定をせずともバイナリを返却させる場合は以下の記事が参考になりました。
https://qiita.com/akitsukada/items/e6d8fe68c49973d1edf6#cloudfront

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.