Pulumi Arm To Pulumi
PulumiOfficialPublished by Pulumi
- Skill
- Workflow
- Cloud and DevOps
- Apache-2.0
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a comprehensive, step-by-step procedure for converting Azure Resource Manager (ARM) and Bicep templates into Pulumi programs. It covers the entire migration lifecycle, including information gathering via Azure CLI, manual code translation, optional resource importing, and validation. The skill emphasizes achieving zero-diff deployments when importing existing resources and mandates the production of a formal migration report for every project.
What it does
- Analyzes ARM template structure, parameters, and dependencies.
- Guides the manual translation of ARM/Bicep templates into Pulumi code.
- Provides strategies for choosing between azure-native and azure classic providers.
- Facilitates the import of existing Azure resources into Pulumi management.
- Ensures zero-diff validation between existing infrastructure and Pulumi state.
- Generates a formal, PR-ready migration report with resource mapping.
When to use it
- When you need to migrate existing Azure ARM or Bicep templates to Pulumi.
- When you want to bring existing Azure resources under Pulumi management.
- When you need to ensure structural validity and zero-diff state after an import.
- When you require a structured, repeatable process for Azure infrastructure migration.
Advantages
- Ensures complete resource coverage through systematic mapping.
- Reduces deployment errors with mandatory preview validation.
- Provides clear guidance on provider selection for Azure.
- Standardizes output with a formal migration report format.
- Includes specific workflows for handling complex ARM features like loops and conditionals.
Usage examples
- “I have an existing ARM template for a VNet and need to migrate it to Pulumi. How do I start?”
- The agent will initiate the information gathering phase, verify your Azure credentials, analyze the template structure, and propose a conversion plan.
- “How can I import my existing Azure SQL database into a new Pulumi stack?”
- The agent will guide you through the resource inventory process, explain the inline import approach, and help you resolve any preview diffs to achieve a zero-diff state.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/pulumi/pulumi-arm-to-pulumi/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip pulumi-arm-to-pulumi.zip -d .agents/skills
Documentation by Pulumi
IMPORTANT: PLAN ADJUSTMENT REQUIRED
If you have already generated a migration plan before loading this skill, you MUST:
Review your existing plan against the workflows and requirements in this skill
Identify any gaps, missing steps, or incorrect assumptions
Update and revise your plan to align with this skill's guidance
Communicate the adjusted plan to the user before proceeding
CRITICAL SUCCESS REQUIREMENTS
The migration output MUST meet all of the following:
Complete Resource Coverage
Every ARM template resource MUST:
Be represented in the Pulumi program OR
Be explicitly justified in the final report.
Successful Deployment
The produced Pulumi program must be structurally valid and capable of a successful
pulumi preview(assuming proper config).
Zero-Diff Import Validation (if importing existing resources)
After import,
pulumi previewmust show:NO updates
NO replaces
NO creates
NO deletes
Any diffs must be resolved using the Preview Resolution Workflow. See arm-import.md.
Final Migration Report
Always output a formal migration report suitable for a Pull Request.
Include:
ARM → Pulumi resource mapping
Provider decisions (azure-native vs azure)
Behavioral differences
Missing or manually required steps
Validation instructions
WHEN INFORMATION IS MISSING
If a user-provided ARM template is incomplete, ambiguous, or missing artifacts, ask targeted questions before generating Pulumi code.
If there is ambiguity on how to handle a specific resource property on import, ask targeted questions before altering Pulumi code.
MIGRATION WORKFLOW
Follow this workflow exactly and in this order:
1. INFORMATION GATHERING
1.1 Verify Azure Credentials
Running Azure CLI commands (e.g., az resource list, az resource show). Requires initial login using ESC and az login
If the user has already provided an ESC environment, use it.
If no ESC environment is specified, ask the user which ESC environment to use before proceeding with Azure CLI commands.
Setting up Azure CLI using ESC:
ESC environments can provide Azure credentials through environment variables or Azure CLI configuration
Login to Azure using ESC to provide credentials, e.g:
pulumi env run {org}/{project}/{environment} -- bash -c 'az login --service-principal -u "$ARM_CLIENT_ID" --tenant "$ARM_TENANT_ID" --federated-token "$ARM_OIDC_TOKEN"'. ESC is not required after establishing the sessionVerify credentials are working:
az account showConfirm subscription:
az account list --query "[].{Name:name, SubscriptionId:id, IsDefault:isDefault}" -o table
For detailed ESC information: Load the pulumi-esc skill by calling the tool "Skill" with name = "pulumi-esc"
1.2 Analyze ARM Template Structure
ARM templates do not have the concept of "stacks" like CloudFormation. Read the ARM template JSON file directly:
# View template structure
cat template.json | jq '.resources[] | {type: .type, name: .name}'
# View parameters
cat template.json | jq '.parameters'
# View variables
cat template.json | jq '.variables'Extract:
Resource types and names
Parameters and their default values
Variables and expressions
Dependencies (dependsOn arrays)
Nested templates or linked templates
Copy loops (iteration constructs)
Conditional deployments (condition property)
Documentation: ARM Template Structure
1.3 Build Resource Inventory (if importing existing resources)
If the ARM template has already been deployed and you're importing existing resources:
# List all resources in a resource group
az resource list \
--resource-group <resource-group-name> \
--output json
# Get specific resource details
az resource show \
--ids <resource-id> \
--output json
# Query specific properties using JMESPath
az resource show \
--ids <resource-id> \
--query "{name:name, location:location, properties:properties}" \
--output jsonDocumentation: Azure CLI Documentation
2. CODE CONVERSION (ARM → PULUMI)
IMPORTANT: ARM to Pulumi conversion requires manual translation. There is NO automated conversion tool for ARM templates. You are responsible for the complete conversion.
Key Conversion Principles
Provider Strategy:
Default: Use
@pulumi/azure-nativefor full Azure Resource Manager API coverageFallback: Use
@pulumi/azure(classic provider) when azure-native doesn't support specific features or when you need simplified abstractions
Documentation:
Language Support:
TypeScript/JavaScript: Most common, excellent IDE support
Python: Great for data teams and ML workflows
C#: Natural fit for .NET teams
Go: High performance, strong typing
Java: Enterprise Java teams
YAML: Simple declarative approach
Choose based on user preference or existing codebase
Complete Coverage:
Convert ALL resources in the ARM template
Preserve all conditionals, loops, and dependencies
Maintain parameter and variable logic
Follow conversion patterns in arm-conversion-patterns.md.
arm-conversion-patterns.md provides:
Parameters, variables, and outputs mapping
Copy loops, conditionals, and dependsOn translation
Nested templates → ComponentResource
Azure Classic provider examples (VNet, App Service)
TypeScript output handling and common pitfalls
3. RESOURCE IMPORT (EXISTING RESOURCES) - OPTIONAL
After conversion, you can optionally import existing resources to be managed by Pulumi. If the user does not request this, suggest it as a follow-up step to conversion.
CRITICAL: When the user requests importing existing Azure resources into Pulumi, see arm-import.md for detailed import procedures and zero-diff validation workflows.
arm-import.md provides:
Inline import ID patterns and examples
Azure Resource ID format conventions
Child resource handling (e.g., WebAppApplicationSettings)
Preview Resolution Workflow for achieving zero-diff after import
Step-by-step debugging for property conflicts
Key Import Principles
Inline Import Approach:
Use
importresource option with Azure Resource IDsNo separate import tool (unlike
pulumi-cdk-importer)
Azure Resource IDs:
Follow predictable pattern:
/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}Can be generated by convention or queried via Azure CLI
Zero-Diff Validation:
Run
pulumi previewafter importResolve all diffs using Preview Resolution Workflow
Goal: NO updates, replaces, creates, or deletes
4. PULUMI CONFIGURATION
Set up stack configuration matching ARM template parameters:
# Set Azure region
pulumi config set azure-native:location eastus --stack dev
# Set application parameters
pulumi config set storageAccountName mystorageaccount --stack dev
# Set secret parameters
pulumi config set --secret adminPassword MyS3cr3tP@ssw0rd --stack dev5. VALIDATION
After achieving zero diff in preview (if importing), validate the migration:
Review all exports:
pulumi stack outputVerify resource relationships:
pulumi stack graphTest application functionality (if applicable)
Document any manual steps required post-migration
WORKING WITH THE USER
If the user asks for help planning or performing an ARM to Pulumi migration, use the information above to guide the user through the conversion and import process.
FOR DETAILED DOCUMENTATION
When the user wants additional information, use the web-fetch tool to get content from the official Pulumi documentation:
ARM Migration Guide: https://www.pulumi.com/docs/iac/adopting-pulumi/migrating-to-pulumi/from-arm/
Azure Native Provider: https://www.pulumi.com/registry/packages/azure-native/
Azure Classic Provider: https://www.pulumi.com/registry/packages/azure/
Microsoft Azure Documentation:
ARM Template Reference: https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/
Azure CLI Reference: https://learn.microsoft.com/en-us/cli/azure/
Azure Resource IDs: https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/template-functions-resource
OUTPUT FORMAT (REQUIRED)
When performing a migration, always produce:
Overview (high-level description)
Migration Plan Summary
ARM template resources identified
Conversion strategy (language, providers)
Import approach (if applicable)
Pulumi Code Outputs (organized by file)
Main program file
Component resources (if any)
Configuration instructions
Resource Mapping Table (ARM → Pulumi)
ARM resource type → Pulumi resource type
ARM resource name → Pulumi logical name
Import ID (if importing)
Preview Resolution Notes (if importing)
Diffs encountered
Resolution strategy applied
Properties ignored vs. added
Final Migration Report (PR-ready)
Summary of changes
Testing instructions
Known limitations
Next steps
Configuration Setup
Required config values
Example
pulumi config setcommands
Keep code syntactically valid and clearly separated by files.
Files
- ATTRIBUTION.mdAdded by AutoGineer874 B
- LICENSELicence file added by AutoGineer11.1 KiB
- SKILL.md10.1 KiB
- agents/openai.yaml238 B
- arm-conversion-patterns.md12.5 KiB
- arm-import.md13.4 KiB
- use_cases.yaml708 B
ATTRIBUTION.md
Attribution
This folder is an unmodified copy of the Agent Skill "pulumi-arm-to-pulumi", distributed by AutoGineer (https://autogineer.com/agent-skills).
Commit: 82f222a529a499e8005a820000148cc5e28c934c
Published by: Pulumi (https://github.com/pulumi)
Publisher: Pulumi (https://github.com/pulumi)
Licence: Apache License 2.0 (https://github.com/pulumi/agent-skills/blob/82f222a529a499e8005a820000148cc5e28c934c/LICENSE)
Licence evidence: repository licence LICENSE
Retrieved: 2026-11-07
The skill's own files are unmodified copies. AutoGineer is not affiliated with or endorsed by the author or the publisher.
Files added by AutoGineer
ATTRIBUTION.md: this file, written by AutoGineer
LICENSE: copied from LICENSE
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs a command-line tool
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Pulumi
- Publisher
- Pulumi (Official)
- Source
- pulumi/agent-skills · migration/skills/pulumi-arm-to-pulumi · commit 82f222a
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Pulumi or Pulumi.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download pulumi-arm-to-pulumi.zip