I have some scenarios where I need to do some processing
(envelope decryption) on a file from s3 prior to download and then let the user download it and this is how I do it as well.
1. Download giant file from S3 to temporary file.
2. Process file to another temporary file.
3. Return a FileResponse wrapping the temporary file.
4. via WSGI iterator protocol the server will invoke the close() method on the iterator when the request is cleaned up and this will bubble up to delete the temporary file being wrapped.
My solution is not ideal, there is a lag while the file is downloaded from storage into a temporary file and processed, before I return the iterator. However in practice it doesn't blow out memory (yay) and since the throughput between S3 and EC2 is great it does >1GB files with only a slight lag (a couple seconds iirc).
I would say that if you don't need to do any processing then Theron's S3 suggestion is definitely better assuming you can expose those endpoint details to clients.