Отвечу по части AWS:
1. Использовать S3 это хорошая идея, как и любое другое хранилище
2. Проблема с недоступностью изображения может быть только в одном из двух случаев:
- перезапись объекта при версионировании (тут работает eventual consistency model)
- попытка запросить адрес до загрузки (может закэшироваться)
В нормальный условиях работает strong consistency и все должно работать адекватно
3. Мои рекомендации:
- включить S3 Transfer acceleration для более быстрой загрузки или же AWS CloudFront (местный CDN)
- делать одноразовые ссылки для загрузки изображений из соображений безопасности (S3 signed url)
- наверняка захочется делать ресайз и обработку картинок "на лету", поэтому посмотреть
сюда
- вам наверняка захочется это где-то сохранять, пускать туда пользователей, поэтому для аутентификации взять Auth0 или Cognito, а для "бэка" взять AWS API Gateway + lambda. Хранить все можно в DynamoDB.
- ExpressJS может не понадобиться, само приложение можно постить статикой на том же S3
- Иногда AWS становится сложно для новичков и можно взять Firebase