Who writes the software that runs on the devices, and downloads the data? Is that software already written?
Thus, we'd need to understand more about the application, and what the real limitation is, as well as whether the receiving software already exists, or whether you write it, or whether someone else writes it.
Another company. Software is still currently being written. I wouldn't call it software, actually, more like firmware. So there is no OS layer, and I don't know much about the hardware specs. So I don't know if the TCP limitation I mentioned is due to a network hardware limitation, or memory constraint, or just pure programming incompetence.
I don't have the source code, I have not seen the source code. Either way, it seems like from the server side, it is a limitation that I should take into consideration.
Also, how is the received data consumed? Is it "played out" or consumed in some real-time way? If so, you just need to send whatever you have, and the device receiving code and TCP stack will do the job of pacing, unless there are some horrible bugs in the device software. Or is the data stored locally, such as written to flash memory or something? If so, again, the device will do the pacing by controlling the TCP window size, and will receive as much as it can as fast as it can, but no faster.
Data will be stored locally on the device flash drive, and there's no streaming capabilities. The device is capable of storing a large file, so the local flash memory capacity is not the issue here. But, it does need to receive the entire file before it can process it.
The reason to put the files on your servers instead of S3 is that getting data out of S3 costs money. If cost is not a problem, then spin up your own machines as simple file proxies and call it good. If cost matters, storing files locally is usually cheaper. For backups, you could use S3, or you could use something like Glacier. There's also the question of deployment -- how does the server software and processes get onto the server hardware in the first place? How do files get injected into the system for serving? There are many different ways of solving these problems, and without knowing what your constraints are, recommending something good is almost impossible. Will your servers run on the Amazon cloud? In private data centers? In a co-location facility? In just one data center? In multiple places around the world? Will there be only one server? Or hundreds? How many clients will connect at any one time?
All of these servers are inside AWS. So, if I use this server as a file proxy/cache, it will only be transfers between S3 and an EC2 instance. According to this Amazon pricing http://aws.amazon.com/s3/pricing/, It seems that if I host this server on the Northern Virginia region, I could get that transfer for free, but otherwise it's $0.02/GB, which shouldn't be too bad.
Region-wise, it should eventually be accessible from around the world. Yes, if someone uploads his file while he's in Europe, travels to Asia, hits the Asian server, the file should still be accessible.
We are so early in the development that a lot of these have yet to be set in stone. We have been using S3 for other things unrelated to this, so that's why it's a natural progression to also S3 for this particular case, unless you can convince me otherwise. I am not sure about using Glacier yet, because well, according to Amazon it's for backup purposes, while the files we are serving need frequent access.
I hope the extra information clear up a lot of confusion.