You need to specify your MIME type (most commonly, application/json) to be treated as binary (from console: API -> Binary Support). In your Lambda function: `callback(null, { body: base64EncodedBody, status: 200, headers: {}, isBase64Encoded: true })`
- When dealing with uploads have an API call to get a pre-signed S3 upload URL
- When dealing with downloads using HATEOAS and/or the Location header to send the client to S3 to grab the actual file.
It requires some client-side designing around eventual consistency but it works well and is very scalable.