My experience with AWS thus far has been stellar. Their automated phone verification system blew my mind at how quick and seamless it was. It just feels like a high-quality service that's done right. As long as the experience continues like this, Amazon can have my money.
That being said, this experience furthers the notion of how important user experience is for a service/application. The better the user feels using your product, the easier it is for them to open their wallets to you. So, my main priority when developing the client application will be simplicity and ease-of-use. I believe that if an app is easy to use and clear to the user from the get-go, it will lead to an overall pleasant user experience.
My next step is to tie in the S3 storage with my Node.js API. Design wise, there are two ways for me to implement this.
1- Client --> S3:
This method requires the client application to send the file directly to the Amazon S3 server.
- Less stress on API (bandwidth, processing, request handling, etc.)
- Any processing on the file must be done on the client side
- Meta-data still needs to be sent to the API for database entries
- Creation of unique identifiers are done from API, so this will result in more requests for a file upload.
2- Client --> API --> S3
This method requires the client application to send the file and all data to the API who then does processing and uploads the file to the Amazon S3 server.
- No processing needed on Client side
- API can do post processing on all files before they are uploaded to S3
- All meta-data can be stored simultaneously to the file upload, to ensure synchronization.
- More strenuous on the API (bandwidth, processing, request handling, etc.)
For my application, I believe the second solution to be the best choice. I'm going to go with that for now and see how much stress the API will undergo with the file uploads. If it really is strenuous, I may be forced to switch to the first solution. Only time will tell.
Also, for anyone else looking to use Amazon S3 with Node.js, I have found these repositories that you might find helpful: