News for hackers. Stuff that matters.
Re:Terraform 0.12 by tptacek on Wednesday May 22, 2019 @11:47PM (#19988240)
I mean, this is harsh, but there's a running joke that the big feature terraform is missing is a -twice flag so that it'll re-run itself on failure, since that's what you end up having to do anyways.

Also, the terraform language, HCL? It's, I guess there's no better way to put this: not good.

Am I misunderstanding the complexity of what Terraform is trying to do? To me, it looks like a bunch of tiny API clients tied together with a topological sort --- in other words, it's just another species of "make". It feels like it carries a whole lot more complexity than that concept warrants, but just enough simplicity to make it not a serious programming language. It's, to me, one of those frustrating uncanny valley systems.

I am prepared to be totally wrong about this.

Re:Terraform 0.12 by ReidZB on Thursday May 23, 2019 @01:46AM (#19988842)
Yeah, HCL's limitations have been an enormous thorn in my side for a long time. HCL2 (Terraform 0.12) is a big step forward, but even still I pine for a proper programming language, even if it has foot-guns.

I do think you're selling Terraform short, though. Sure, the core is the toposort-create-things. But it also stores the state of its created things and (crucially) has the ability to diff the actual state of resources against what it thinks they ought to be.

Being able to inspect existing resources and diff state is also what lets it import existing resources, so that they can be Terraform-managed going forward.

Terraform is also capable of determining if its planned changes can be performed in-place or if they require resources to be destroyed and re-created. That boils down to a boolean flag on a field, ultimately, but it's still something a dead-simple make clone probably wouldn't do well.

I've only really used Terraform seriously for AWS, so I'm not sure about the other providers, but the Terraform AWS Provider has an enormous amount of work behind it. Basically every resource API has schema validation written in the AWS provider, and depending on the resource there are often eventual-consistency issues handled by the provider. See for example [0].

In contrast, AWS CloudFormation: can't import existing resources; isn't always sure whether an update will require replacement or not; and, as of ~6 months ago, can detect configuration drift, but not correct it (!). Of course, CloudFormation wins in other areas...

[0]: https://github.com/terraform-providers/terraform-provider-aw...

Re:Terraform 0.12 by gnosek on Thursday May 23, 2019 @03:38AM (#19989422)
Long-time user of Terraform here, never used CloudFormation. Where does CloudFormation beat Terraform?
Re:Terraform 0.12 by scarface74 on Thursday May 23, 2019 @08:47AM (#19991176)
CloudFormation has an “easy button” if you are part of an organization with a business support plan from AWS. If you can’t figure out something you can submit a ticket and start a chat.

Also CF is the “native” language of AWS. There are plenty of getting started examples from AWS where they give you the template. Also Elastic Beanstalk extensibility is built on top of CF.

Not to mention Codestar that will set up environments for you for common use cases and exports templates and the lambda environment lets you configure everything from the console, test it and then you can export the CF definition.

Re:Terraform 0.12 by ReidZB on Thursday May 23, 2019 @11:31AM (#19992655)
So, I think it does win in a few areas...

Like one sibling comment mentioned, getting support from AWS is nice. You can buy Terraform support, too, but knowing HashiCorp it'd probably cost more than most peoples' AWS bills in their entirety. (This is me being a little cheeky and unfair—HashiCorp handles community support via GitHub Issues for Terraform really well.)

CloudFormation's built straight into AWS, so there's no need to set up state file storage or locking or worry about a state file at all, really. This has its own set of drawbacks, but it's nice for getting started, and in theory it makes CloudFormation more robust out-of-the-box.

CloudFormation StackSets are really nice if you have identical resources that need to be placed in many different regions and accounts. (Example: we use it to place GuardDuty and Config, both regional services, in every region.) With Terraform, this means copy-and-paste, as far as I know, though maybe Terraform 0.12 sets up the groundwork to make this better?

The Service Catalog is basically a way to let technical end-users manage products via CloudFormation templates. Something could be built to do the same for Terraform, but I don't think there is anything like that right now.

CloudFormation does (attempt to) roll back to a known-good state if an update fails. Terraform just stops in the middle of what it was doing. I have mixed feelings about that.

I find YAML to have better tooling/editor support than HCL, though I actually prefer HCL.

There are existing CloudFormation wrappers (e.g. Troposphere) that can give you a full programming language on top of CloudFormation. To my knowledge, there isn't anything similar for Terraform.

Some things that have changed with 0.12:

CloudFormation has had `AWS::NoValue` for as long as I can remember. Terraform <=0.11 had special values (like empty string, number zero, etc.) that were special-cased as no value. Terraform 0.12 now has `null` properly.

Terraform <=0.11's ternary operators were maddening because both sides were evaluated, which led to errors, unlike CloudFormation's !If. In Terraform 0.12, the ternary only evaluates one side.

Re:Terraform 0.12 by mirceal on Thursday May 23, 2019 @09:57AM (#19991823)
Cloudformation will leave your infrastructure in a consistent state. Period. It will consistently drive things from point A to point B or rollback to point A if it cannot get to B. It will also correctly remember all the resources it created and allow you to properly identify them and/or delete them. These sound like tablestakes but Terraform cannot do this. Add the frustrations of HCL on top and it’s a big no go for me.
Re:Terraform 0.12 by ReidZB on Thursday May 23, 2019 @11:08AM (#19992441)
I've had CloudFormation fail to roll back plenty of times, though never in a situation where it actually mattered.

I've never had Terraform "forget" resources or disallow me from deleting them (unless I requested that). Maybe those are bugs that've since been fixed?

It sounds like we've had very different experiences with these tools.

Re:Terraform 0.12 by alexbanks on Thursday May 23, 2019 @12:33PM (#19993237)
My experience with CloudFormation has been consistent with what you just said. CF will fail to delete resources and then lock them in that state, requiring AWS tickets and reps and all that. I have not had anything like that in TF.
Re:Terraform 0.12 by guitarbill on Thursday May 23, 2019 @04:24AM (#19989652)
> can detect configuration drift, but not correct it

if by "correct it" you mean update the current template to match what's there, that'd be good, as AFAIK there's no easy way to do this at the moment. if by "correct it" you mean revert or change resources, no thanks. that sounds like a production accident waiting to happen, and you can un-drift (?) resources manually already.

Re:Terraform 0.12 by ReidZB on Thursday May 23, 2019 @10:57AM (#19992340)
I do mean revert or change resources. Making manual changes outside the context of an IaC tool is largely madness, in my opinion, although sometimes the situation warrants it.

Auditability and controls are one of the many facets of IaC. We require code changes to be approved by another developer, and similarly we require infrastructure changes to be approved by another developer. Regularly working outside the IaC tool would be in violation of that policy.

It's in this approval step that the change-set (CFN) or plan (Terraform) should be carefully reviewed by a human. If someone's made manual changes, reversion of them should appear here, and those should be unusual and eyebrow-raising. At that point, it's either fix the IaC definition of the infrastructure, manually un-drift it as you say, or do some workaround to ignore specific changes.

(To reiterate, IMO no one should ever run CFN/Terraform unattended on prod infrastructure, and there should always be a step to review the change-set/plan.)

I'll also say that the sword cuts both ways when it comes to prod outages and manual changes. Not so long ago, I ran into a prod-impacting issue when turning on multi-AZ for an RDS instance. In the other regions that had multi-AZ enabled, someone had manually added an extra parameter to the RDS parameter group, one that was required for certain app functionality to work. No one ever added it back to CloudFormation and that knowledge was eventually lost. When we enabled multi-AZ in a different region, we expected no problems at all, but instead we ended up with a whole section of app functionality breaking.

(This would've been before drift detection was a thing in CloudFormation, but actually I don't think RDS parameter groups are supported in CloudFormation's drift detection right now anyway. [0])

[0] https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGui...

Re:Terraform 0.12 by guitarbill on Thursday May 23, 2019 @04:28PM (#19995564)
AWS Config proves additional guarantees/monitoring/auditing, but many people don't use it cause it costs money.
Re:Terraform 0.12 by ReidZB on Thursday May 23, 2019 @05:14PM (#19996033)
Speaking of, they recently changed the pricing model for (part of) Config. It should be much cheaper now. https://aws.amazon.com/blogs/aws/new-updated-pay-per-use-pri...
Re:Terraform 0.12 by mirceal on Thursday May 23, 2019 @10:04AM (#19991882)
detecting resources that are already there may be useful in a limited set of scenarios (prototypes / retrofitting) but definitely should not be the way you build things. thinking through what your cloud infra is doing and expressing it is the way to go.

there is also a way to do this for cloudformation. look up cloudformer.

Re:Terraform 0.12 by ReidZB on Thursday May 23, 2019 @11:06AM (#19992420)
I agree, importing resources is a limited use-case. However... it's one I find myself in more often than I would like. Reality is often disappointing. At least, with the companies I've work(ed) with.

That said, I don't think CloudFormer does the same thing. I haven't used it before, so please correct me if I'm wrong, but to me it looks like it takes existing resources and generates a CloudFormation template out of them. But then you're still expected to upload that template and create a new stack, with all brand-new CloudFormation managed resources—is that right?

So for example, CloudFormer for an RDS instance would probably be a no-go.

In the Terraform case, after you've imported resources, there's no need to re-create them. There's the question of if what's in the template will match what the resources actually are, but there are also tools to generate Terraform templates straight off resources.

Re:Terraform 0.12 by MrBuddyCasino on Thursday May 23, 2019 @02:01AM (#19988906)
Well said. Its basically ANT for the cloud, in that its an annoyingly limited DSL with just enough power to work, but in a verbose and frustrating way.

Speaking of real code (not YAML or HCL) as infrastructure, anyone have experience with Pulumi?

Re:Terraform 0.12 by mellab2 on Thursday May 23, 2019 @08:25AM (#19991002)
I've been using Pulumi for a few weeks now and it works pretty much exactly as advertised (for AWS at least). I am yet to run into any major hurdles and for any minor issues I have had the Pulumi team have been very responsive (they have a public Slack channel available).

It actually uses terraform's API's under the hood which is comforting in a way because you know it's building on a solid foundation.

I would not go back to writing HCL after experiencing Pulumi if I can avoid it, using a "real" programming language just feels a whole lot more natural and allows for much more powerful abstractions.

Re:Terraform 0.12 by ownagefool on Thursday May 23, 2019 @07:09AM (#19990570)
It basically depends on the formation of your team.

A bunch of oldschools sysadmins who "don't code"? Terraform is ridgid and on-rails enough that it probably helps sort of keep things sensible compared to just using boto. Almost like it was a framework, specifically defined to do that sort of thing.

It does sort of suck though, but what sucks less?

Edit: My solution is to stick as much as possible into k8s, but obviously that comes with its own warts, and to be fair to terraform, a lot of terraforms warts are just the underlying API warts leaking through.

Re:Terraform 0.12 by jordanbeiber on Thursday May 23, 2019 @02:21AM (#19989005)
The most sensible way I’ve used TF was to create an api for others to consume, containing models of terraform modules.

Users can pick and chose what modules, how many and set some params which are then validated.

The components are then rendered as json, fully declarative, no counts, no fancy TF hacks.

Data sources and a couple of home grown providers take care of whatever needs to be dynamic.

This way a lot of foot-guns are removed for consumers, and it simplifies the whole thing. At the expense of writing some code... worth it though, in a more enterprisey setting.

Re:Terraform 0.12 by peterwwillis on Thursday May 23, 2019 @01:45AM (#19988837)
No, it's pretty straightforward, terraform is just intended to parse and execute random functions in a graph generated by a template language. It is absolutely a form of 'make': overcomplicated and generic to serve the needs of supporting random companies' infrastructure as versioned code, without having to write the implementation bits.

It's a good idea and not a bad design, but the user experience is pretty bad and nearly all the operational aspect is an afterthought. It was not built to be sold as a product, hence it kind of sucks as a product, but it's fine as a free tool. The fact that it's the best free tool we have for this task speaks volumes about how most companies are deathly afraid to work as a community to build better solutions.

Re:Terraform 0.12 by ofrzeta on Thursday May 23, 2019 @01:51AM (#19988863)
Well, judging from the release notes, with for-loops you are now one step closer to a real programming language. Looks like the beginning of the end of the "declarative" paradigma which keeps people running their heads against the wall like this https://blog.gruntwork.io/terraform-tips-tricks-loops-if-sta...
Re:Terraform 0.12 by crucialfelix on Thursday May 23, 2019 @08:01AM (#19990851)
Those are list / map comprehensions. So it's still declarative—you can't iterate and do anything while iterating. Only transform items in a list.

https://www.hashicorp.com/blog/hashicorp-terraform-0-12-prev...

Re:Terraform 0.12 by mirceal on Thursday May 23, 2019 @10:00AM (#19991851)
the complexity of Terraform does not come from the happy path. It comes from when things go wrong and now you have to understand what went wrong and how to correct it. Now you’re in a world of pain since TF just throws its hands in the air and you’re left holding the bag. i have hear several people referring to terraform as Terrafail. I have also observed good dev/devops people struggling to make it work when shit hits the fan.