LoginSignup
11
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-31

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

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

11
6
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
11
6