結構情報転がってる割になぜかハマり続けたので一応メモ
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のレスポンスとして返却されるので注意。
バイナリメディアタイプの指定
設定から指定できます。
バイナリメディアタイプに、バイナリとして扱いたいコンテンツタイプを指定します。
これがないと常にエンコードされた文字列がそのまま返却されます。
エンドポイントを叩く
これだとデコードされずに返却されます。
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