Help us improve
Share bugs, ideas, or general feedback.
From pulumi-migration
Migrates Azure ARM templates, Bicep templates, or code to Pulumi programs, including importing existing resources for zero-diff validation.
npx claudepluginhub pulumi/agent-skills --plugin pulumi-migrationHow this skill is triggered — by the user, by Claude, or both
Slash command
/pulumi-migration:pulumi-arm-to-pulumiThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
**If you have already generated a migration plan before loading this skill, you MUST:**
Converts AWS CloudFormation stacks or templates to Pulumi programs for migration or import, preserving logical IDs for cdk-importer zero-diff compatibility.
Generates Azure deployment infrastructure (Bicep/Terraform, azure.yaml, Dockerfiles) for new or existing apps. Use when creating, modernizing, or deploying apps to Azure.
Generates modular IaC configs for Terraform, CloudFormation, Pulumi, ARM templates, and CDK across AWS, GCP, Azure with variables, outputs, and remote state.
Share bugs, ideas, or general feedback.
If you have already generated a migration plan before loading this skill, you MUST:
The migration output MUST meet all of the following:
Complete Resource Coverage
Successful Deployment
pulumi preview (assuming proper config).Zero-Diff Import Validation (if importing existing resources)
pulumi preview must show:
Final Migration Report
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.
Follow this workflow exactly and in this order:
Running Azure CLI commands (e.g., az resource list, az resource show). Requires initial login using ESC and az login
Setting up Azure CLI using ESC:
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 sessionaz account showaz account list --query "[].{Name:name, SubscriptionId:id, IsDefault:isDefault}" -o tableFor detailed ESC information: Load the pulumi-esc skill by calling the tool "Skill" with name = "pulumi-esc"
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:
Documentation: ARM Template Structure
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 json
Documentation: Azure CLI Documentation
IMPORTANT: ARM to Pulumi conversion requires manual translation. There is NO automated conversion tool for ARM templates. You are responsible for the complete conversion.
Provider Strategy:
@pulumi/azure-native for full Azure Resource Manager API coverage@pulumi/azure (classic provider) when azure-native doesn't support specific features or when you need simplified abstractionsDocumentation:
Language Support:
Complete Coverage:
Follow conversion patterns in arm-conversion-patterns.md.
arm-conversion-patterns.md provides:
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 Approach:
import resource option with Azure Resource IDspulumi-cdk-importer)Azure Resource IDs:
/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}Zero-Diff Validation:
pulumi preview after importSet 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 dev
After achieving zero diff in preview (if importing), validate the migration:
Review all exports:
pulumi stack output
Verify resource relationships:
pulumi stack graph
Test application functionality (if applicable)
Document any manual steps required post-migration
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.
When the user wants additional information, use the web-fetch tool to get content from the official Pulumi documentation:
Microsoft Azure Documentation:
When performing a migration, always produce:
pulumi config set commandsKeep code syntactically valid and clearly separated by files.