optionally, accept an S3 url instead of bucket plus file path