Skip to content
Notifications
Clear all

Unpopular opinion: Most IaC migrations are driven by resume-building, not actual need.

1 Posts
1 Users
0 Reactions
1 Views
(@llm_eval_curious_42)
Estimable Member
Joined: 4 months ago
Posts: 57
Topic starter   [#4794]

Having spent considerable time evaluating language models for code generation and infrastructure-as-code tasks, I've observed a fascinating and often counterproductive pattern in our industry. The discourse around IaC tooling, particularly migrations, frequently mirrors the "model-of-the-week" hype cycle in AI, where the technical merits are often secondary to perceived career capital. I propose that a significant portion of migrations from, say, Terraform to Pulumi, or from CloudFormation to CDK, are motivated more by the desire to list a trendy technology on one's resume than by a genuine, quantifiable deficiency in the incumbent stack.

Let's examine the common justifications through a benchmark lens, much like we'd compare LLM outputs:

* **"Our Terraform HCL is unmaintainable; we need a real programming language (like Pulumi/CDK)."**
This often reflects a failure in code organization and review, not a language limitation. Poorly structured TypeScript or Python IaC can become an equally unmaintainable, but now Turing-complete, nightmare. The migration cost—rewriting hundreds of resources, managing state migration, retraining teams—is rarely justified by this alone.
* **"The new tool has better state management / performance."**
While true in some edge cases, for most mid-scale deployments, optimization of existing code and state isolation practices yield greater ROI. The actual performance delta, when measured, is often marginal compared to the migration overhead.
* **"We're standardizing on [New Vendor's] ecosystem."**
This can be valid, but requires scrutiny. Is the lock-in and retooling cost truly offset by the benefits? Or is it a decision driven by a few architects seeking to bolster their personal expertise in a marketable niche?

Consider a typical "migration" block. The functional equivalence is clear, but the complexity and learning curve shift dramatically.

```hcl
# Terraform: Simple, declarative S3 bucket with lifecycle rule.
resource "aws_s3_bucket" "logs" {
bucket = "app-logs-${var.env}"

lifecycle_rule {
id = "expire"
enabled = true
expiration {
days = 30
}
}
}
```

```typescript
// Pulumi: Equivalent, but now requiring understanding of async/await, SDK patterns, and proper error handling.
import * as aws from "@pulumi/aws";

const logsBucket = new aws.s3.BucketV2("logs", {
bucket: `app-logs-${env}`,
});

new aws.s3.BucketLifecycleConfigurationV2("logsLifecycle", {
bucket: logsBucket.id,
rules: [{
id: "expire",
status: "Enabled",
expiration: {
days: 30,
},
}],
});
```

The latter is not inherently better; it's different. The migration effort—thousands of such conversions, state import risks, and debugging new provider bugs—is monumental. When I query LLMs to assist in these migrations, they can generate the syntactic translation, but they cannot answer the strategic question: *should* this be done?

I invite discussion on concrete, measured examples. Has anyone conducted a post-migration analysis comparing:
* Deployment frequency/lead time before and after?
* Incident rates related to IaC errors?
* Onboarding time for new engineers?
* **Crucially, the total person-months spent on the migration versus the accrued benefits?**

Without this data, we are likely optimizing for local maxima in individual careers rather than global maxima in system stability and team velocity. The most efficient infrastructure code is often the boring, well-understood one you already have, not the one that will look impressive on a CV.


Prompt engineering is engineering


   
Quote