Skip to main content
Cloud Migration9 min read

Cloud Onboarding Is Getting Faster. Your IaC Governance Needs to Move Just as Fast.

Pulumi’s recent updates make it easier to connect cloud accounts, control AI-assisted infrastructure work, and strengthen user authentication with passkeys. For teams modernizing infrastructure, the opportunity is clear: reduce migration friction without letting governance, identity, and policy controls lag behind.

Cloud migration teams have spent years trying to remove friction from infrastructure onboarding. Now that connecting cloud accounts to infrastructure-as-code platforms can happen in minutes, the bottleneck is shifting from setup to governance.

That is a good problem to have, but it is still a problem. Faster onboarding, AI-assisted infrastructure changes, and easier authentication can accelerate modernization only if teams also tighten identity controls, permissions, policy-as-code, and operational guardrails.

Context: IaC onboarding is becoming less painful

Cloud Onboarding Is Getting Faster. Your IaC Governance Needs to Move Just as Fast.
Cloud Onboarding Is Getting Faster. Your IaC Governance Needs to Move Just as Fast.

Pulumi recently introduced a faster way to connect cloud accounts to Pulumi, positioning the process as something teams can complete in minutes rather than through a long sequence of manual setup steps. In the Pulumi blog post Connect Your Cloud Accounts to Pulumi in Minutes, the company describes a streamlined path for connecting cloud environments so teams can start managing infrastructure through Pulumi more quickly.

For developers and platform engineers, this matters because cloud account onboarding has historically been one of the least glamorous parts of infrastructure modernization. Before a team can refactor Terraform, adopt Pulumi, standardize environments, or migrate workloads, someone has to wire up access to cloud accounts, configure credentials, validate permissions, and ensure the IaC platform can see and change the right resources.

When that process is slow, modernization slows with it. Teams delay migrations, keep using clickops for exceptions, or maintain fragmented deployment processes because the cost of onboarding one more account, subscription, or project feels too high.

Pulumi’s update reflects a broader trend: IaC platforms are reducing setup overhead so teams can move faster. That is especially relevant for organizations consolidating cloud estates, moving from manually managed infrastructure to declarative workflows, or rebuilding deployment foundations as part of a larger application modernization effort.

But the easier it becomes to connect accounts, the more important it becomes to define what should happen after the connection is made.

Faster access changes the governance equation

In a traditional onboarding model, governance often happens informally because the process is slow. Security and platform teams review requests, set up roles, approve accounts, and manually confirm that access is scoped correctly. That manual friction is not ideal, but it does create opportunities for review.

When onboarding becomes self-service or near-instant, those review points need to be replaced with automated controls. Otherwise, the organization trades one problem for another: less migration friction, but more risk of over-permissioned accounts, inconsistent standards, and unreviewed infrastructure changes.

This is where CTOs and engineering leaders should pay close attention. Faster onboarding is not just a developer experience improvement. It is a change to the organization’s control plane.

Account-scoped permissions need to be intentional

The first question is not whether a team can connect a cloud account. It is what that connection is allowed to do.

For each account or subscription, teams should define clear permission boundaries. Development accounts may allow broader experimentation. Production accounts should require stricter roles, approval flows, and policy checks. Shared services accounts, such as networking, identity, observability, or security tooling, may need separate access models entirely.

A practical approach is to treat every cloud account connection as a governed resource. Document the owner, purpose, environment, allowed operations, and escalation path. Then encode those expectations in IAM roles, Pulumi organization settings, policy-as-code rules, and CI/CD workflows.

If your modernization strategy includes moving legacy infrastructure into IaC, this is especially important. Imported resources often carry years of ad hoc configuration decisions. Connecting those accounts quickly is valuable, but teams still need to prevent accidental drift, destructive updates, or broad permissions that make cleanup harder later.

Identity controls are part of infrastructure governance

Pulumi also announced that Pulumi Cloud now supports passkeys for users who sign in with email and password. This is a meaningful security improvement for teams that rely on Pulumi Cloud as part of their infrastructure workflow.

Passkeys reduce reliance on traditional passwords and help protect against phishing. For engineering organizations, that matters because IaC platforms sit close to production authority. A compromised IaC account can become a path to cloud configuration changes, secret exposure, or service disruption.

This does not mean passkeys replace broader identity strategy. Teams should still use single sign-on where appropriate, enforce multi-factor authentication, review organization membership, and remove inactive users. But passkey support is a useful step for organizations that have users signing in with email and password, especially during transitions when not every team has fully adopted centralized identity.

For modernization programs, identity cleanup is often as important as code cleanup. Migrating infrastructure to IaC without modernizing access control simply moves old risk into a new workflow.

AI-assisted infrastructure work needs budget and blast-radius controls

The third Pulumi update worth watching is the introduction of usage limits for Pulumi Neo, Pulumi’s AI agent for infrastructure work. AI-assisted infrastructure tooling can help teams understand configurations, generate changes, and reduce repetitive work. But as these tools become embedded in developer workflows, usage governance becomes operational governance.

Usage limits are partly about cost management, but they are also about control. Teams need to know who can use AI-assisted infrastructure features, how much they can use them, and in which contexts. Unbounded usage can create unexpected spend, but it can also encourage unreviewed experimentation in environments where changes should be deliberate.

AI agents should not bypass engineering process

AI can help generate infrastructure code, summarize changes, or assist with migration tasks. It should not become a shortcut around review, testing, or approval.

The same rules that apply to human-authored IaC should apply to AI-assisted IaC:

  • Changes should be committed to version control.
  • Pull requests should include readable diffs and context.
  • Policy-as-code checks should run before merge or deployment.
  • Production changes should use approved pipelines.
  • Drift detection and audit logs should remain enabled.

The value of an AI infrastructure agent is speed and leverage. The risk is that speed outpaces review. Usage limits help, but teams should combine them with process limits: environment boundaries, role-based permissions, mandatory previews, and policy enforcement.

This is particularly relevant for teams modernizing large estates. AI assistance can be useful when converting legacy scripts, generating resource definitions, or exploring existing infrastructure. But the output still needs human ownership and automated validation.

Policy-as-code becomes the modernization safety net

When cloud onboarding gets easier and AI assistance becomes more available, policy-as-code becomes less optional.

Policy-as-code lets teams define infrastructure rules in a way that is testable, repeatable, and enforceable. Instead of relying on humans to remember every standard, teams can encode rules around tags, regions, encryption, public access, instance types, network boundaries, and required observability.

For example, teams can enforce that:

  • Production resources must have owner and cost-center tags.
  • Storage buckets cannot be publicly readable.
  • Databases must enable encryption and backups.
  • Cloud resources must be deployed only in approved regions.
  • Kubernetes clusters must use approved node types and network settings.
  • AI-assisted changes cannot be applied directly to production without review.

These controls are especially useful during migration because modernization often increases the rate of change. Teams are importing resources, decomposing monoliths, moving workloads between accounts, and rebuilding deployment patterns. Without policy-as-code, every team has to rediscover the same standards. With it, the platform can guide teams automatically.

Pulumi’s broader ecosystem also points in this direction. The related Pulumi discussion of knowledge as code and memory file specifications highlights an industry trend toward making operational knowledge more structured and reusable. Whether teams express that knowledge as policies, templates, golden paths, or documentation, the goal is the same: reduce dependency on tribal knowledge.

Practical implications for engineering teams

For developers, platform engineers, and CTOs, the takeaway is not to slow down onboarding. The takeaway is to pair faster onboarding with stronger defaults.

1. Define an account onboarding standard

Create a standard checklist for every cloud account connected to your IaC platform. Include account owner, environment classification, permission scope, approved regions, logging requirements, and incident contacts. Treat this as part of your platform contract.

2. Separate experimentation from production authority

Give teams room to move quickly in sandbox and development environments. Keep production access narrow, auditable, and pipeline-driven. If AI-assisted tooling is available, make sure it operates within the same environment boundaries.

3. Review identity before scaling access

Adopt passkeys or SSO-backed authentication where available. Remove dormant users, standardize group membership, and ensure privileged access is reviewed regularly. Infrastructure modernization should include identity modernization.

4. Put usage limits on AI-assisted workflows

Use Pulumi Neo usage limits as part of a broader governance model. Decide which teams can use AI infrastructure assistance, set practical usage budgets, and monitor patterns. If usage spikes, treat that as a signal to review whether teams need better templates, documentation, or platform support.

5. Make policy checks visible to developers

Policy-as-code should not feel like a mysterious gate at the end of a deployment. Surface policy failures early in pull requests and previews. Provide clear remediation guidance so developers can fix issues without waiting on a platform team.

6. Modernize incrementally, but govern consistently

Not every application or account will move at the same pace. That is normal. What matters is that each step toward modernization uses consistent controls. A partially modernized estate with consistent governance is easier to maintain than a fast migration with fragmented standards.

What this means for software maintenance and modernization

At Vibgrate, we often see modernization efforts succeed or fail based on operational details rather than architectural ambition. Teams know they need to upgrade runtimes, migrate workloads, reduce cloud sprawl, and replace manual processes. The hard part is doing it safely while production systems keep running.

Easier cloud account onboarding helps because it reduces the activation energy required to bring infrastructure under management. AI-assisted infrastructure work helps because it can reduce toil and speed up repetitive tasks. Stronger authentication helps because the infrastructure control plane is only as secure as the identities that can access it.

Together, these updates point toward a more accessible IaC future. But accessibility without governance can create maintenance debt just as quickly as it removes migration friction.

Conclusion: acceleration needs guardrails

Pulumi’s recent updates are a useful signal for engineering leaders: the tools for infrastructure modernization are becoming faster, more integrated, and more developer-friendly. Connecting cloud accounts in minutes, setting usage limits for AI-assisted infrastructure work, and supporting passkeys all reduce practical barriers to modern cloud operations.

The next challenge is organizational. Teams need governance models that move at the same speed as the tooling: identity controls, account-scoped permissions, usage limits, automated policies, and clear ownership. When those pieces are in place, faster onboarding does not just make modernization easier. It makes it safer, more repeatable, and easier to maintain over time.

Vibgrate CLI

See a real scan run

A replay of the actual CLI running against our test repositories — live progress, real findings, a genuine DriftScore. Nothing executes in your browser.

Replay
demo@vibgrate — bash
❯ npx @vibgrate/cli scan
 
╭──────────────────────────────────────────╮
│ Vibgrate Drift Report │
╰──────────────────────────────────────────╯
 
── node-turborepo (node) .
Runtime: >=18.0.0 (6 majors behind)
Frameworks:
Turbo: 1.13.4 → 2.11.8 (1 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Dependencies:
1 current 1 1-behind 3 2+ behind 1 unknown
 
── @repo/admin (node) apps/admin
Frameworks:
TanStack Query: 5.104.2 → 5.104.2 (current)
React: 18.3.1 → 19.3.0 (1 behind)
React DOM: 18.3.1 → 19.3.0 (1 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Vite: 5.4.21 → 8.3.4 (3 behind)
Dependencies:
3 current 9 1-behind 3 2+ behind 4 unknown
 
── @repo/api (node) apps/api
Frameworks:
Express: 4.22.3 → 5.3.0 (1 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Vitest: 1.6.1 → 5.0.4 (4 behind)
Dependencies:
7 current 4 1-behind 4 2+ behind 4 unknown
 
── @repo/web (node) apps/web
Frameworks:
Next.js: 14.2.35 → 16.4.0 (2 behind)
React: 18.3.1 → 19.3.0 (1 behind)
React DOM: 18.3.1 → 19.3.0 (1 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Dependencies:
2 current 6 1-behind 3 2+ behind 5 unknown
 
── @repo/config (node) packages/config
Frameworks:
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Dependencies:
2 current 2 1-behind 5 2+ behind 0 unknown
 
── @repo/database (node) packages/database
Frameworks:
Prisma: 5.22.0 → 7.10.0 (2 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Dependencies:
1 current 0 1-behind 3 2+ behind 1 unknown
 
── @repo/types (node) packages/types
Frameworks:
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Dependencies:
0 current 0 1-behind 1 2+ behind 1 unknown
 
── @repo/ui (node) packages/ui
Frameworks:
React: 18.3.1 → 19.3.0 (1 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
React: 18.3.1 → 19.3.0 (1 behind)
Dependencies:
1 current 4 1-behind 1 2+ behind 1 unknown
 
── @repo/utils (node) packages/utils
Frameworks:
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Vitest: 1.6.1 → 5.0.4 (4 behind)
Dependencies:
0 current 1 1-behind 2 2+ behind 1 unknown
 
Tech Stack
Frontend: React, React DOM
Meta-frameworks: Next.js
Bundlers: tsx, Turbo, Vite
CSS / UI: Autoprefixer, PostCSS, Tailwind CSS
Backend: Express
ORM / Database: Prisma, Prisma Client
Testing: Vitest
Lint & Format: ESLint, ESLint Prettier, ESLint React, Prettier, typescript-eslint
 
Services & Integrations
Auth: JWT 9.0.3
Databases: Prisma 5.22.0
 
TypeScript
v5.3.3 · strict ✔ · MIXED · target: ES2022
 
Build & Deploy
Package Managers: pnpm
Monorepo: npm-workspaces, pnpm-workspaces, turbo
 
Product Purpose Signals
Frameworks: react, nextjs
Evidence: 177
Top Signals:
- [heading] Dashboard (apps/admin/src/pages/Dashboard.tsx)
- [title] Revenue Overview (apps/admin/src/pages/Dashboard.tsx)
- [copy] workspace:* (packages/ui/package.json)
- [copy] ./dist (packages/ui/tsconfig.json)
- [copy] ./src/index.ts (packages/ui/package.json)
- [copy] @repo/config/tsconfig-base.json (packages/ui/tsconfig.json)
- [copy] @repo/ui (packages/ui/package.json)
- [copy] #3b82f6 (apps/admin/src/pages/Dashboard.tsx)
Unknowns:
- No pricing or billing evidence found.
- No integrations/connectors evidence found.
- No route structure evidence found.
 
Security Posture
Lockfile ✖ · .env ✔ · node_modules ✔
 
Platform
Native modules: turbo
 
Code Quality
Files: 36 · Functions: 183 · Avg complexity: 2.62 · Avg length: 21.13 lines
Max nesting: 2 · Circular deps: 0 · Dead code: 0%
God files: apps/admin/src/pages/Products (448 lines)
 
Database Schema
postgresql · 8 models · 1 enum
Models: Address, CartItem, Category, Order, OrderItem (+3 more)
 
Findings (16 errors, 11 warnings)
✖ @types/node is 6 major versions behind (spec: ^20.11.0, latest: 26.6.5).
vibgrate/dependency-major-lag in .
✖ 60% of dependencies are 2+ major versions behind in node-turborepo.
vibgrate/dependency-rot in .
✖ Node.js runtime ">=18.0.0" reached end-of-life on 2025-04-30 (latest: 24.0.0).
vibgrate/runtime-eol in .
✖ vite is 3 major versions behind (spec: ^5.0.12, latest: 8.3.4).
vibgrate/dependency-major-lag in apps/admin
✖ Vite is 3 major versions behind (current: 5.4.21, latest: 8.3.4).
vibgrate/framework-major-lag in apps/admin
✖ @types/node is 6 major versions behind (spec: ^20.11.0, latest: 26.6.5).
vibgrate/dependency-major-lag in apps/api
✖ vitest is 4 major versions behind (spec: ^1.2.1, latest: 5.0.4).
vibgrate/dependency-major-lag in apps/api
✖ Vitest is 4 major versions behind (current: 1.6.1, latest: 5.0.4).
vibgrate/framework-major-lag in apps/api
✖ @types/node is 6 major versions behind (spec: ^20.11.0, latest: 26.6.5).
vibgrate/dependency-major-lag in apps/web
✖ eslint-plugin-react-hooks is 3 major versions behind (spec: ^4.6.0, latest: 7.1.1).
vibgrate/dependency-major-lag in packages/config
✖ 56% of dependencies are 2+ major versions behind in @repo/config.
vibgrate/dependency-rot in packages/config
✖ 75% of dependencies are 2+ major versions behind in @repo/database.
vibgrate/dependency-rot in packages/database
✖ 100% of dependencies are 2+ major versions behind in @repo/types.
vibgrate/dependency-rot in packages/types
✖ vitest is 4 major versions behind (spec: ^1.2.1, latest: 5.0.4).
vibgrate/dependency-major-lag in packages/utils
✖ 67% of dependencies are 2+ major versions behind in @repo/utils.
vibgrate/dependency-rot in packages/utils
✖ Vitest is 4 major versions behind (current: 1.6.1, latest: 5.0.4).
vibgrate/framework-major-lag in packages/utils
⚠ TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in .
⚠ TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in apps/admin
⚠ TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in apps/api
⚠ Next.js is 2 major versions behind (current: 14.2.35, latest: 16.4.0).
vibgrate/framework-major-lag in apps/web
⚠ TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in apps/web
⚠ TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in packages/config
⚠ Prisma is 2 major versions behind (current: 5.22.0, latest: 7.10.0).
vibgrate/framework-major-lag in packages/database
⚠ TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in packages/database
⚠ TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in packages/types
⚠ TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in packages/ui
⚠ TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in packages/utils
 
╭──────────────────────────────────────────╮
│ Top Priority Actions │
╰──────────────────────────────────────────╯
 
1. Upgrade EOL runtime in node-turborepo
End-of-life runtimes no longer receive security patches and block ecosystem upgrades.
./.
>=18.0.0 → 24.0.0 (6 majors behind)
Impact: −10 drift points (runtime & EOL)
 
2. Fix security posture: no lockfile found
Without a lockfile, installs are non-deterministic. Run the install command to generate one and commit it.
./
Missing: package-lock.json, pnpm-lock.yaml, or yarn.lock
 
3. Upgrade Vitest 1.6.1 → 5.0.4 in @repo/api (+2 more)
4 major versions behind. Major framework drift increases breaking change risk and blocks access to security fixes and performance improvements.
./apps/api
Vitest: 1.6.1 → 5.0.4 (4 majors behind)
./packages/utils
Vitest: 1.6.1 → 5.0.4 (4 majors behind)
./apps/admin
Vite: 5.4.21 → 8.3.4 (3 majors behind)
Impact: −5–15 drift points
 
4. Reduce dependency rot in @repo/types (100% severely outdated)
1 of 1 dependencies are 2+ majors behind. Run `npm outdated` and prioritise packages with known CVEs or breaking API changes.
./packages/types
typescript: 5.9.3 → 7.0.2 (2 majors behind)
Impact: −5–10 drift points
 
5. Reduce dependency rot in @repo/database (75% severely outdated)
3 of 4 dependencies are 2+ majors behind. Run `npm outdated` and prioritise packages with known CVEs or breaking API changes.
./packages/database
@prisma/client: 5.22.0 → 7.10.0 (2 majors behind)
prisma: 5.22.0 → 7.10.0 (2 majors behind)
typescript: 5.9.3 → 7.0.2 (2 majors behind)
Impact: −5–10 drift points
 
╭──────────────────────────────────────────╮
│ Architecture Layers │
╰──────────────────────────────────────────╯
 
Archetype: nextjs (80% confidence)
Files classified: 24 (11 unclassified)
Folders classified: 8
apps/admin/src presentation 100% 4 files
apps/admin/src/pages presentation 100% 2 files
apps/api/src/middleware middleware 100% 2 files
apps/api/src/routes routing 100% 2 files
apps/web/src/app presentation 100% 4 files
apps/web/src/app/products presentation 100% 2 files
apps/web/src/app/products/[id] presentation 100% 1 file
packages/ui/src presentation 100% 6 files
Unclassified source (sample): 11
 
presentation 15 files drift ████████████████████ 100 risk high
routing 4 files drift ████████████████████ 100 risk high
middleware 2 files drift ███████▍░░░░░░░░░░░░ 37 risk moderate
config 2 files drift ░░░░░░░░░░░░░░░░░░░░ 0 risk none
shared 1 file drift ████████████████████ 100 risk high
 
╭──────────────────────────────────────────╮
│ DriftScore Summary │
╰──────────────────────────────────────────╯
 
DriftScore: 70/100
Risk Level: HIGH
Projects: 9
Classified: 8 nano · 1 micro · 0 small · 0 standard
Billable: 0.42 · 9 detected → 0.42 billable projects (micro-project pricing)
0.1 micro · 0.32 nano
These fractions add up across repositories, then round down to whole billable projects.
 
Score Breakdown
Runtime: ████████████████████ 100
Frameworks: ███████████▊░░░░░░░░ 59
Dependencies: ██████▌░░░░░░░░░░░░░ 33
EOL Risk: ████████████████████ 100
 
Scanned at 2026-10-14T06:07:19.277Z · 5.4s · 286 files scanned · 56 workspace files · 27 dirs
❯
Press Run to start.