You must reindex into a new index so the name must be different from the old index. An alias is a good way to hide the actual index names from the query clients. That way you can create new versions of an index, call the Reindex API to build up the new index and finally point the alias to the new index.
In my company we also do monthly indices and from time to time we need to reindex because of mapping changes. In order to do that we have a simple rule for mapping an alias to an index:
<alias prefix>_<name>_<yyyy>_<mm>: <index prefix>_<name>_<yyyy>_<mm>_<version>
The alias prefix is a common text string prepended to all our searchable aliases, it was needed to allow clients to search across all aliases (GET /<alias prefix>*/_search?q=...) while skipping over the indices (to avoid duplicate results). The index prefix is also a text string but only prepended to our indices and so only known to our internal systems, typically our indexer engine. This allows us to handle multiple versions of indices and easily change aliases without anyone noticing, e.g.:
POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "int_blog_2017_04-v3", "alias" : "pub_blog_2017_04" } },
{ "add" : { "index" : "int_blog_2017_04-v4", "alias" : "pub_blog_2017_04" } }
]
}'