Как правильно делпоить на AWS?
Имя файла с его хешем или версией - норма! Помимо косяков браузеров, которые в различных граничных ситуациях кешируют то что нельзя, есть еще корявые провайдеры - делающие это кеширование прозрачным.

Самый простой пример возможной работы двух версий одновременно - это возможность обеспечить непрерывную работу во время обновления.

База данных, бакэнд и фронтэнд могут касаться в один момент времени разные версии. Притом что физически база и бакэнд могут во время обновления использовать сразу несколько разных машин, вы не можете атомарно одновременно сменить версии везде

И не только обновление файлов может все поломать. Процесс обновления почти всегда в простом виде обрывает бизнеспроцессы, завязанные на обновляемые данные, особенно это заметно если необходимо обновлять базу, и это занимает время (десятки минут-часы), пользователи в этот момент могут получить сообщения об ошибках или даже нарушение самого бизнеспроцесса вплоть до повреждения данных, если это обновление не учло (например состояния объектов, вы вводите новое промежуточное состояние, а старая версия его не учитывает, старая версия бакэнда может пропустить новое состояние, задав неправильное с точки зрения новой версии или наоборот задать новое там где старые клиенты его не поймут и будут выдавать ошибки).

Кстати, версия, с которой работает клиент может храниться и учитываться в сессии, чтобы случайно по середине бизнеспроцесса пользователь не перескочил, обновив страницу.

В хардкорных случаях может оказаться что необходимо создавать промежуточную версию, учитывающую что в базе могут находиться одновременно данные из разных версий, т.е. пользователи которые начали работать сразу перед началом обновления сидят на старой версии, новые пользователи переводятся на промежуточную, которая сможет работать со всеми тремя версиям, ждем когда старые пользователи закончат работу со старой версией (на этом могут уйти часы или даже дни, все зависит от реализации и бизнеспроцессов), когда таких не останется запускается третья финишная версия, с которой корректно работают клиенты и бакэнд промежуточной версии, ждем когда исчезнут пользователи промежуточной, запускаем финишные скрипты исключения хвостов промежуточной (это могут быть временные таблицы или лишние данные/таблицы от старой).

Очень сложно описывать в общем виде косяки которые могут вылезти, и дай бог если для обновления у вас есть возможность остановить работу, но что делать если у вас миллиарды записей и вам нужно править структуру, на которую может уйти сутки или даже недели? Мало кто может позволить себе остановку бизнеса на такой срок.
Переведите ваше приложение под create-react-app. 
Оно автоматом все файлики собирает с хэшами.
Дальше сделайте дистрибьюцию через CloudFront и после сборки приложения грузите в бакет артефакты сборки (s3 sync). После загрузки вызывайте сброс кэша дистрибьюции CF.
Чтобы не ломать фронт, полностью пишите код обратно совместимым в пределах нескольких последних деплойментов.
Продумывайте стратегию развертываний и т.д. Вплоть до форсирования перезагрузки на клиенте по событию с сервера.