To give my thoughts on Heroku some context, here’s some background on my cloud infrastructure experience… I use AWS to run 2 small Django-based apps. I’m a reluctant sysadmin. I struggle with the plethora of options AWS provides right from the start. Which AMI do I use? What’s latest version of Ubuntu (“Nonsensical Nautilus”?!) and do I want the latest stable version or the most recently released one? Is the best practice to use Virtualenv in production, or is that not trending right now? Do I need to learn Puppet, Fabric, or Salt for deployment? How about process monitoring - that’s supposed to let me sleep through the night when the gunicorns die or celery goes floppy, right? That sounds good. So, do I use Supervisord or does Upstart cover it? I’ve got Postgres running on an EBS; are snapshots good enough for backups? Seems like not really…they’re saving more than just the data and you have to test the backups… Ok ok. I’m feeling at this point like it’s going to be pretty amazing if all of this works in the end. Somehow, I get through it. I keep smarter friends on IM and google-fu until my fingers burst into flames.
So, on my latest client project I decided to try Heroku. I tried to remember why hadn’t done so already. When I first heard about it, it seemed Ruby/RoR-centric. But, I noticed when they launched Python/Django support, so that was no longer keeping me from kicking the tires. I’ll try almost anything if it’s free. Will it be free? Previous googling on that question led me to: maybe? It depends on what you need. So I’d say, “ok, nm then. I already know AWS, so I’ll just use that again.” This time though, I decided I would just not add a credit card to my Heroku account and see if I could deploy some prototypes for my client. It worked great! This is pretty cool. No sysadmin hassles here. The design is fun and well-targeted at hackers. The UX is simple and well-executed. Now wait, how much am I trading in customization options for ease of deployment? Hmm, looks like you can move off the shared database and be able optimize your Postgres or whatever. Looking good. A lot of the complexity has been abstracted away from me, which makes me very happy.
It’s time to add another developer to help out with project tasks. I clean up the code and add my friend as a collaborator for the repository on Github. I tell him, “hey, I’ve been deploying to Heroku. It’s kinda cool. Let’s keep using this during development a little longer.” We do. He likes it. He discovers add-ons. It’s free to add Redis-to-go, Celery, New Relic…oooo, even Sentry is here! I’ve always wanted to try that. Ok, so hang on, this is all free? Yes. Ok, but does it effect performance? Not at this stage (no users, etc.) Well hell-to-the-yes. I think we have a case add-on fever!
We arrive at a feature that requires a Celery queue to handle periodic tasks, and it looks like we’ll finally need to pay for a worker dyno in addition to the free web dyno. Ok, so we’re talking about $36/month. Np. This is still a great deal. Just out of curiousity, what does the pricing look like in the next tiers up?
WHOA?! Memcache goes from 5MB for free to 100MB for $20 and the next one up is…1GB for $90! That’s a mighty large gap there. Let’s look at some other add-ons.
The pricing for CloudAMQP, which offers RabbitMQ-as-a-service, looks like this: 30MB messages/month = free; 2 GB messages/month = $19/month; 20GB messages/month = $99. This is Heroku’s freemium business model in action. You get hooked on add-ons and then your project grows and…wham! You’re paying a premium for these services. But, you’re getting magic and less stress….but, I suck at devops and somehow both of my apps have stayed up for many months on AWS, so…
It takes at least 5 hours to setup AWS. If your rate is $100/hr, that’s $500 out of the project budget right there. It’ll be roughly $100 to run an app on a small EC2 instance with an EBS volume and using S3 for serving up media. Alright, so until Heroku costs more than $100/month + the $500 one-time setup cost, it makes sense to stick with it. This doesn’t even take into account the maintenance and updates you’d have to deal with on AWS, as well. So, let’s enjoy it until it hurts. Hey, maybe the app never gets popular, you never feel any pain, and you’ve saved yourself a bunch of money.
TLDR; Use Heroku until it hurts (or at least during early development.) Then, switch to AWS (unless you get addicted to add-ons and stress-free deployment and have the cash to burn.)
Update: @glenngillen (Lead Engineer - Add-ons Platform at Heroku) replied on Twitter that it’s the add-on providers who set the pricing for add-ons. https://twitter.com/glenngillen/status/218830351307522048
Thanks to @zen4ever, this post was briefly on the HN frontpage! :)