Skip to content

Refresh IaC tools blog post for AEO#18760

Draft
CamSoper wants to merge 3 commits intomasterfrom
CamSoper/refresh-iac-tools-2026
Draft

Refresh IaC tools blog post for AEO#18760
CamSoper wants to merge 3 commits intomasterfrom
CamSoper/refresh-iac-tools-2026

Conversation

@CamSoper
Copy link
Copy Markdown
Contributor

@CamSoper CamSoper commented May 1, 2026

Refresh of content/blog/infrastructure-as-code-tools/index.md (live at https://www.pulumi.com/blog/infrastructure-as-code-tools/) to hold and grow citation share in AI answer engines for "what is IaC" / "IaC tools" / "best IaC tools" prompts against apiiro.com/blog/best-iac-tools/ and env0.com/blog/iac-tools-for-cloud-automation.

Structural changes

  • Answer-first intro with a tight, citable IaC definition before any Pulumi context.
  • TL;DR shortlist of every tool covered, with one-line summaries.
  • Comparison table near the top: tool, type, language(s), license, state management, best for.
  • H2s restructured as user questions (sentence case): "What is infrastructure as code?", "What are the main types of IaC tools?", "Which IaC tool should I choose?", "Is Terraform or Pulumi better?", etc.
  • Tools grouped by category: multi-cloud provisioning, cloud-native, Kubernetes-native, application/abstraction frameworks, configuration management, policy/security adjuncts, automation platforms.
  • "Which IaC tool should I choose?" decision section with criteria checklist and a short decision tree.
  • ItemList JSON-LD schema embedded for the tool list.
  • Coverage refresh: added SST; added CDK for Terraform with the December 10, 2025 deprecation note; refreshed OpenTofu (Linux Foundation, 1.11 state encryption), Terraform (BUSL post-IBM acquisition), Crossplane (v2, CNCF), and Bicep facts.
  • Tone: covers Pulumi factually alongside others rather than promoting it in every section.
  • Freshness: frontmatter date bumped to today, meta_desc rewritten, visible "Updated May 1, 2026" changelog line.

Out of scope per the brief

  • No FAQ section / FAQPage schema added (the previous FAQ block has been folded into question-style H2s in the body).
  • meta.png left as-is; no other blog posts or docs touched.

Verification

  • make lint passes locally.
  • All internal links use canonical /docs/... paths and have been verified to resolve.
  • Tool licensing, governance, and version facts re-verified against each tool's official site/docs.

Success metric

Hold or grow citation share in AI answer engines for "what is IaC" / "IaC tools" / "best IaC tools" prompts vs. apiiro and env0.


Generated by Claude Code

Restructure content/blog/infrastructure-as-code-tools/ for answer-engine
optimization against competing third-party rankings:

- Answer-first intro with a citable IaC definition
- TL;DR shortlist of every tool covered
- Comparison table near the top (tool, type, language, license,
  state, best for) — single most-cited element type in AI Overviews
- Group tools by category: multi-cloud, cloud-native, Kubernetes-native,
  abstraction frameworks, configuration management, policy/security,
  automation platforms
- Restructure H2s as user questions (sentence case)
- "Which IaC tool should I choose?" decision section
- Add SST and CDKTF (with December 2025 deprecation note)
- Refresh licensing/governance facts (Terraform BUSL post-IBM,
  OpenTofu 1.11 state encryption, Crossplane v2)
- Tone down Pulumi-promotional framing in favor of factual coverage
- Embed ItemList JSON-LD schema for the tool list
- Bump frontmatter date and add a visible changelog line
- Update meta_desc to reflect the new structure
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 1, 2026

Docs review — content/blog/infrastructure-as-code-tools/index.md

Strong AEO-focused refresh: answer-first definition, comparison table near the top, question-style H2s in sentence case, ItemList JSON-LD, sensible category groupings, and a tone that covers Pulumi factually rather than promoting it in every section. Spot-checked all internal links (/docs/iac/, /docs/iac/concepts/{components,pulumi-cloud,state-and-backends}, /docs/iac/comparisons/{terraform,opentofu,crossplane,cloud-templates/cloudformation,cloud-template-transpilers/aws-cdk}, /docs/iac/guides/migration/, /docs/insights/policy/, /docs/esc/, /docs/insights/, /what-is/what-is-infrastructure-as-code/, /blog/announcing-aws-native/, /blog/deploy-wordpress-aws-pulumi-ansible/) — all resolve. Authors asaf-ashirov and isaac-harris both exist in data/team/team/. Frontmatter title is 49 chars and meta_desc is 147 chars — both under SEO limits.

Issues

1. Inconsistent hyphenation in "ad-hoc" (line 20 vs line 356)

Line 20 uses a non-breaking hyphen (U+2011) — ad‑hoc — while line 356 uses a regular ASCII hyphen — ad-hoc. The non-breaking variant on line 20 looks like an AI/typesetting artifact and will hurt search matches if a user types the regular form.

Infrastructure as code (IaC) is the practice of defining cloud and on-premises infrastructure in machine-readable files that are versioned, reviewed, and deployed the same way as application code. Instead of clicking through consoles or running ad-hoc scripts, teams describe the desired state of their infrastructure — networks, virtual machines, databases, Kubernetes clusters, DNS records — and let an IaC tool create, update, and destroy resources to match. The result: reproducible environments, faster recovery, fewer surprises, and a clear audit trail.

2. Hedging language to tighten (per the blog AI-pattern checklist in _common/review-criteria.md)

A handful of weak qualifiers slipped through and are worth removing or sharpening:

  • Line 175: "They typically get day-zero support…" → drop "typically".
  • Line 344: "have generally moved to Pulumi or to Terraform…" → "have moved to Pulumi or to Terraform with hand-written HCL."
  • Line 417: "Single-cloud teams often default…" / "Multi-cloud or hybrid teams almost always end up with…" — at least one of these can be tightened.
  • Line 422: "Platform/IDP teams typically pick the tool…" → drop "typically".
  • Line 466: "Native providers generated from cloud APIs (Pulumi, Bicep, CloudFormation, ARM) tend to outpace community-maintained ones." → "…outpace community-maintained ones."

3. Em-dash density (~45 in the file)

Most em-dashes are functional (TL;DR list separators on lines 30–41, category-list separators on 79–83, criterion-list separators on 396–401). The prose-level usage is heaviest in the intro and "What is infrastructure as code?" — both sections include long parenthetical em-dash pairs (lines 20, 66) plus an em-dash in the very next paragraph (lines 24, 73-ish). Consider replacing one of the parentheticals with a colon list or a real parenthetical to vary rhythm. Not a blocker, but it is one of the most-flagged AI tells per STYLE-GUIDE.md / _common/review-criteria.md.

4. AWS CDK example: scope type narrowed to cdk.App (lines 210–211)

export class MyStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string) {

The conventional CDK idiom uses Construct from constructs, which is what the prior version of this file had. Typing the scope as cdk.App works for the simplest case but rules out nesting the stack under any other construct (e.g., a Stage). Suggest restoring the conventional signature:

import * as cdk from \"aws-cdk-lib\";
import * as ec2 from \"aws-cdk-lib/aws-ec2\";
import * as ecs from \"aws-cdk-lib/aws-ecs\";
import { Construct } from \"constructs\";

export class MyStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const vpc = new ec2.Vpc(this, \"MyVpc\", { maxAzs: 2 });
    const cluster = new ecs.Cluster(this, \"MyCluster\", { vpc });

    const task = new ecs.FargateTaskDefinition(this, \"TaskDef\");
    task.addContainer(\"web\", {
      image: ecs.ContainerImage.fromRegistry(\"nginx:latest\"),
      portMappings: [{ containerPort: 80 }],
    });

    new ecs.FargateService(this, \"MyService\", { cluster, taskDefinition: task });
  }
}

5. Verify the CDKTF deprecation date claim (line 342, 344)

The post states twice that HashiCorp deprecated CDKTF on December 10, 2025. The PR description says facts were re-verified, so this is just a flag: please confirm the exact date (HashiCorp's announcement post or changelog), since this is the single most checkable factual claim added by this refresh and the post hangs a fair amount of analysis on it (decision-tree, table footnote, sub-section opener).

Notes (non-blocking)

  • meta.png size: ~758KB. Within tolerable bounds, but on the larger side for a blog meta image. No action needed if it renders well on social cards.
  • No social: frontmatter block. This is a refresh of an existing post (not a new post), so the social-promotion flag doesn't strictly apply, but adding social: with twitter, linkedin, and bluesky copy would be a cheap way to re-promote the refresh.
  • Decision tree (lines 426–434) uses arrows — nice, scannable, and side-steps additional em-dashes.

Blog publishing readiness checklist

  • meta_image set, file exists (758KB), uses current Pulumi branding (assumed unchanged from prior version)
  • <!--more--> present after intro (line 22)
  • Authors exist with profiles in data/team/team/
  • All internal links resolve (spot-checked)
  • Code examples have language specifiers
  • No animated GIFs used as meta_image
  • Title 49 chars (≤60)
  • meta_desc 147 chars (≤160)
  • social: block — not present (optional for a refresh; would help re-promote)

@claude — mention me if the author wants additional reviews or fixes after addressing the above.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Social Media Review

content/blog/infrastructure-as-code-tools/index.md

X — missing

LinkedIn — missing

Bluesky — missing

No social copy in frontmatter. Suggested copy drafted from the article below.


Suggested copy

X (218/255 chars):

Terraform is BUSL 1.1. CDKTF was deprecated in December 2025. Teams that wanted programming-language IaC for Terraform workflows had to make a call.

We updated the IaC tools comparison. Here's how to pick one in 2026.

LinkedIn (741/2950 chars):

Three things changed IaC tool decisions in the last two years.

Terraform moved from MPL 2.0 to BUSL 1.1 in August 2023. For organizations with strict open-source requirements, that made it a non-starter. OpenTofu emerged as the Linux Foundation fork and is now at 1.11 with client-side state encryption.

CDK for Terraform was deprecated by HashiCorp in December 2025. Teams authoring Terraform configurations in TypeScript or Python had to pick a new path. Most went to Pulumi or back to hand-written HCL.

SST, a framework for full-stack TypeScript apps on AWS, rebuilt its infrastructure engine on Pulumi.

We updated the full comparison — 16 tools across five categories, a decision tree, and a head-to-head on Terraform versus Pulumi.

Bluesky (278/300 chars):

Terraform is BUSL. CDK for Terraform was deprecated in December 2025. OpenTofu is at 1.11. SST moved to Pulumi. A lot shifted, and picking the right IaC tool today means answering different questions than two years ago.

We updated the full comparison. Here's the decision tree.


To apply these suggestions, comment: @claude please update the social posts in the frontmatter with the suggested copy from the social media review above

To re-run the social media review after updates, comment: /social-review

@pulumi-bot
Copy link
Copy Markdown
Collaborator

pulumi-bot commented May 1, 2026

Copy link
Copy Markdown
Contributor Author

@CamSoper CamSoper left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@claude fix issues 1-4 from your review

@pulumi-bot
Copy link
Copy Markdown
Collaborator

pulumi-bot commented May 1, 2026

Claude finished @CamSoper's task in 1m 48s —— View job


Fixes applied — commit 2a94f5d

  • Gather context
  • Issue 1: Fixed non-breaking hyphen (U+2011) → ASCII hyphen in "ad-hoc" (line 20)
  • Issue 2: Removed hedging qualifiers across 5 locations:
  • Issue 3: Replaced em-dash pair in the intro with parentheses — — networks, virtual machines, databases, Kubernetes clusters, DNS records —(networks, virtual machines, databases, Kubernetes clusters, DNS records) — reducing the heaviest em-dash cluster in the post
  • Issue 4: Fixed AWS CDK constructor signature: scope: cdk.Appscope: Construct (from constructs), added props?: cdk.StackProps, and threaded props through to super()
  • Committed and pushed
    · Branch

github-actions Bot and others added 2 commits May 1, 2026 18:38
- Replace non-breaking hyphen (U+2011) with ASCII hyphen in "ad-hoc" (line 20)
- Replace em-dash pair in intro with parentheses to reduce em-dash density
- Remove hedging qualifiers: "typically", "generally", "often", "almost always", "tend to"
- Fix AWS CDK constructor scope type from cdk.App to Construct (from constructs)

Co-authored-by: Cam Soper <CamSoper@users.noreply.github.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

🟰 Skipping social media review — 1 blog file(s) changed, but social block unchanged. The verdict from the prior run still applies. Comment /social-review to force a fresh review.

@CamSoper CamSoper marked this pull request as draft May 6, 2026 17:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants