What are people using for Infrastructure as Code these days?

#1

In my career, I’ve had the fortune to use and learn most of the big configuration management frameworks: CFEngine, Puppet, Ansible, Chef, and now SaltStack. Terraform has fit a nice corner of the market for resource creation, though if you live entirely in AWS, there is CloudFormation. I’m sure Google has its own set of tools as well.

Being relatively new to Clojure and finally finding a job where it’s use is embraced and encouraged, I’m curious what types of Clojure technologies/libraries/frameworks that people have been using to manage their infrastructure? I see that Pallet is a thing, though according to its GitHub Project, there hasn’t been much in the way of updates lately.

With the release and announcement of Cognitect’s aws-api, I’m intrigued to find out if people are using it for managing their AWS resources. One of my projects at my new position is to build out an AWS API Gateway to help our developers break a monolithic application into a more microservice suite. As a fan of Infrastructure as Code and empowering developers to have a hand in managing their projects, what approaches do you suggest?

7 Likes
#2

Hello!

Chiming in to say that I’d really like to see some recommendations on this. I’ve tried to learn operations and how to manage code in production the last year, and I feel that there’s recommendations all over the place, and not really that simple to navigate.

  • Cognitect creates Datomic Ions, which does streamline deployment
  • I’ve had success with Dokku.
    • Install Dokku on your own VPS, and point your domain to it, and it can manage running your servers on it. It uses Docker internally, and builds Docker images based on Heroku buildpacks, which support Clojure natively. So I can git push dokku master, and the rest is handled for me.
    • I like Dokku’s balance between a white box and a black box. You can log into your container if you want, and you could set up a production REPL with some port forwarding and SSH tunneling.
    • Considerations that may vary in your case: I was looking for something simple that wouldn’t rack me up on a huge AWS bill. Learning to use a cloud provider does take time, which I haven’t put down yet. On costs, you can do this on a $5/month DigitalOcean droplet. You’ll have to pay more when 1 GB RAM no longer is enough.

Teodor

4 Likes
#3

The company I work for adores Clojure. So much so that we believe in using wherever it makes sense. Backend services have been in Clojure for sometime. Now the frontend is being transitioned from Javascript to Clojurescript. On the infrastructure side we have been writing out Cloudformation template in Clojure and transforming them into JSON for a couple of years now with a sprinkle of Amazonica to lookup info from AWS. Once Clojure Spec came around we wanted to add specs for the Cloudformation data. This would get us runtime errors if our Cloudformation data didn’t conform to the spec. This would be much better than running the current situation of creating the stack and waiting till if failed because something was missing or wrong. We were about to start writing own specs for Cloudformation but ran into Crucible. Crucible is a library of specs for Cloudformation data. It’s not complete but the maintainers are responsive to pull requests. So we have been adding new specs as we create them. We also have moved to Cognitects aws-api instead of Amazonica because it’s much more lightweight and just a better all around Clojure lib. One benefit I’ve seen from being more Clojure centric on the infrastructure side is some Clojure devs are more willing to participate with creating and maintaining the infrastructure-as-code code. This also is facilitated by keeping the infrastructure-as-code in the same repo as the application code, assuming the infrastructure-as-code is a requirement for that application to run. I find this really helps with sharing ownership with the developers who wrote the code. Anyway, I hope our experience helps with your efforts with Clojure and infrastructure-as-code at your organization.

3 Likes
#4

This is exactly the type of feedback I was looking for! Thank you so much!

1 Like
#5

We have been using Pulumi and it’s been great. A big step up from Terraform and CloudFormation IMO.

#6

What are your views about Flynn?

#7

@kenny, could you go into more detail about your experiences with Pulumi? How well does it work for Clojure/ClojureScript based projects?

#8

@pesterhazy We have several different services all running in AWS. Everything is deployed with a deploy script that takes an environment name (i.e. dev, prod, etc.) and ensures the environment is up and running according to some configuration set in an EDN file. Pulumi makes this easy with the concept of Stacks.

No friction with Clojure/ClojureScript projects. All our services are built as uberjars that run in containers. Pulumi has a nice integration with Docker which makes deployment easy.

The frontend is written in CLJS and deployed automatically via CI to Netlify.

1 Like
#9

Hello!

From a quick review of the docs, it looks like Flynn can manage multiple servers, not only one. And there’s a local API – with Dokku you’ll have to SSH into your host and setup new sites from there.

If I would choose again today, I’d definitely consider Flynn. But so far, Docker has served my needs well.