amazon web services - AWS S3 large file reverse proxying with golang's http.ResponseWriter -
i have request handler named download want access large file amazon s3 , push user's browser. goals are:
- to record request information before granting user access file
- to not buffer file memory much. files may become large.
here i've explored far:
func download(w http.responsewriter, r *http.request) { sess := session.new(&aws.config{ region: aws.string("eu-west-1"), endpoint: aws.string("s3-eu-west-1.amazonaws.com"), s3forcepathstyle: aws.bool(true), credentials: cred, }) downloader := s3manager.newdownloader(sess) // can't write directly responsewriter. doesn't implement writeat. // besides, doesn't seem right thing do. _, err := downloader.download(w, &s3.getobjectinput{ bucket: aws.string(bucket), key: aws.string(filename), }) if err != nil { log.error(4, err.error()) return } } i'm wondering if there isn't better approach (given goals i'm trying achieve).
any suggestions welcome. thank in advance :-)
if file potentially large, don't want go trough own server. best approach (in opinion) have user download directly s3.
you can generating presigned url:
func download(w http.responsewriter, r *http.request) { ... sess := session.new(&aws.config{ region: aws.string("eu-west-1"), endpoint: aws.string("s3-eu-west-1.amazonaws.com"), s3forcepathstyle: aws.bool(true), credentials: cred, }) s3svc := s3.new(sess) req, _ := s3svc.getobjectrequest(&s3.getobjectinput{ bucket: aws.string(bucket), key: aws.string(filename), }) url, err := req.presign(5 * time.minute) if err != nil { //handle error } http.redirect(w, r, url, http.statustemporaryredirect) } the presigned url valid limited time (5 minutes in example, adjust needs) , takes user directly s3. no need worry downloads anymore!
Comments
Post a Comment