Question: I have some software running on my AWS cloud and I would like to be able to offer this software package as an on-premise solution so that anyone can configure it on their own servers. What would be the best way to make this process as painless as possible?

For some background, we're running node.js on an Amazon Linux server. We're using a couple of open source NPM packages in addition to our custom code. We're also using MongoDB as a session store and redis as a cache. It's all in one instance for now, but the solution we would provide would have mongodb and redis each on its own server, as well as a Haproxy load balancer server in front of multiple application servers. We use EBS to store our MongoDB data.

Answer: 
This is really a product development question more than a system administration one. 

That said, pretty much what [ceejayoz said](https://serverfault.com/questions/478455/what-would-be-the-best-method-to-provide-my-server-environment-as-a-software-pac#comment530866_478455): Provide it as either a consulting service or a pre-built appliance.

My choice for this would be either a physical or VMWare appliance that has your software installed on an operating system you are comfortable managing, and is sold completely hands-off for the customer: Your team would have to manage the systems end-to-end.

As you scale up this could include "rack-in-a-box" solutions, where you sell your customer an integrated environment in a self-contained rack (all they do is provide power and a network drop to get it into their environment), or solutions where you provide a VMWare cluster implementing the equivalent of the rack-in-a-box.
For such a complex system I would look into provisioning and configuration tools.
You have dozens of choices for the former, and [Puppet](https://puppetlabs.com/puppet/puppet-open-source/) and [cfengine](http://cfengine.com) are two typical examples of the latter.

Don't expect full automation to be an easy task. If you don't expect to produce many copies of the system and to manage them more or less manually you could to with some "bootstrap" bash script to run on freshly-installed systems...