[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-pulumi-pulumi-cdk-to-pulumi":3,"mdc-p5cp9t-key":36,"related-repo-pulumi-pulumi-cdk-to-pulumi":2522,"related-org-pulumi-pulumi-cdk-to-pulumi":2617},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":34,"mdContent":35},"pulumi-cdk-to-pulumi","migrate AWS CDK to Pulumi","Load this skill when a user wants to migrate, convert, port, translate, or move an AWS CDK application (including CDK stacks, constructs, or CloudFormation-synthesized templates) to Pulumi. Phrases such as \"convert CDK to Pulumi\", \"migrate CDK app\", \"port CDK stacks\", \"replace CDK with Pulumi\", \"stop using CDK\". Do NOT load for general CDK questions, CDK-only help, or CDK vs Pulumi comparisons where no migration is requested.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"pulumi","Pulumi","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fpulumi.png",[12,14,17,20,23],{"name":9,"slug":8,"type":13},"tag",{"name":15,"slug":16,"type":13},"Migration","migration",{"name":18,"slug":19,"type":13},"Deployment","deployment",{"name":21,"slug":22,"type":13},"Infrastructure as Code","infrastructure-as-code",{"name":24,"slug":25,"type":13},"AWS","aws",63,"https:\u002F\u002Fgithub.com\u002Fpulumi\u002Fagent-skills","2026-04-06T18:50:39.23999",null,4,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":29},[],"https:\u002F\u002Fgithub.com\u002Fpulumi\u002Fagent-skills\u002Ftree\u002FHEAD\u002Fmigration\u002Fskills\u002Fpulumi-cdk-to-pulumi","---\nname: pulumi-cdk-to-pulumi\ndescription: Load this skill when a user wants to migrate, convert, port, translate, or move an AWS CDK application (including CDK stacks, constructs, or CloudFormation-synthesized templates) to Pulumi. Phrases such as \"convert CDK to Pulumi\", \"migrate CDK app\", \"port CDK stacks\", \"replace CDK with Pulumi\", \"stop using CDK\". Do NOT load for general CDK questions, CDK-only help, or CDK vs Pulumi comparisons where no migration is requested.\n---\n\n# CRITICAL SUCCESS REQUIREMENTS\n\nThe migration output MUST meet all of the following:\n\n1. **Complete Resource Coverage**\n   - Every CloudFormation resource synthesized by CDK MUST:\n     - Be represented in the Pulumi program **OR**\n     - Be explicitly justified in the final report.\n\n2. **Successful Deployment**\n   - The produced Pulumi program must be structurally valid and capable of a successful `pulumi up` (assuming proper config).\n\n3. **Final Migration Report**\n   - Always output a formal migration report suitable for a Pull Request.\n   - Include:\n     - CDK → Pulumi resource mapping\n     - Provider decisions (aws-native vs aws)\n     - Behavioral differences\n     - Missing or manually required steps\n     - Validation instructions\n\n## WHEN INFORMATION IS MISSING\n\nIf a user-provided CDK project is incomplete, ambiguous, or missing artifacts (such as `cdk.out`), ask **targeted questions** before generating Pulumi code.\n\n## MIGRATION WORKFLOW\n\nFollow this workflow **exactly** and in this order:\n\n### 1. INFORMATION GATHERING\n\n#### 1.1 Verify AWS Credentials (ESC)\n\nRunning AWS commands (e.g., `aws cloudformation list-stack-resources`) and CDK commands (e.g. `cdk synth`) requires credentials loaded via Pulumi ESC.\n\n- If the user has already provided an ESC environment, use it.\n- If no ESC environment is specified, **ask the user which ESC environment to use** before proceeding with AWS commands.\n\nYou MUST confirm the AWS region with the user. The `cdk synth` results may be incorrect if ran with the wrong AWS Region.\n\n#### 1.2 Synthesize CDK\n\nRun\u002Finspect:\n\n```bash\nnpx cdk synth --quiet\n```\n\n- ALWAYS run `synth` with `--quiet` to prevent the template from being output on stdout.\n\nIf failing, inspect `cdk.json` or `package.json` for custom synth behavior.\n\n#### 1.3 Identify CDK Stacks & Environments\n\nRead `cdk.out\u002Fmanifest.json`:\n\n```bash\njq '.artifacts | to_entries | map(select(.value.type == \"aws:cloudformation:stack\") | {displayName: .key, environment: .value.environment}) | .[]' cdk.out\u002Fmanifest.json\n```\n\nExample output:\n\n```json\n{\n  \"displayName\": \"DataStack-dev\",\n  \"environment\": \"aws:\u002F\u002F616138583583\u002Fus-east-2\"\n}\n{\n  \"displayName\": \"AppStack-dev\",\n  \"environment\": \"aws:\u002F\u002F616138583583\u002Fus-east-2\"\n}\n```\n\nIn the Pulumi stack you create you MUST set both the `aws:region` and `aws-native:region` config variables. For example:\n\n```bash\npulumi config set aws-native:region us-east-2 --stack dev\npulumi config set aws:region us-east-2 --stack dev\n```\n\n#### 1.4 Build Resource Inventory\n\nFor each stack:\n\n```bash\naws cloudformation list-stack-resources \\\n  --region \u003Cregion> \\\n  --stack-name \u003Cstack> \\\n  --output json\n```\n\n#### 1.5 Analyze CDK Structure\n\nExtract:\n\n- Environment-specific conditionals\n- Stack dependencies & cross-stack references\n- Runtime config (context\u002Fenv vars)\n- Construct types (L1, L2, L3)\n\n### 2. CODE CONVERSION (CDK → PULUMI)\n\n- Perform the initial conversion using the `cdk2pulumi` tool. Follow [cdk-convert.md](cdk-convert.md) to perform the conversion.\n- Read the conversion report and fill in any gaps. For example, if the conversion fails to convert a resource you have to convert it manually yourself.\n\n#### 2.1 Custom Resources Handling\n\nCDK uses Lambda-backed Custom Resources for functionality not available in CloudFormation. In synthesized CloudFormation, these appear as:\n\n- Resource type: `AWS::CloudFormation::CustomResource` or `Custom::\u003Cname>`\n- Metadata contains `aws:cdk:path` with the handler name (e.g., `aws-s3\u002Fauto-delete-objects-handler`)\n\n**Default behavior**: `cdk2pulumi` rewrites custom resources to `aws-native:cloudformation:CustomResourceEmulator`, which invokes the original Lambda. This works but has tradeoffs (Lambda dependency, cold starts, eventual consistency).\n\n**Migration strategies by handler type:**\n\n| Handler | Strategy |\n|---------|----------|\n| `aws-certificatemanager\u002Fdns-validated-certificate-handler` | Replace with `aws.acm.Certificate`, `aws.route53.Record`, and `aws.acm.CertificateValidation` |\n| `aws-ec2\u002Frestrict-default-security-group-handler` | Replace with `aws.ec2.DefaultSecurityGroup` resource with empty ingress\u002Fegress rules |\n| `aws-ecr\u002Fauto-delete-images-handler` | Replace `aws-native:ecr:Repository` with `aws.ecr.Repository` with `forceDelete: true` |\n| `aws-s3\u002Fauto-delete-objects-handler` | Replace `aws-native:s3:Bucket` with `aws.s3.Bucket` with `forceDestroy: true` |\n| `aws-s3\u002Fnotifications-resource-handler` | Replace with `aws.s3.BucketNotification` |\n| `aws-logs\u002Flog-retention-handler` | Replace with `aws.cloudwatch.LogGroup` with explicit `retentionInDays` |\n| `aws-iam\u002Foidc-handler` | Replace with `aws.iam.OpenIdConnectProvider` |\n| `aws-route53\u002Fdelete-existing-record-set-handler` | Replace with `aws.route53.Record` with `allowOverwrite: true` |\n| `aws-dynamodb\u002Freplica-handler` | Replace with `aws.dynamodb.TableReplica` |\n\n**Cross-account\u002Fregion handlers:**\n\n- `aws-cloudfront\u002Fedge-function` → Use `aws.lambda.Function` with `region: \"us-east-1\"`\n- `aws-route53\u002Fcross-account-zone-delegation-handler` → Use separate aws provider with cross-account role assumption\n\n**Graceful degradation for unknown handlers:**\n\n1. Keep the `CustomResourceEmulator` (default behavior)\n2. Document the custom resource in the migration report with:\n   - Original handler name and purpose (if discernible from CDK path)\n   - Note that it uses Lambda invocation at runtime\n   - Recommend user review for potential native replacement\n\n#### 2.2 Provider Strategy\n\n- **Default**: Use `aws-native` whenever the resource type is available.\n- **Fallback**: Use `aws` when aws-native does not support equivalent features.\n\n#### 2.3 Assets & Bundling\n\nCDK uses Assets and Bundling to handle deployment artifacts. These are processed by the CDK CLI before CloudFormation deployment and appear in the `cdk.out` directory alongside `*.assets.json` metadata files. CloudFormation templates contain hard-coded references to asset locations (S3 bucket\u002Fkey or ECR repo\u002Ftag).\n\n```bash\n# Inspect asset definitions\njq '.files, .dockerImages' cdk.out\u002F*.assets.json\n```\n\n**Migration strategies by asset type:**\n\n| Asset Type | Detection | Pulumi Migration |\n|------------|-----------|------------------|\n| **Docker Image** | `dockerImages` in assets.json | Use `docker-build.Image` to build and push. Replace hard-coded ECR URI with image output. |\n| **File with build command** | `files` with `executable` field | **Flag to user** - build command needs setup in Pulumi |\n| **Static file** | `files` without `executable`, no bundling in CDK source | Use `pulumi.FileArchive` or `pulumi.FileAsset` |\n| **Bundled file** | `files` without `executable`, but CDK source uses bundling | **Flag to user** - bundling needs setup in Pulumi |\n\n**Detecting Bundling in CDK Source:**\n\nCheck the CDK source code for bundling constructs (`NodejsFunction`, `PythonFunction`, `GoFunction`, or resources using the `bundling` option). If bundling is used, the build step needs to be replicated in Pulumi for ongoing development - otherwise source changes would require manually re-running `cdk synth`.\n\n**When bundling is detected, inform the user:**\n\n> **Build Step Detected**: This CDK application uses \u003CBUNDLING_TYPE> which builds deployable artifacts during synthesis. This build step needs to be replicated in Pulumi for ongoing development.\n>\n> **Options:**\n>\n> 1. **CI\u002FCD Pipeline** (Recommended): Move the build step to your CI pipeline and reference the pre-built artifact in Pulumi\n> 2. **Pulumi Command Provider**: Use `command.local.Command` to run the build command during `pulumi up`\n> 3. **Pre-build Script**: Create a build script that runs before `pulumi up` and outputs to a known location\n>\n> Each option has tradeoffs around caching, reproducibility, and deployment speed. For production workloads, option 1 is typically preferred.\n\n#### 2.4 TypeScript Handling for aws-native\n\naws-native outputs often include undefined. Avoid `!` non-null assertions. Always safely unwrap with `.apply()`:\n\n```ts\n\u002F\u002F ❌ WRONG - Will cause TypeScript errors\nfunctionName: lambdaFunction.functionName!,\n\n\u002F\u002F ✅ CORRECT - Handle undefined safely\nfunctionName: lambdaFunction.functionName.apply(name => name || \"\"),\n```\n\n#### 2.5 Environment Logic Preservation\n\nCarry forward all conditional behaviors:\n\n```ts\nif (currentEnv.createVpc) {\n  \u002F\u002F create resources\n} else {\n  const vpcId = pulumi.output(currentEnv.vpcId);\n}\n```\n\n### 3. Resource Import (optional)\n\nAfter conversion you can optionally import the existing resources to now be managed by Pulumi. If the user does not request this you should suggest this as a follow up step to conversion.\n\n- Always start with automated import using the `cdk-importer` tool. Follow [cdk-importer.md](cdk-importer.md) to perform the automated import.\n- For any resources that fail to import with the automated tool, import them manually.\n\nIf you need to manually import resources:\n\n- Follow [cloudformation-id-lookup.md](cloudformation-id-lookup.md) to look up CloudFormation import identifiers.\n- Use the web-fetch tool to get content from the official Pulumi documentation.\n\n- **Finding AWS import IDs** -> \u003Chttps:\u002F\u002Fwww.pulumi.com\u002Fdocs\u002Fiac\u002Fguides\u002Fmigration\u002Faws-import-ids\u002F>\n- **Manual migration approaches** -> \u003Chttps:\u002F\u002Fwww.pulumi.com\u002Fdocs\u002Fiac\u002Fguides\u002Fmigration\u002Fmigrating-to-pulumi\u002Fmigrating-from-cdk\u002Fmigrating-existing-cdk-app\u002F#approach-b-manual-migration>\n\n#### 3.1 Running preview after import\n\nAfter performing an import you need to run `pulumi preview` to ensure there are no changes. No changes means:\n\n- NO updates\n- NO replaces\n- NO creates\n- NO deletes\n\nIf there are changes you must investigate and update the program until there are no changes.\n\n## Working with the User\n\nIf the user asks for help planning or performing a CDK to Pulumi migration use the information above to guide the user towards the automated migration approach.\n\n## For Detailed Documentation\n\nWhen the user wants to deviate from the recommended path detailed above, use the web-fetch tool to get content from the official Pulumi documentation -> \u003Chttps:\u002F\u002Fwww.pulumi.com\u002Fdocs\u002Fiac\u002Fguides\u002Fmigration\u002Fmigrating-to-pulumi\u002Fmigrating-from-cdk\u002Fmigrating-existing-cdk-app>\n\nThis documentation covers topics:\n\n- Migration Strategy\n  - Convert vs. Rewrite\n  - Import vs. Rehydrate\n  - Best Practices\n- Handling Multiple CDK Stacks\n- Handling CDK Stages\n- Code organization\n- Converting CDK Constructs\n- Execution Strategies\n  - Automated Migration (recommended)\n  - Manual Migration\n\n## OUTPUT FORMAT (REQUIRED)\n\nWhen performing a migration, always produce:\n\n1. **Overview** (high-level description)\n2. **Migration Plan Summary**\n3. **Pulumi Code Outputs** (TypeScript; structured by file)\n4. **Resource Mapping Table** (CDK → Pulumi)\n5. **Custom Resources Summary** (if any):\n   - Handlers migrated to native Pulumi resources\n   - Handlers kept as `CustomResourceEmulator` with rationale\n   - Any handlers requiring user attention\n6. **Assets & Bundling Summary** (if any):\n   - **Migrated**: Assets successfully converted (e.g., Docker images → `docker-build.Image`, static files → `pulumi.FileArchive`)\n   - **Requires attention**: Assets with bundling steps, options presented, and decision if made\n7. **Final Migration Report** (PR-ready)\n8. **Next Steps** (optional refactors)\n\nKeep code syntactically valid and clearly separated by files.\n",{"data":37,"body":38},{"name":4,"description":6},{"type":39,"children":40},"root",[41,50,56,171,178,198,204,216,223,230,251,271,283,289,294,333,357,378,384,397,433,438,626,647,723,729,734,839,845,850,873,879,908,914,919,961,986,994,1281,1289,1327,1335,1374,1380,1417,1423,1443,1494,1502,1684,1692,1734,1742,1821,1827,1847,1983,1989,1994,2121,2127,2132,2159,2164,2216,2222,2235,2258,2263,2269,2274,2280,2291,2296,2360,2366,2371,2511,2516],{"type":42,"tag":43,"props":44,"children":46},"element","h1",{"id":45},"critical-success-requirements",[47],{"type":48,"value":49},"text","CRITICAL SUCCESS REQUIREMENTS",{"type":42,"tag":51,"props":52,"children":53},"p",{},[54],{"type":48,"value":55},"The migration output MUST meet all of the following:",{"type":42,"tag":57,"props":58,"children":59},"ol",{},[60,97,122],{"type":42,"tag":61,"props":62,"children":63},"li",{},[64,70],{"type":42,"tag":65,"props":66,"children":67},"strong",{},[68],{"type":48,"value":69},"Complete Resource Coverage",{"type":42,"tag":71,"props":72,"children":73},"ul",{},[74],{"type":42,"tag":61,"props":75,"children":76},{},[77,79],{"type":48,"value":78},"Every CloudFormation resource synthesized by CDK MUST:\n",{"type":42,"tag":71,"props":80,"children":81},{},[82,92],{"type":42,"tag":61,"props":83,"children":84},{},[85,87],{"type":48,"value":86},"Be represented in the Pulumi program ",{"type":42,"tag":65,"props":88,"children":89},{},[90],{"type":48,"value":91},"OR",{"type":42,"tag":61,"props":93,"children":94},{},[95],{"type":48,"value":96},"Be explicitly justified in the final report.",{"type":42,"tag":61,"props":98,"children":99},{},[100,105],{"type":42,"tag":65,"props":101,"children":102},{},[103],{"type":48,"value":104},"Successful Deployment",{"type":42,"tag":71,"props":106,"children":107},{},[108],{"type":42,"tag":61,"props":109,"children":110},{},[111,113,120],{"type":48,"value":112},"The produced Pulumi program must be structurally valid and capable of a successful ",{"type":42,"tag":114,"props":115,"children":117},"code",{"className":116},[],[118],{"type":48,"value":119},"pulumi up",{"type":48,"value":121}," (assuming proper config).",{"type":42,"tag":61,"props":123,"children":124},{},[125,130],{"type":42,"tag":65,"props":126,"children":127},{},[128],{"type":48,"value":129},"Final Migration Report",{"type":42,"tag":71,"props":131,"children":132},{},[133,138],{"type":42,"tag":61,"props":134,"children":135},{},[136],{"type":48,"value":137},"Always output a formal migration report suitable for a Pull Request.",{"type":42,"tag":61,"props":139,"children":140},{},[141,143],{"type":48,"value":142},"Include:\n",{"type":42,"tag":71,"props":144,"children":145},{},[146,151,156,161,166],{"type":42,"tag":61,"props":147,"children":148},{},[149],{"type":48,"value":150},"CDK → Pulumi resource mapping",{"type":42,"tag":61,"props":152,"children":153},{},[154],{"type":48,"value":155},"Provider decisions (aws-native vs aws)",{"type":42,"tag":61,"props":157,"children":158},{},[159],{"type":48,"value":160},"Behavioral differences",{"type":42,"tag":61,"props":162,"children":163},{},[164],{"type":48,"value":165},"Missing or manually required steps",{"type":42,"tag":61,"props":167,"children":168},{},[169],{"type":48,"value":170},"Validation instructions",{"type":42,"tag":172,"props":173,"children":175},"h2",{"id":174},"when-information-is-missing",[176],{"type":48,"value":177},"WHEN INFORMATION IS MISSING",{"type":42,"tag":51,"props":179,"children":180},{},[181,183,189,191,196],{"type":48,"value":182},"If a user-provided CDK project is incomplete, ambiguous, or missing artifacts (such as ",{"type":42,"tag":114,"props":184,"children":186},{"className":185},[],[187],{"type":48,"value":188},"cdk.out",{"type":48,"value":190},"), ask ",{"type":42,"tag":65,"props":192,"children":193},{},[194],{"type":48,"value":195},"targeted questions",{"type":48,"value":197}," before generating Pulumi code.",{"type":42,"tag":172,"props":199,"children":201},{"id":200},"migration-workflow",[202],{"type":48,"value":203},"MIGRATION WORKFLOW",{"type":42,"tag":51,"props":205,"children":206},{},[207,209,214],{"type":48,"value":208},"Follow this workflow ",{"type":42,"tag":65,"props":210,"children":211},{},[212],{"type":48,"value":213},"exactly",{"type":48,"value":215}," and in this order:",{"type":42,"tag":217,"props":218,"children":220},"h3",{"id":219},"_1-information-gathering",[221],{"type":48,"value":222},"1. INFORMATION GATHERING",{"type":42,"tag":224,"props":225,"children":227},"h4",{"id":226},"_11-verify-aws-credentials-esc",[228],{"type":48,"value":229},"1.1 Verify AWS Credentials (ESC)",{"type":42,"tag":51,"props":231,"children":232},{},[233,235,241,243,249],{"type":48,"value":234},"Running AWS commands (e.g., ",{"type":42,"tag":114,"props":236,"children":238},{"className":237},[],[239],{"type":48,"value":240},"aws cloudformation list-stack-resources",{"type":48,"value":242},") and CDK commands (e.g. ",{"type":42,"tag":114,"props":244,"children":246},{"className":245},[],[247],{"type":48,"value":248},"cdk synth",{"type":48,"value":250},") requires credentials loaded via Pulumi ESC.",{"type":42,"tag":71,"props":252,"children":253},{},[254,259],{"type":42,"tag":61,"props":255,"children":256},{},[257],{"type":48,"value":258},"If the user has already provided an ESC environment, use it.",{"type":42,"tag":61,"props":260,"children":261},{},[262,264,269],{"type":48,"value":263},"If no ESC environment is specified, ",{"type":42,"tag":65,"props":265,"children":266},{},[267],{"type":48,"value":268},"ask the user which ESC environment to use",{"type":48,"value":270}," before proceeding with AWS commands.",{"type":42,"tag":51,"props":272,"children":273},{},[274,276,281],{"type":48,"value":275},"You MUST confirm the AWS region with the user. The ",{"type":42,"tag":114,"props":277,"children":279},{"className":278},[],[280],{"type":48,"value":248},{"type":48,"value":282}," results may be incorrect if ran with the wrong AWS Region.",{"type":42,"tag":224,"props":284,"children":286},{"id":285},"_12-synthesize-cdk",[287],{"type":48,"value":288},"1.2 Synthesize CDK",{"type":42,"tag":51,"props":290,"children":291},{},[292],{"type":48,"value":293},"Run\u002Finspect:",{"type":42,"tag":295,"props":296,"children":301},"pre",{"className":297,"code":298,"language":299,"meta":300,"style":300},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx cdk synth --quiet\n","bash","",[302],{"type":42,"tag":114,"props":303,"children":304},{"__ignoreMap":300},[305],{"type":42,"tag":306,"props":307,"children":310},"span",{"class":308,"line":309},"line",1,[311,317,323,328],{"type":42,"tag":306,"props":312,"children":314},{"style":313},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[315],{"type":48,"value":316},"npx",{"type":42,"tag":306,"props":318,"children":320},{"style":319},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[321],{"type":48,"value":322}," cdk",{"type":42,"tag":306,"props":324,"children":325},{"style":319},[326],{"type":48,"value":327}," synth",{"type":42,"tag":306,"props":329,"children":330},{"style":319},[331],{"type":48,"value":332}," --quiet\n",{"type":42,"tag":71,"props":334,"children":335},{},[336],{"type":42,"tag":61,"props":337,"children":338},{},[339,341,347,349,355],{"type":48,"value":340},"ALWAYS run ",{"type":42,"tag":114,"props":342,"children":344},{"className":343},[],[345],{"type":48,"value":346},"synth",{"type":48,"value":348}," with ",{"type":42,"tag":114,"props":350,"children":352},{"className":351},[],[353],{"type":48,"value":354},"--quiet",{"type":48,"value":356}," to prevent the template from being output on stdout.",{"type":42,"tag":51,"props":358,"children":359},{},[360,362,368,370,376],{"type":48,"value":361},"If failing, inspect ",{"type":42,"tag":114,"props":363,"children":365},{"className":364},[],[366],{"type":48,"value":367},"cdk.json",{"type":48,"value":369}," or ",{"type":42,"tag":114,"props":371,"children":373},{"className":372},[],[374],{"type":48,"value":375},"package.json",{"type":48,"value":377}," for custom synth behavior.",{"type":42,"tag":224,"props":379,"children":381},{"id":380},"_13-identify-cdk-stacks-environments",[382],{"type":48,"value":383},"1.3 Identify CDK Stacks & Environments",{"type":42,"tag":51,"props":385,"children":386},{},[387,389,395],{"type":48,"value":388},"Read ",{"type":42,"tag":114,"props":390,"children":392},{"className":391},[],[393],{"type":48,"value":394},"cdk.out\u002Fmanifest.json",{"type":48,"value":396},":",{"type":42,"tag":295,"props":398,"children":400},{"className":297,"code":399,"language":299,"meta":300,"style":300},"jq '.artifacts | to_entries | map(select(.value.type == \"aws:cloudformation:stack\") | {displayName: .key, environment: .value.environment}) | .[]' cdk.out\u002Fmanifest.json\n",[401],{"type":42,"tag":114,"props":402,"children":403},{"__ignoreMap":300},[404],{"type":42,"tag":306,"props":405,"children":406},{"class":308,"line":309},[407,412,418,423,428],{"type":42,"tag":306,"props":408,"children":409},{"style":313},[410],{"type":48,"value":411},"jq",{"type":42,"tag":306,"props":413,"children":415},{"style":414},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[416],{"type":48,"value":417}," '",{"type":42,"tag":306,"props":419,"children":420},{"style":319},[421],{"type":48,"value":422},".artifacts | to_entries | map(select(.value.type == \"aws:cloudformation:stack\") | {displayName: .key, environment: .value.environment}) | .[]",{"type":42,"tag":306,"props":424,"children":425},{"style":414},[426],{"type":48,"value":427},"'",{"type":42,"tag":306,"props":429,"children":430},{"style":319},[431],{"type":48,"value":432}," cdk.out\u002Fmanifest.json\n",{"type":42,"tag":51,"props":434,"children":435},{},[436],{"type":48,"value":437},"Example output:",{"type":42,"tag":295,"props":439,"children":443},{"className":440,"code":441,"language":442,"meta":300,"style":300},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"displayName\": \"DataStack-dev\",\n  \"environment\": \"aws:\u002F\u002F616138583583\u002Fus-east-2\"\n}\n{\n  \"displayName\": \"AppStack-dev\",\n  \"environment\": \"aws:\u002F\u002F616138583583\u002Fus-east-2\"\n}\n","json",[444],{"type":42,"tag":114,"props":445,"children":446},{"__ignoreMap":300},[447,455,498,533,541,549,586,618],{"type":42,"tag":306,"props":448,"children":449},{"class":308,"line":309},[450],{"type":42,"tag":306,"props":451,"children":452},{"style":414},[453],{"type":48,"value":454},"{\n",{"type":42,"tag":306,"props":456,"children":458},{"class":308,"line":457},2,[459,464,470,475,479,484,489,493],{"type":42,"tag":306,"props":460,"children":461},{"style":414},[462],{"type":48,"value":463},"  \"",{"type":42,"tag":306,"props":465,"children":467},{"style":466},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[468],{"type":48,"value":469},"displayName",{"type":42,"tag":306,"props":471,"children":472},{"style":414},[473],{"type":48,"value":474},"\"",{"type":42,"tag":306,"props":476,"children":477},{"style":414},[478],{"type":48,"value":396},{"type":42,"tag":306,"props":480,"children":481},{"style":414},[482],{"type":48,"value":483}," \"",{"type":42,"tag":306,"props":485,"children":486},{"style":319},[487],{"type":48,"value":488},"DataStack-dev",{"type":42,"tag":306,"props":490,"children":491},{"style":414},[492],{"type":48,"value":474},{"type":42,"tag":306,"props":494,"children":495},{"style":414},[496],{"type":48,"value":497},",\n",{"type":42,"tag":306,"props":499,"children":501},{"class":308,"line":500},3,[502,506,511,515,519,523,528],{"type":42,"tag":306,"props":503,"children":504},{"style":414},[505],{"type":48,"value":463},{"type":42,"tag":306,"props":507,"children":508},{"style":466},[509],{"type":48,"value":510},"environment",{"type":42,"tag":306,"props":512,"children":513},{"style":414},[514],{"type":48,"value":474},{"type":42,"tag":306,"props":516,"children":517},{"style":414},[518],{"type":48,"value":396},{"type":42,"tag":306,"props":520,"children":521},{"style":414},[522],{"type":48,"value":483},{"type":42,"tag":306,"props":524,"children":525},{"style":319},[526],{"type":48,"value":527},"aws:\u002F\u002F616138583583\u002Fus-east-2",{"type":42,"tag":306,"props":529,"children":530},{"style":414},[531],{"type":48,"value":532},"\"\n",{"type":42,"tag":306,"props":534,"children":535},{"class":308,"line":30},[536],{"type":42,"tag":306,"props":537,"children":538},{"style":414},[539],{"type":48,"value":540},"}\n",{"type":42,"tag":306,"props":542,"children":544},{"class":308,"line":543},5,[545],{"type":42,"tag":306,"props":546,"children":547},{"style":414},[548],{"type":48,"value":454},{"type":42,"tag":306,"props":550,"children":552},{"class":308,"line":551},6,[553,557,561,565,569,573,578,582],{"type":42,"tag":306,"props":554,"children":555},{"style":414},[556],{"type":48,"value":463},{"type":42,"tag":306,"props":558,"children":559},{"style":466},[560],{"type":48,"value":469},{"type":42,"tag":306,"props":562,"children":563},{"style":414},[564],{"type":48,"value":474},{"type":42,"tag":306,"props":566,"children":567},{"style":414},[568],{"type":48,"value":396},{"type":42,"tag":306,"props":570,"children":571},{"style":414},[572],{"type":48,"value":483},{"type":42,"tag":306,"props":574,"children":575},{"style":319},[576],{"type":48,"value":577},"AppStack-dev",{"type":42,"tag":306,"props":579,"children":580},{"style":414},[581],{"type":48,"value":474},{"type":42,"tag":306,"props":583,"children":584},{"style":414},[585],{"type":48,"value":497},{"type":42,"tag":306,"props":587,"children":589},{"class":308,"line":588},7,[590,594,598,602,606,610,614],{"type":42,"tag":306,"props":591,"children":592},{"style":414},[593],{"type":48,"value":463},{"type":42,"tag":306,"props":595,"children":596},{"style":466},[597],{"type":48,"value":510},{"type":42,"tag":306,"props":599,"children":600},{"style":414},[601],{"type":48,"value":474},{"type":42,"tag":306,"props":603,"children":604},{"style":414},[605],{"type":48,"value":396},{"type":42,"tag":306,"props":607,"children":608},{"style":414},[609],{"type":48,"value":483},{"type":42,"tag":306,"props":611,"children":612},{"style":319},[613],{"type":48,"value":527},{"type":42,"tag":306,"props":615,"children":616},{"style":414},[617],{"type":48,"value":532},{"type":42,"tag":306,"props":619,"children":621},{"class":308,"line":620},8,[622],{"type":42,"tag":306,"props":623,"children":624},{"style":414},[625],{"type":48,"value":540},{"type":42,"tag":51,"props":627,"children":628},{},[629,631,637,639,645],{"type":48,"value":630},"In the Pulumi stack you create you MUST set both the ",{"type":42,"tag":114,"props":632,"children":634},{"className":633},[],[635],{"type":48,"value":636},"aws:region",{"type":48,"value":638}," and ",{"type":42,"tag":114,"props":640,"children":642},{"className":641},[],[643],{"type":48,"value":644},"aws-native:region",{"type":48,"value":646}," config variables. For example:",{"type":42,"tag":295,"props":648,"children":650},{"className":297,"code":649,"language":299,"meta":300,"style":300},"pulumi config set aws-native:region us-east-2 --stack dev\npulumi config set aws:region us-east-2 --stack dev\n",[651],{"type":42,"tag":114,"props":652,"children":653},{"__ignoreMap":300},[654,691],{"type":42,"tag":306,"props":655,"children":656},{"class":308,"line":309},[657,661,666,671,676,681,686],{"type":42,"tag":306,"props":658,"children":659},{"style":313},[660],{"type":48,"value":8},{"type":42,"tag":306,"props":662,"children":663},{"style":319},[664],{"type":48,"value":665}," config",{"type":42,"tag":306,"props":667,"children":668},{"style":319},[669],{"type":48,"value":670}," set",{"type":42,"tag":306,"props":672,"children":673},{"style":319},[674],{"type":48,"value":675}," aws-native:region",{"type":42,"tag":306,"props":677,"children":678},{"style":319},[679],{"type":48,"value":680}," us-east-2",{"type":42,"tag":306,"props":682,"children":683},{"style":319},[684],{"type":48,"value":685}," --stack",{"type":42,"tag":306,"props":687,"children":688},{"style":319},[689],{"type":48,"value":690}," dev\n",{"type":42,"tag":306,"props":692,"children":693},{"class":308,"line":457},[694,698,702,706,711,715,719],{"type":42,"tag":306,"props":695,"children":696},{"style":313},[697],{"type":48,"value":8},{"type":42,"tag":306,"props":699,"children":700},{"style":319},[701],{"type":48,"value":665},{"type":42,"tag":306,"props":703,"children":704},{"style":319},[705],{"type":48,"value":670},{"type":42,"tag":306,"props":707,"children":708},{"style":319},[709],{"type":48,"value":710}," aws:region",{"type":42,"tag":306,"props":712,"children":713},{"style":319},[714],{"type":48,"value":680},{"type":42,"tag":306,"props":716,"children":717},{"style":319},[718],{"type":48,"value":685},{"type":42,"tag":306,"props":720,"children":721},{"style":319},[722],{"type":48,"value":690},{"type":42,"tag":224,"props":724,"children":726},{"id":725},"_14-build-resource-inventory",[727],{"type":48,"value":728},"1.4 Build Resource Inventory",{"type":42,"tag":51,"props":730,"children":731},{},[732],{"type":48,"value":733},"For each stack:",{"type":42,"tag":295,"props":735,"children":737},{"className":297,"code":736,"language":299,"meta":300,"style":300},"aws cloudformation list-stack-resources \\\n  --region \u003Cregion> \\\n  --stack-name \u003Cstack> \\\n  --output json\n",[738],{"type":42,"tag":114,"props":739,"children":740},{"__ignoreMap":300},[741,764,796,826],{"type":42,"tag":306,"props":742,"children":743},{"class":308,"line":309},[744,748,753,758],{"type":42,"tag":306,"props":745,"children":746},{"style":313},[747],{"type":48,"value":25},{"type":42,"tag":306,"props":749,"children":750},{"style":319},[751],{"type":48,"value":752}," cloudformation",{"type":42,"tag":306,"props":754,"children":755},{"style":319},[756],{"type":48,"value":757}," list-stack-resources",{"type":42,"tag":306,"props":759,"children":761},{"style":760},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[762],{"type":48,"value":763}," \\\n",{"type":42,"tag":306,"props":765,"children":766},{"class":308,"line":457},[767,772,777,782,787,792],{"type":42,"tag":306,"props":768,"children":769},{"style":319},[770],{"type":48,"value":771},"  --region",{"type":42,"tag":306,"props":773,"children":774},{"style":414},[775],{"type":48,"value":776}," \u003C",{"type":42,"tag":306,"props":778,"children":779},{"style":319},[780],{"type":48,"value":781},"regio",{"type":42,"tag":306,"props":783,"children":784},{"style":760},[785],{"type":48,"value":786},"n",{"type":42,"tag":306,"props":788,"children":789},{"style":414},[790],{"type":48,"value":791},">",{"type":42,"tag":306,"props":793,"children":794},{"style":760},[795],{"type":48,"value":763},{"type":42,"tag":306,"props":797,"children":798},{"class":308,"line":500},[799,804,808,813,818,822],{"type":42,"tag":306,"props":800,"children":801},{"style":319},[802],{"type":48,"value":803},"  --stack-name",{"type":42,"tag":306,"props":805,"children":806},{"style":414},[807],{"type":48,"value":776},{"type":42,"tag":306,"props":809,"children":810},{"style":319},[811],{"type":48,"value":812},"stac",{"type":42,"tag":306,"props":814,"children":815},{"style":760},[816],{"type":48,"value":817},"k",{"type":42,"tag":306,"props":819,"children":820},{"style":414},[821],{"type":48,"value":791},{"type":42,"tag":306,"props":823,"children":824},{"style":760},[825],{"type":48,"value":763},{"type":42,"tag":306,"props":827,"children":828},{"class":308,"line":30},[829,834],{"type":42,"tag":306,"props":830,"children":831},{"style":319},[832],{"type":48,"value":833},"  --output",{"type":42,"tag":306,"props":835,"children":836},{"style":319},[837],{"type":48,"value":838}," json\n",{"type":42,"tag":224,"props":840,"children":842},{"id":841},"_15-analyze-cdk-structure",[843],{"type":48,"value":844},"1.5 Analyze CDK Structure",{"type":42,"tag":51,"props":846,"children":847},{},[848],{"type":48,"value":849},"Extract:",{"type":42,"tag":71,"props":851,"children":852},{},[853,858,863,868],{"type":42,"tag":61,"props":854,"children":855},{},[856],{"type":48,"value":857},"Environment-specific conditionals",{"type":42,"tag":61,"props":859,"children":860},{},[861],{"type":48,"value":862},"Stack dependencies & cross-stack references",{"type":42,"tag":61,"props":864,"children":865},{},[866],{"type":48,"value":867},"Runtime config (context\u002Fenv vars)",{"type":42,"tag":61,"props":869,"children":870},{},[871],{"type":48,"value":872},"Construct types (L1, L2, L3)",{"type":42,"tag":217,"props":874,"children":876},{"id":875},"_2-code-conversion-cdk-pulumi",[877],{"type":48,"value":878},"2. CODE CONVERSION (CDK → PULUMI)",{"type":42,"tag":71,"props":880,"children":881},{},[882,903],{"type":42,"tag":61,"props":883,"children":884},{},[885,887,893,895,901],{"type":48,"value":886},"Perform the initial conversion using the ",{"type":42,"tag":114,"props":888,"children":890},{"className":889},[],[891],{"type":48,"value":892},"cdk2pulumi",{"type":48,"value":894}," tool. Follow ",{"type":42,"tag":896,"props":897,"children":899},"a",{"href":898},"cdk-convert.md",[900],{"type":48,"value":898},{"type":48,"value":902}," to perform the conversion.",{"type":42,"tag":61,"props":904,"children":905},{},[906],{"type":48,"value":907},"Read the conversion report and fill in any gaps. For example, if the conversion fails to convert a resource you have to convert it manually yourself.",{"type":42,"tag":224,"props":909,"children":911},{"id":910},"_21-custom-resources-handling",[912],{"type":48,"value":913},"2.1 Custom Resources Handling",{"type":42,"tag":51,"props":915,"children":916},{},[917],{"type":48,"value":918},"CDK uses Lambda-backed Custom Resources for functionality not available in CloudFormation. In synthesized CloudFormation, these appear as:",{"type":42,"tag":71,"props":920,"children":921},{},[922,940],{"type":42,"tag":61,"props":923,"children":924},{},[925,927,933,934],{"type":48,"value":926},"Resource type: ",{"type":42,"tag":114,"props":928,"children":930},{"className":929},[],[931],{"type":48,"value":932},"AWS::CloudFormation::CustomResource",{"type":48,"value":369},{"type":42,"tag":114,"props":935,"children":937},{"className":936},[],[938],{"type":48,"value":939},"Custom::\u003Cname>",{"type":42,"tag":61,"props":941,"children":942},{},[943,945,951,953,959],{"type":48,"value":944},"Metadata contains ",{"type":42,"tag":114,"props":946,"children":948},{"className":947},[],[949],{"type":48,"value":950},"aws:cdk:path",{"type":48,"value":952}," with the handler name (e.g., ",{"type":42,"tag":114,"props":954,"children":956},{"className":955},[],[957],{"type":48,"value":958},"aws-s3\u002Fauto-delete-objects-handler",{"type":48,"value":960},")",{"type":42,"tag":51,"props":962,"children":963},{},[964,969,971,976,978,984],{"type":42,"tag":65,"props":965,"children":966},{},[967],{"type":48,"value":968},"Default behavior",{"type":48,"value":970},": ",{"type":42,"tag":114,"props":972,"children":974},{"className":973},[],[975],{"type":48,"value":892},{"type":48,"value":977}," rewrites custom resources to ",{"type":42,"tag":114,"props":979,"children":981},{"className":980},[],[982],{"type":48,"value":983},"aws-native:cloudformation:CustomResourceEmulator",{"type":48,"value":985},", which invokes the original Lambda. This works but has tradeoffs (Lambda dependency, cold starts, eventual consistency).",{"type":42,"tag":51,"props":987,"children":988},{},[989],{"type":42,"tag":65,"props":990,"children":991},{},[992],{"type":48,"value":993},"Migration strategies by handler type:",{"type":42,"tag":995,"props":996,"children":997},"table",{},[998,1017],{"type":42,"tag":999,"props":1000,"children":1001},"thead",{},[1002],{"type":42,"tag":1003,"props":1004,"children":1005},"tr",{},[1006,1012],{"type":42,"tag":1007,"props":1008,"children":1009},"th",{},[1010],{"type":48,"value":1011},"Handler",{"type":42,"tag":1007,"props":1013,"children":1014},{},[1015],{"type":48,"value":1016},"Strategy",{"type":42,"tag":1018,"props":1019,"children":1020},"tbody",{},[1021,1061,1085,1122,1157,1179,1209,1231,1259],{"type":42,"tag":1003,"props":1022,"children":1023},{},[1024,1034],{"type":42,"tag":1025,"props":1026,"children":1027},"td",{},[1028],{"type":42,"tag":114,"props":1029,"children":1031},{"className":1030},[],[1032],{"type":48,"value":1033},"aws-certificatemanager\u002Fdns-validated-certificate-handler",{"type":42,"tag":1025,"props":1035,"children":1036},{},[1037,1039,1045,1047,1053,1055],{"type":48,"value":1038},"Replace with ",{"type":42,"tag":114,"props":1040,"children":1042},{"className":1041},[],[1043],{"type":48,"value":1044},"aws.acm.Certificate",{"type":48,"value":1046},", ",{"type":42,"tag":114,"props":1048,"children":1050},{"className":1049},[],[1051],{"type":48,"value":1052},"aws.route53.Record",{"type":48,"value":1054},", and ",{"type":42,"tag":114,"props":1056,"children":1058},{"className":1057},[],[1059],{"type":48,"value":1060},"aws.acm.CertificateValidation",{"type":42,"tag":1003,"props":1062,"children":1063},{},[1064,1073],{"type":42,"tag":1025,"props":1065,"children":1066},{},[1067],{"type":42,"tag":114,"props":1068,"children":1070},{"className":1069},[],[1071],{"type":48,"value":1072},"aws-ec2\u002Frestrict-default-security-group-handler",{"type":42,"tag":1025,"props":1074,"children":1075},{},[1076,1077,1083],{"type":48,"value":1038},{"type":42,"tag":114,"props":1078,"children":1080},{"className":1079},[],[1081],{"type":48,"value":1082},"aws.ec2.DefaultSecurityGroup",{"type":48,"value":1084}," resource with empty ingress\u002Fegress rules",{"type":42,"tag":1003,"props":1086,"children":1087},{},[1088,1097],{"type":42,"tag":1025,"props":1089,"children":1090},{},[1091],{"type":42,"tag":114,"props":1092,"children":1094},{"className":1093},[],[1095],{"type":48,"value":1096},"aws-ecr\u002Fauto-delete-images-handler",{"type":42,"tag":1025,"props":1098,"children":1099},{},[1100,1102,1108,1109,1115,1116],{"type":48,"value":1101},"Replace ",{"type":42,"tag":114,"props":1103,"children":1105},{"className":1104},[],[1106],{"type":48,"value":1107},"aws-native:ecr:Repository",{"type":48,"value":348},{"type":42,"tag":114,"props":1110,"children":1112},{"className":1111},[],[1113],{"type":48,"value":1114},"aws.ecr.Repository",{"type":48,"value":348},{"type":42,"tag":114,"props":1117,"children":1119},{"className":1118},[],[1120],{"type":48,"value":1121},"forceDelete: true",{"type":42,"tag":1003,"props":1123,"children":1124},{},[1125,1133],{"type":42,"tag":1025,"props":1126,"children":1127},{},[1128],{"type":42,"tag":114,"props":1129,"children":1131},{"className":1130},[],[1132],{"type":48,"value":958},{"type":42,"tag":1025,"props":1134,"children":1135},{},[1136,1137,1143,1144,1150,1151],{"type":48,"value":1101},{"type":42,"tag":114,"props":1138,"children":1140},{"className":1139},[],[1141],{"type":48,"value":1142},"aws-native:s3:Bucket",{"type":48,"value":348},{"type":42,"tag":114,"props":1145,"children":1147},{"className":1146},[],[1148],{"type":48,"value":1149},"aws.s3.Bucket",{"type":48,"value":348},{"type":42,"tag":114,"props":1152,"children":1154},{"className":1153},[],[1155],{"type":48,"value":1156},"forceDestroy: true",{"type":42,"tag":1003,"props":1158,"children":1159},{},[1160,1169],{"type":42,"tag":1025,"props":1161,"children":1162},{},[1163],{"type":42,"tag":114,"props":1164,"children":1166},{"className":1165},[],[1167],{"type":48,"value":1168},"aws-s3\u002Fnotifications-resource-handler",{"type":42,"tag":1025,"props":1170,"children":1171},{},[1172,1173],{"type":48,"value":1038},{"type":42,"tag":114,"props":1174,"children":1176},{"className":1175},[],[1177],{"type":48,"value":1178},"aws.s3.BucketNotification",{"type":42,"tag":1003,"props":1180,"children":1181},{},[1182,1191],{"type":42,"tag":1025,"props":1183,"children":1184},{},[1185],{"type":42,"tag":114,"props":1186,"children":1188},{"className":1187},[],[1189],{"type":48,"value":1190},"aws-logs\u002Flog-retention-handler",{"type":42,"tag":1025,"props":1192,"children":1193},{},[1194,1195,1201,1203],{"type":48,"value":1038},{"type":42,"tag":114,"props":1196,"children":1198},{"className":1197},[],[1199],{"type":48,"value":1200},"aws.cloudwatch.LogGroup",{"type":48,"value":1202}," with explicit ",{"type":42,"tag":114,"props":1204,"children":1206},{"className":1205},[],[1207],{"type":48,"value":1208},"retentionInDays",{"type":42,"tag":1003,"props":1210,"children":1211},{},[1212,1221],{"type":42,"tag":1025,"props":1213,"children":1214},{},[1215],{"type":42,"tag":114,"props":1216,"children":1218},{"className":1217},[],[1219],{"type":48,"value":1220},"aws-iam\u002Foidc-handler",{"type":42,"tag":1025,"props":1222,"children":1223},{},[1224,1225],{"type":48,"value":1038},{"type":42,"tag":114,"props":1226,"children":1228},{"className":1227},[],[1229],{"type":48,"value":1230},"aws.iam.OpenIdConnectProvider",{"type":42,"tag":1003,"props":1232,"children":1233},{},[1234,1243],{"type":42,"tag":1025,"props":1235,"children":1236},{},[1237],{"type":42,"tag":114,"props":1238,"children":1240},{"className":1239},[],[1241],{"type":48,"value":1242},"aws-route53\u002Fdelete-existing-record-set-handler",{"type":42,"tag":1025,"props":1244,"children":1245},{},[1246,1247,1252,1253],{"type":48,"value":1038},{"type":42,"tag":114,"props":1248,"children":1250},{"className":1249},[],[1251],{"type":48,"value":1052},{"type":48,"value":348},{"type":42,"tag":114,"props":1254,"children":1256},{"className":1255},[],[1257],{"type":48,"value":1258},"allowOverwrite: true",{"type":42,"tag":1003,"props":1260,"children":1261},{},[1262,1271],{"type":42,"tag":1025,"props":1263,"children":1264},{},[1265],{"type":42,"tag":114,"props":1266,"children":1268},{"className":1267},[],[1269],{"type":48,"value":1270},"aws-dynamodb\u002Freplica-handler",{"type":42,"tag":1025,"props":1272,"children":1273},{},[1274,1275],{"type":48,"value":1038},{"type":42,"tag":114,"props":1276,"children":1278},{"className":1277},[],[1279],{"type":48,"value":1280},"aws.dynamodb.TableReplica",{"type":42,"tag":51,"props":1282,"children":1283},{},[1284],{"type":42,"tag":65,"props":1285,"children":1286},{},[1287],{"type":48,"value":1288},"Cross-account\u002Fregion handlers:",{"type":42,"tag":71,"props":1290,"children":1291},{},[1292,1316],{"type":42,"tag":61,"props":1293,"children":1294},{},[1295,1301,1303,1309,1310],{"type":42,"tag":114,"props":1296,"children":1298},{"className":1297},[],[1299],{"type":48,"value":1300},"aws-cloudfront\u002Fedge-function",{"type":48,"value":1302}," → Use ",{"type":42,"tag":114,"props":1304,"children":1306},{"className":1305},[],[1307],{"type":48,"value":1308},"aws.lambda.Function",{"type":48,"value":348},{"type":42,"tag":114,"props":1311,"children":1313},{"className":1312},[],[1314],{"type":48,"value":1315},"region: \"us-east-1\"",{"type":42,"tag":61,"props":1317,"children":1318},{},[1319,1325],{"type":42,"tag":114,"props":1320,"children":1322},{"className":1321},[],[1323],{"type":48,"value":1324},"aws-route53\u002Fcross-account-zone-delegation-handler",{"type":48,"value":1326}," → Use separate aws provider with cross-account role assumption",{"type":42,"tag":51,"props":1328,"children":1329},{},[1330],{"type":42,"tag":65,"props":1331,"children":1332},{},[1333],{"type":48,"value":1334},"Graceful degradation for unknown handlers:",{"type":42,"tag":57,"props":1336,"children":1337},{},[1338,1351],{"type":42,"tag":61,"props":1339,"children":1340},{},[1341,1343,1349],{"type":48,"value":1342},"Keep the ",{"type":42,"tag":114,"props":1344,"children":1346},{"className":1345},[],[1347],{"type":48,"value":1348},"CustomResourceEmulator",{"type":48,"value":1350}," (default behavior)",{"type":42,"tag":61,"props":1352,"children":1353},{},[1354,1356],{"type":48,"value":1355},"Document the custom resource in the migration report with:\n",{"type":42,"tag":71,"props":1357,"children":1358},{},[1359,1364,1369],{"type":42,"tag":61,"props":1360,"children":1361},{},[1362],{"type":48,"value":1363},"Original handler name and purpose (if discernible from CDK path)",{"type":42,"tag":61,"props":1365,"children":1366},{},[1367],{"type":48,"value":1368},"Note that it uses Lambda invocation at runtime",{"type":42,"tag":61,"props":1370,"children":1371},{},[1372],{"type":48,"value":1373},"Recommend user review for potential native replacement",{"type":42,"tag":224,"props":1375,"children":1377},{"id":1376},"_22-provider-strategy",[1378],{"type":48,"value":1379},"2.2 Provider Strategy",{"type":42,"tag":71,"props":1381,"children":1382},{},[1383,1401],{"type":42,"tag":61,"props":1384,"children":1385},{},[1386,1391,1393,1399],{"type":42,"tag":65,"props":1387,"children":1388},{},[1389],{"type":48,"value":1390},"Default",{"type":48,"value":1392},": Use ",{"type":42,"tag":114,"props":1394,"children":1396},{"className":1395},[],[1397],{"type":48,"value":1398},"aws-native",{"type":48,"value":1400}," whenever the resource type is available.",{"type":42,"tag":61,"props":1402,"children":1403},{},[1404,1409,1410,1415],{"type":42,"tag":65,"props":1405,"children":1406},{},[1407],{"type":48,"value":1408},"Fallback",{"type":48,"value":1392},{"type":42,"tag":114,"props":1411,"children":1413},{"className":1412},[],[1414],{"type":48,"value":25},{"type":48,"value":1416}," when aws-native does not support equivalent features.",{"type":42,"tag":224,"props":1418,"children":1420},{"id":1419},"_23-assets-bundling",[1421],{"type":48,"value":1422},"2.3 Assets & Bundling",{"type":42,"tag":51,"props":1424,"children":1425},{},[1426,1428,1433,1435,1441],{"type":48,"value":1427},"CDK uses Assets and Bundling to handle deployment artifacts. These are processed by the CDK CLI before CloudFormation deployment and appear in the ",{"type":42,"tag":114,"props":1429,"children":1431},{"className":1430},[],[1432],{"type":48,"value":188},{"type":48,"value":1434}," directory alongside ",{"type":42,"tag":114,"props":1436,"children":1438},{"className":1437},[],[1439],{"type":48,"value":1440},"*.assets.json",{"type":48,"value":1442}," metadata files. CloudFormation templates contain hard-coded references to asset locations (S3 bucket\u002Fkey or ECR repo\u002Ftag).",{"type":42,"tag":295,"props":1444,"children":1446},{"className":297,"code":1445,"language":299,"meta":300,"style":300},"# Inspect asset definitions\njq '.files, .dockerImages' cdk.out\u002F*.assets.json\n",[1447],{"type":42,"tag":114,"props":1448,"children":1449},{"__ignoreMap":300},[1450,1459],{"type":42,"tag":306,"props":1451,"children":1452},{"class":308,"line":309},[1453],{"type":42,"tag":306,"props":1454,"children":1456},{"style":1455},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[1457],{"type":48,"value":1458},"# Inspect asset definitions\n",{"type":42,"tag":306,"props":1460,"children":1461},{"class":308,"line":457},[1462,1466,1470,1475,1479,1484,1489],{"type":42,"tag":306,"props":1463,"children":1464},{"style":313},[1465],{"type":48,"value":411},{"type":42,"tag":306,"props":1467,"children":1468},{"style":414},[1469],{"type":48,"value":417},{"type":42,"tag":306,"props":1471,"children":1472},{"style":319},[1473],{"type":48,"value":1474},".files, .dockerImages",{"type":42,"tag":306,"props":1476,"children":1477},{"style":414},[1478],{"type":48,"value":427},{"type":42,"tag":306,"props":1480,"children":1481},{"style":319},[1482],{"type":48,"value":1483}," cdk.out\u002F",{"type":42,"tag":306,"props":1485,"children":1486},{"style":760},[1487],{"type":48,"value":1488},"*",{"type":42,"tag":306,"props":1490,"children":1491},{"style":319},[1492],{"type":48,"value":1493},".assets.json\n",{"type":42,"tag":51,"props":1495,"children":1496},{},[1497],{"type":42,"tag":65,"props":1498,"children":1499},{},[1500],{"type":48,"value":1501},"Migration strategies by asset type:",{"type":42,"tag":995,"props":1503,"children":1504},{},[1505,1526],{"type":42,"tag":999,"props":1506,"children":1507},{},[1508],{"type":42,"tag":1003,"props":1509,"children":1510},{},[1511,1516,1521],{"type":42,"tag":1007,"props":1512,"children":1513},{},[1514],{"type":48,"value":1515},"Asset Type",{"type":42,"tag":1007,"props":1517,"children":1518},{},[1519],{"type":48,"value":1520},"Detection",{"type":42,"tag":1007,"props":1522,"children":1523},{},[1524],{"type":48,"value":1525},"Pulumi Migration",{"type":42,"tag":1018,"props":1527,"children":1528},{},[1529,1564,1603,1648],{"type":42,"tag":1003,"props":1530,"children":1531},{},[1532,1540,1551],{"type":42,"tag":1025,"props":1533,"children":1534},{},[1535],{"type":42,"tag":65,"props":1536,"children":1537},{},[1538],{"type":48,"value":1539},"Docker Image",{"type":42,"tag":1025,"props":1541,"children":1542},{},[1543,1549],{"type":42,"tag":114,"props":1544,"children":1546},{"className":1545},[],[1547],{"type":48,"value":1548},"dockerImages",{"type":48,"value":1550}," in assets.json",{"type":42,"tag":1025,"props":1552,"children":1553},{},[1554,1556,1562],{"type":48,"value":1555},"Use ",{"type":42,"tag":114,"props":1557,"children":1559},{"className":1558},[],[1560],{"type":48,"value":1561},"docker-build.Image",{"type":48,"value":1563}," to build and push. Replace hard-coded ECR URI with image output.",{"type":42,"tag":1003,"props":1565,"children":1566},{},[1567,1575,1593],{"type":42,"tag":1025,"props":1568,"children":1569},{},[1570],{"type":42,"tag":65,"props":1571,"children":1572},{},[1573],{"type":48,"value":1574},"File with build command",{"type":42,"tag":1025,"props":1576,"children":1577},{},[1578,1584,1585,1591],{"type":42,"tag":114,"props":1579,"children":1581},{"className":1580},[],[1582],{"type":48,"value":1583},"files",{"type":48,"value":348},{"type":42,"tag":114,"props":1586,"children":1588},{"className":1587},[],[1589],{"type":48,"value":1590},"executable",{"type":48,"value":1592}," field",{"type":42,"tag":1025,"props":1594,"children":1595},{},[1596,1601],{"type":42,"tag":65,"props":1597,"children":1598},{},[1599],{"type":48,"value":1600},"Flag to user",{"type":48,"value":1602}," - build command needs setup in Pulumi",{"type":42,"tag":1003,"props":1604,"children":1605},{},[1606,1614,1631],{"type":42,"tag":1025,"props":1607,"children":1608},{},[1609],{"type":42,"tag":65,"props":1610,"children":1611},{},[1612],{"type":48,"value":1613},"Static file",{"type":42,"tag":1025,"props":1615,"children":1616},{},[1617,1622,1624,1629],{"type":42,"tag":114,"props":1618,"children":1620},{"className":1619},[],[1621],{"type":48,"value":1583},{"type":48,"value":1623}," without ",{"type":42,"tag":114,"props":1625,"children":1627},{"className":1626},[],[1628],{"type":48,"value":1590},{"type":48,"value":1630},", no bundling in CDK source",{"type":42,"tag":1025,"props":1632,"children":1633},{},[1634,1635,1641,1642],{"type":48,"value":1555},{"type":42,"tag":114,"props":1636,"children":1638},{"className":1637},[],[1639],{"type":48,"value":1640},"pulumi.FileArchive",{"type":48,"value":369},{"type":42,"tag":114,"props":1643,"children":1645},{"className":1644},[],[1646],{"type":48,"value":1647},"pulumi.FileAsset",{"type":42,"tag":1003,"props":1649,"children":1650},{},[1651,1659,1675],{"type":42,"tag":1025,"props":1652,"children":1653},{},[1654],{"type":42,"tag":65,"props":1655,"children":1656},{},[1657],{"type":48,"value":1658},"Bundled file",{"type":42,"tag":1025,"props":1660,"children":1661},{},[1662,1667,1668,1673],{"type":42,"tag":114,"props":1663,"children":1665},{"className":1664},[],[1666],{"type":48,"value":1583},{"type":48,"value":1623},{"type":42,"tag":114,"props":1669,"children":1671},{"className":1670},[],[1672],{"type":48,"value":1590},{"type":48,"value":1674},", but CDK source uses bundling",{"type":42,"tag":1025,"props":1676,"children":1677},{},[1678,1682],{"type":42,"tag":65,"props":1679,"children":1680},{},[1681],{"type":48,"value":1600},{"type":48,"value":1683}," - bundling needs setup in Pulumi",{"type":42,"tag":51,"props":1685,"children":1686},{},[1687],{"type":42,"tag":65,"props":1688,"children":1689},{},[1690],{"type":48,"value":1691},"Detecting Bundling in CDK Source:",{"type":42,"tag":51,"props":1693,"children":1694},{},[1695,1697,1703,1704,1710,1711,1717,1719,1725,1727,1732],{"type":48,"value":1696},"Check the CDK source code for bundling constructs (",{"type":42,"tag":114,"props":1698,"children":1700},{"className":1699},[],[1701],{"type":48,"value":1702},"NodejsFunction",{"type":48,"value":1046},{"type":42,"tag":114,"props":1705,"children":1707},{"className":1706},[],[1708],{"type":48,"value":1709},"PythonFunction",{"type":48,"value":1046},{"type":42,"tag":114,"props":1712,"children":1714},{"className":1713},[],[1715],{"type":48,"value":1716},"GoFunction",{"type":48,"value":1718},", or resources using the ",{"type":42,"tag":114,"props":1720,"children":1722},{"className":1721},[],[1723],{"type":48,"value":1724},"bundling",{"type":48,"value":1726}," option). If bundling is used, the build step needs to be replicated in Pulumi for ongoing development - otherwise source changes would require manually re-running ",{"type":42,"tag":114,"props":1728,"children":1730},{"className":1729},[],[1731],{"type":48,"value":248},{"type":48,"value":1733},".",{"type":42,"tag":51,"props":1735,"children":1736},{},[1737],{"type":42,"tag":65,"props":1738,"children":1739},{},[1740],{"type":48,"value":1741},"When bundling is detected, inform the user:",{"type":42,"tag":1743,"props":1744,"children":1745},"blockquote",{},[1746,1756,1764,1816],{"type":42,"tag":51,"props":1747,"children":1748},{},[1749,1754],{"type":42,"tag":65,"props":1750,"children":1751},{},[1752],{"type":48,"value":1753},"Build Step Detected",{"type":48,"value":1755},": This CDK application uses \u003CBUNDLING_TYPE> which builds deployable artifacts during synthesis. This build step needs to be replicated in Pulumi for ongoing development.",{"type":42,"tag":51,"props":1757,"children":1758},{},[1759],{"type":42,"tag":65,"props":1760,"children":1761},{},[1762],{"type":48,"value":1763},"Options:",{"type":42,"tag":57,"props":1765,"children":1766},{},[1767,1777,1799],{"type":42,"tag":61,"props":1768,"children":1769},{},[1770,1775],{"type":42,"tag":65,"props":1771,"children":1772},{},[1773],{"type":48,"value":1774},"CI\u002FCD Pipeline",{"type":48,"value":1776}," (Recommended): Move the build step to your CI pipeline and reference the pre-built artifact in Pulumi",{"type":42,"tag":61,"props":1778,"children":1779},{},[1780,1785,1786,1792,1794],{"type":42,"tag":65,"props":1781,"children":1782},{},[1783],{"type":48,"value":1784},"Pulumi Command Provider",{"type":48,"value":1392},{"type":42,"tag":114,"props":1787,"children":1789},{"className":1788},[],[1790],{"type":48,"value":1791},"command.local.Command",{"type":48,"value":1793}," to run the build command during ",{"type":42,"tag":114,"props":1795,"children":1797},{"className":1796},[],[1798],{"type":48,"value":119},{"type":42,"tag":61,"props":1800,"children":1801},{},[1802,1807,1809,1814],{"type":42,"tag":65,"props":1803,"children":1804},{},[1805],{"type":48,"value":1806},"Pre-build Script",{"type":48,"value":1808},": Create a build script that runs before ",{"type":42,"tag":114,"props":1810,"children":1812},{"className":1811},[],[1813],{"type":48,"value":119},{"type":48,"value":1815}," and outputs to a known location",{"type":42,"tag":51,"props":1817,"children":1818},{},[1819],{"type":48,"value":1820},"Each option has tradeoffs around caching, reproducibility, and deployment speed. For production workloads, option 1 is typically preferred.",{"type":42,"tag":224,"props":1822,"children":1824},{"id":1823},"_24-typescript-handling-for-aws-native",[1825],{"type":48,"value":1826},"2.4 TypeScript Handling for aws-native",{"type":42,"tag":51,"props":1828,"children":1829},{},[1830,1832,1838,1840,1846],{"type":48,"value":1831},"aws-native outputs often include undefined. Avoid ",{"type":42,"tag":114,"props":1833,"children":1835},{"className":1834},[],[1836],{"type":48,"value":1837},"!",{"type":48,"value":1839}," non-null assertions. Always safely unwrap with ",{"type":42,"tag":114,"props":1841,"children":1843},{"className":1842},[],[1844],{"type":48,"value":1845},".apply()",{"type":48,"value":396},{"type":42,"tag":295,"props":1848,"children":1852},{"className":1849,"code":1850,"language":1851,"meta":300,"style":300},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F ❌ WRONG - Will cause TypeScript errors\nfunctionName: lambdaFunction.functionName!,\n\n\u002F\u002F ✅ CORRECT - Handle undefined safely\nfunctionName: lambdaFunction.functionName.apply(name => name || \"\"),\n","ts",[1853],{"type":42,"tag":114,"props":1854,"children":1855},{"__ignoreMap":300},[1856,1864,1894,1903,1911],{"type":42,"tag":306,"props":1857,"children":1858},{"class":308,"line":309},[1859],{"type":42,"tag":306,"props":1860,"children":1861},{"style":1455},[1862],{"type":48,"value":1863},"\u002F\u002F ❌ WRONG - Will cause TypeScript errors\n",{"type":42,"tag":306,"props":1865,"children":1866},{"class":308,"line":457},[1867,1872,1876,1881,1885,1889],{"type":42,"tag":306,"props":1868,"children":1869},{"style":313},[1870],{"type":48,"value":1871},"functionName",{"type":42,"tag":306,"props":1873,"children":1874},{"style":414},[1875],{"type":48,"value":396},{"type":42,"tag":306,"props":1877,"children":1878},{"style":760},[1879],{"type":48,"value":1880}," lambdaFunction",{"type":42,"tag":306,"props":1882,"children":1883},{"style":414},[1884],{"type":48,"value":1733},{"type":42,"tag":306,"props":1886,"children":1887},{"style":760},[1888],{"type":48,"value":1871},{"type":42,"tag":306,"props":1890,"children":1891},{"style":414},[1892],{"type":48,"value":1893},"!,\n",{"type":42,"tag":306,"props":1895,"children":1896},{"class":308,"line":500},[1897],{"type":42,"tag":306,"props":1898,"children":1900},{"emptyLinePlaceholder":1899},true,[1901],{"type":48,"value":1902},"\n",{"type":42,"tag":306,"props":1904,"children":1905},{"class":308,"line":30},[1906],{"type":42,"tag":306,"props":1907,"children":1908},{"style":1455},[1909],{"type":48,"value":1910},"\u002F\u002F ✅ CORRECT - Handle undefined safely\n",{"type":42,"tag":306,"props":1912,"children":1913},{"class":308,"line":543},[1914,1918,1922,1926,1930,1934,1938,1944,1949,1955,1960,1965,1970,1975,1979],{"type":42,"tag":306,"props":1915,"children":1916},{"style":313},[1917],{"type":48,"value":1871},{"type":42,"tag":306,"props":1919,"children":1920},{"style":414},[1921],{"type":48,"value":396},{"type":42,"tag":306,"props":1923,"children":1924},{"style":760},[1925],{"type":48,"value":1880},{"type":42,"tag":306,"props":1927,"children":1928},{"style":414},[1929],{"type":48,"value":1733},{"type":42,"tag":306,"props":1931,"children":1932},{"style":760},[1933],{"type":48,"value":1871},{"type":42,"tag":306,"props":1935,"children":1936},{"style":414},[1937],{"type":48,"value":1733},{"type":42,"tag":306,"props":1939,"children":1941},{"style":1940},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[1942],{"type":48,"value":1943},"apply",{"type":42,"tag":306,"props":1945,"children":1946},{"style":760},[1947],{"type":48,"value":1948},"(",{"type":42,"tag":306,"props":1950,"children":1952},{"style":1951},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[1953],{"type":48,"value":1954},"name",{"type":42,"tag":306,"props":1956,"children":1957},{"style":466},[1958],{"type":48,"value":1959}," =>",{"type":42,"tag":306,"props":1961,"children":1962},{"style":760},[1963],{"type":48,"value":1964}," name ",{"type":42,"tag":306,"props":1966,"children":1967},{"style":414},[1968],{"type":48,"value":1969},"||",{"type":42,"tag":306,"props":1971,"children":1972},{"style":414},[1973],{"type":48,"value":1974}," \"\"",{"type":42,"tag":306,"props":1976,"children":1977},{"style":760},[1978],{"type":48,"value":960},{"type":42,"tag":306,"props":1980,"children":1981},{"style":414},[1982],{"type":48,"value":497},{"type":42,"tag":224,"props":1984,"children":1986},{"id":1985},"_25-environment-logic-preservation",[1987],{"type":48,"value":1988},"2.5 Environment Logic Preservation",{"type":42,"tag":51,"props":1990,"children":1991},{},[1992],{"type":48,"value":1993},"Carry forward all conditional behaviors:",{"type":42,"tag":295,"props":1995,"children":1997},{"className":1849,"code":1996,"language":1851,"meta":300,"style":300},"if (currentEnv.createVpc) {\n  \u002F\u002F create resources\n} else {\n  const vpcId = pulumi.output(currentEnv.vpcId);\n}\n",[1998],{"type":42,"tag":114,"props":1999,"children":2000},{"__ignoreMap":300},[2001,2028,2036,2054,2114],{"type":42,"tag":306,"props":2002,"children":2003},{"class":308,"line":309},[2004,2010,2015,2019,2024],{"type":42,"tag":306,"props":2005,"children":2007},{"style":2006},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[2008],{"type":48,"value":2009},"if",{"type":42,"tag":306,"props":2011,"children":2012},{"style":760},[2013],{"type":48,"value":2014}," (currentEnv",{"type":42,"tag":306,"props":2016,"children":2017},{"style":414},[2018],{"type":48,"value":1733},{"type":42,"tag":306,"props":2020,"children":2021},{"style":760},[2022],{"type":48,"value":2023},"createVpc) ",{"type":42,"tag":306,"props":2025,"children":2026},{"style":414},[2027],{"type":48,"value":454},{"type":42,"tag":306,"props":2029,"children":2030},{"class":308,"line":457},[2031],{"type":42,"tag":306,"props":2032,"children":2033},{"style":1455},[2034],{"type":48,"value":2035},"  \u002F\u002F create resources\n",{"type":42,"tag":306,"props":2037,"children":2038},{"class":308,"line":500},[2039,2044,2049],{"type":42,"tag":306,"props":2040,"children":2041},{"style":414},[2042],{"type":48,"value":2043},"}",{"type":42,"tag":306,"props":2045,"children":2046},{"style":2006},[2047],{"type":48,"value":2048}," else",{"type":42,"tag":306,"props":2050,"children":2051},{"style":414},[2052],{"type":48,"value":2053}," {\n",{"type":42,"tag":306,"props":2055,"children":2056},{"class":308,"line":30},[2057,2062,2067,2072,2077,2081,2086,2091,2096,2100,2105,2109],{"type":42,"tag":306,"props":2058,"children":2059},{"style":466},[2060],{"type":48,"value":2061},"  const",{"type":42,"tag":306,"props":2063,"children":2064},{"style":760},[2065],{"type":48,"value":2066}," vpcId",{"type":42,"tag":306,"props":2068,"children":2069},{"style":414},[2070],{"type":48,"value":2071}," =",{"type":42,"tag":306,"props":2073,"children":2074},{"style":760},[2075],{"type":48,"value":2076}," pulumi",{"type":42,"tag":306,"props":2078,"children":2079},{"style":414},[2080],{"type":48,"value":1733},{"type":42,"tag":306,"props":2082,"children":2083},{"style":1940},[2084],{"type":48,"value":2085},"output",{"type":42,"tag":306,"props":2087,"children":2089},{"style":2088},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[2090],{"type":48,"value":1948},{"type":42,"tag":306,"props":2092,"children":2093},{"style":760},[2094],{"type":48,"value":2095},"currentEnv",{"type":42,"tag":306,"props":2097,"children":2098},{"style":414},[2099],{"type":48,"value":1733},{"type":42,"tag":306,"props":2101,"children":2102},{"style":760},[2103],{"type":48,"value":2104},"vpcId",{"type":42,"tag":306,"props":2106,"children":2107},{"style":2088},[2108],{"type":48,"value":960},{"type":42,"tag":306,"props":2110,"children":2111},{"style":414},[2112],{"type":48,"value":2113},";\n",{"type":42,"tag":306,"props":2115,"children":2116},{"class":308,"line":543},[2117],{"type":42,"tag":306,"props":2118,"children":2119},{"style":414},[2120],{"type":48,"value":540},{"type":42,"tag":217,"props":2122,"children":2124},{"id":2123},"_3-resource-import-optional",[2125],{"type":48,"value":2126},"3. Resource Import (optional)",{"type":42,"tag":51,"props":2128,"children":2129},{},[2130],{"type":48,"value":2131},"After conversion you can optionally import the existing resources to now be managed by Pulumi. If the user does not request this you should suggest this as a follow up step to conversion.",{"type":42,"tag":71,"props":2133,"children":2134},{},[2135,2154],{"type":42,"tag":61,"props":2136,"children":2137},{},[2138,2140,2146,2147,2152],{"type":48,"value":2139},"Always start with automated import using the ",{"type":42,"tag":114,"props":2141,"children":2143},{"className":2142},[],[2144],{"type":48,"value":2145},"cdk-importer",{"type":48,"value":894},{"type":42,"tag":896,"props":2148,"children":2150},{"href":2149},"cdk-importer.md",[2151],{"type":48,"value":2149},{"type":48,"value":2153}," to perform the automated import.",{"type":42,"tag":61,"props":2155,"children":2156},{},[2157],{"type":48,"value":2158},"For any resources that fail to import with the automated tool, import them manually.",{"type":42,"tag":51,"props":2160,"children":2161},{},[2162],{"type":48,"value":2163},"If you need to manually import resources:",{"type":42,"tag":71,"props":2165,"children":2166},{},[2167,2179,2184,2201],{"type":42,"tag":61,"props":2168,"children":2169},{},[2170,2172,2177],{"type":48,"value":2171},"Follow ",{"type":42,"tag":896,"props":2173,"children":2175},{"href":2174},"cloudformation-id-lookup.md",[2176],{"type":48,"value":2174},{"type":48,"value":2178}," to look up CloudFormation import identifiers.",{"type":42,"tag":61,"props":2180,"children":2181},{},[2182],{"type":48,"value":2183},"Use the web-fetch tool to get content from the official Pulumi documentation.",{"type":42,"tag":61,"props":2185,"children":2186},{},[2187,2192,2194],{"type":42,"tag":65,"props":2188,"children":2189},{},[2190],{"type":48,"value":2191},"Finding AWS import IDs",{"type":48,"value":2193}," -> ",{"type":42,"tag":896,"props":2195,"children":2199},{"href":2196,"rel":2197},"https:\u002F\u002Fwww.pulumi.com\u002Fdocs\u002Fiac\u002Fguides\u002Fmigration\u002Faws-import-ids\u002F",[2198],"nofollow",[2200],{"type":48,"value":2196},{"type":42,"tag":61,"props":2202,"children":2203},{},[2204,2209,2210],{"type":42,"tag":65,"props":2205,"children":2206},{},[2207],{"type":48,"value":2208},"Manual migration approaches",{"type":48,"value":2193},{"type":42,"tag":896,"props":2211,"children":2214},{"href":2212,"rel":2213},"https:\u002F\u002Fwww.pulumi.com\u002Fdocs\u002Fiac\u002Fguides\u002Fmigration\u002Fmigrating-to-pulumi\u002Fmigrating-from-cdk\u002Fmigrating-existing-cdk-app\u002F#approach-b-manual-migration",[2198],[2215],{"type":48,"value":2212},{"type":42,"tag":224,"props":2217,"children":2219},{"id":2218},"_31-running-preview-after-import",[2220],{"type":48,"value":2221},"3.1 Running preview after import",{"type":42,"tag":51,"props":2223,"children":2224},{},[2225,2227,2233],{"type":48,"value":2226},"After performing an import you need to run ",{"type":42,"tag":114,"props":2228,"children":2230},{"className":2229},[],[2231],{"type":48,"value":2232},"pulumi preview",{"type":48,"value":2234}," to ensure there are no changes. No changes means:",{"type":42,"tag":71,"props":2236,"children":2237},{},[2238,2243,2248,2253],{"type":42,"tag":61,"props":2239,"children":2240},{},[2241],{"type":48,"value":2242},"NO updates",{"type":42,"tag":61,"props":2244,"children":2245},{},[2246],{"type":48,"value":2247},"NO replaces",{"type":42,"tag":61,"props":2249,"children":2250},{},[2251],{"type":48,"value":2252},"NO creates",{"type":42,"tag":61,"props":2254,"children":2255},{},[2256],{"type":48,"value":2257},"NO deletes",{"type":42,"tag":51,"props":2259,"children":2260},{},[2261],{"type":48,"value":2262},"If there are changes you must investigate and update the program until there are no changes.",{"type":42,"tag":172,"props":2264,"children":2266},{"id":2265},"working-with-the-user",[2267],{"type":48,"value":2268},"Working with the User",{"type":42,"tag":51,"props":2270,"children":2271},{},[2272],{"type":48,"value":2273},"If the user asks for help planning or performing a CDK to Pulumi migration use the information above to guide the user towards the automated migration approach.",{"type":42,"tag":172,"props":2275,"children":2277},{"id":2276},"for-detailed-documentation",[2278],{"type":48,"value":2279},"For Detailed Documentation",{"type":42,"tag":51,"props":2281,"children":2282},{},[2283,2285],{"type":48,"value":2284},"When the user wants to deviate from the recommended path detailed above, use the web-fetch tool to get content from the official Pulumi documentation -> ",{"type":42,"tag":896,"props":2286,"children":2289},{"href":2287,"rel":2288},"https:\u002F\u002Fwww.pulumi.com\u002Fdocs\u002Fiac\u002Fguides\u002Fmigration\u002Fmigrating-to-pulumi\u002Fmigrating-from-cdk\u002Fmigrating-existing-cdk-app",[2198],[2290],{"type":48,"value":2287},{"type":42,"tag":51,"props":2292,"children":2293},{},[2294],{"type":48,"value":2295},"This documentation covers topics:",{"type":42,"tag":71,"props":2297,"children":2298},{},[2299,2322,2327,2332,2337,2342],{"type":42,"tag":61,"props":2300,"children":2301},{},[2302,2304],{"type":48,"value":2303},"Migration Strategy\n",{"type":42,"tag":71,"props":2305,"children":2306},{},[2307,2312,2317],{"type":42,"tag":61,"props":2308,"children":2309},{},[2310],{"type":48,"value":2311},"Convert vs. Rewrite",{"type":42,"tag":61,"props":2313,"children":2314},{},[2315],{"type":48,"value":2316},"Import vs. Rehydrate",{"type":42,"tag":61,"props":2318,"children":2319},{},[2320],{"type":48,"value":2321},"Best Practices",{"type":42,"tag":61,"props":2323,"children":2324},{},[2325],{"type":48,"value":2326},"Handling Multiple CDK Stacks",{"type":42,"tag":61,"props":2328,"children":2329},{},[2330],{"type":48,"value":2331},"Handling CDK Stages",{"type":42,"tag":61,"props":2333,"children":2334},{},[2335],{"type":48,"value":2336},"Code organization",{"type":42,"tag":61,"props":2338,"children":2339},{},[2340],{"type":48,"value":2341},"Converting CDK Constructs",{"type":42,"tag":61,"props":2343,"children":2344},{},[2345,2347],{"type":48,"value":2346},"Execution Strategies\n",{"type":42,"tag":71,"props":2348,"children":2349},{},[2350,2355],{"type":42,"tag":61,"props":2351,"children":2352},{},[2353],{"type":48,"value":2354},"Automated Migration (recommended)",{"type":42,"tag":61,"props":2356,"children":2357},{},[2358],{"type":48,"value":2359},"Manual Migration",{"type":42,"tag":172,"props":2361,"children":2363},{"id":2362},"output-format-required",[2364],{"type":48,"value":2365},"OUTPUT FORMAT (REQUIRED)",{"type":42,"tag":51,"props":2367,"children":2368},{},[2369],{"type":48,"value":2370},"When performing a migration, always produce:",{"type":42,"tag":57,"props":2372,"children":2373},{},[2374,2384,2392,2402,2412,2447,2492,2501],{"type":42,"tag":61,"props":2375,"children":2376},{},[2377,2382],{"type":42,"tag":65,"props":2378,"children":2379},{},[2380],{"type":48,"value":2381},"Overview",{"type":48,"value":2383}," (high-level description)",{"type":42,"tag":61,"props":2385,"children":2386},{},[2387],{"type":42,"tag":65,"props":2388,"children":2389},{},[2390],{"type":48,"value":2391},"Migration Plan Summary",{"type":42,"tag":61,"props":2393,"children":2394},{},[2395,2400],{"type":42,"tag":65,"props":2396,"children":2397},{},[2398],{"type":48,"value":2399},"Pulumi Code Outputs",{"type":48,"value":2401}," (TypeScript; structured by file)",{"type":42,"tag":61,"props":2403,"children":2404},{},[2405,2410],{"type":42,"tag":65,"props":2406,"children":2407},{},[2408],{"type":48,"value":2409},"Resource Mapping Table",{"type":48,"value":2411}," (CDK → Pulumi)",{"type":42,"tag":61,"props":2413,"children":2414},{},[2415,2420,2422],{"type":42,"tag":65,"props":2416,"children":2417},{},[2418],{"type":48,"value":2419},"Custom Resources Summary",{"type":48,"value":2421}," (if any):\n",{"type":42,"tag":71,"props":2423,"children":2424},{},[2425,2430,2442],{"type":42,"tag":61,"props":2426,"children":2427},{},[2428],{"type":48,"value":2429},"Handlers migrated to native Pulumi resources",{"type":42,"tag":61,"props":2431,"children":2432},{},[2433,2435,2440],{"type":48,"value":2434},"Handlers kept as ",{"type":42,"tag":114,"props":2436,"children":2438},{"className":2437},[],[2439],{"type":48,"value":1348},{"type":48,"value":2441}," with rationale",{"type":42,"tag":61,"props":2443,"children":2444},{},[2445],{"type":48,"value":2446},"Any handlers requiring user attention",{"type":42,"tag":61,"props":2448,"children":2449},{},[2450,2455,2456],{"type":42,"tag":65,"props":2451,"children":2452},{},[2453],{"type":48,"value":2454},"Assets & Bundling Summary",{"type":48,"value":2421},{"type":42,"tag":71,"props":2457,"children":2458},{},[2459,2482],{"type":42,"tag":61,"props":2460,"children":2461},{},[2462,2467,2469,2474,2476,2481],{"type":42,"tag":65,"props":2463,"children":2464},{},[2465],{"type":48,"value":2466},"Migrated",{"type":48,"value":2468},": Assets successfully converted (e.g., Docker images → ",{"type":42,"tag":114,"props":2470,"children":2472},{"className":2471},[],[2473],{"type":48,"value":1561},{"type":48,"value":2475},", static files → ",{"type":42,"tag":114,"props":2477,"children":2479},{"className":2478},[],[2480],{"type":48,"value":1640},{"type":48,"value":960},{"type":42,"tag":61,"props":2483,"children":2484},{},[2485,2490],{"type":42,"tag":65,"props":2486,"children":2487},{},[2488],{"type":48,"value":2489},"Requires attention",{"type":48,"value":2491},": Assets with bundling steps, options presented, and decision if made",{"type":42,"tag":61,"props":2493,"children":2494},{},[2495,2499],{"type":42,"tag":65,"props":2496,"children":2497},{},[2498],{"type":48,"value":129},{"type":48,"value":2500}," (PR-ready)",{"type":42,"tag":61,"props":2502,"children":2503},{},[2504,2509],{"type":42,"tag":65,"props":2505,"children":2506},{},[2507],{"type":48,"value":2508},"Next Steps",{"type":48,"value":2510}," (optional refactors)",{"type":42,"tag":51,"props":2512,"children":2513},{},[2514],{"type":48,"value":2515},"Keep code syntactically valid and clearly separated by files.",{"type":42,"tag":2517,"props":2518,"children":2519},"style",{},[2520],{"type":48,"value":2521},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2523,"total":2616},[2524,2536,2551,2564,2578,2593,2608],{"slug":2525,"name":2525,"fn":2526,"description":2527,"org":2528,"tags":2529,"stars":26,"repoUrl":27,"updatedAt":2535},"cloudformation-to-pulumi","migrate CloudFormation to Pulumi","Convert, migrate, or import AWS CloudFormation stacks or templates into Pulumi programs. Load this skill whenever a user wants to move from CloudFormation to Pulumi, convert a CFN template, import existing CloudFormation-managed resources into Pulumi, or asks about CloudFormation-to-Pulumi migration in any form. Also load when the user mentions cdk-importer in a migration context.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2530,2531,2532,2533,2534],{"name":24,"slug":25,"type":13},{"name":18,"slug":19,"type":13},{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},"2026-04-06T18:50:36.677615",{"slug":2537,"name":2537,"fn":2538,"description":2539,"org":2540,"tags":2541,"stars":26,"repoUrl":27,"updatedAt":2550},"package-usage","audit Pulumi package usage across stacks","Track which stacks across a Pulumi organization use a specific package and at what versions. Use for cross-stack audits, identifying outdated or unmaintained package versions across many stacks, finding affected stacks before publishing breaking changes to a component package, or planning coordinated upgrade rollouts. Do NOT use for upgrading a cloud provider package (pulumi-aws, pulumi-azure-native, pulumi-gcp, pulumi-kubernetes, etc.) in a single project — use skill `provider-upgrade` instead. Do NOT use for general infrastructure creation, resource provisioning, or how-to questions about a package.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2542,2545,2546,2549],{"name":2543,"slug":2544,"type":13},"Audit","audit",{"name":21,"slug":22,"type":13},{"name":2547,"slug":2548,"type":13},"Operations","operations",{"name":9,"slug":8,"type":13},"2026-07-24T05:37:48.019964",{"slug":2552,"name":2552,"fn":2553,"description":2554,"org":2555,"tags":2556,"stars":26,"repoUrl":27,"updatedAt":2563},"provider-upgrade","upgrade and reconcile Pulumi providers","Upgrade any Pulumi provider to a newer version and reconcile the resulting diff. Use when users want to upgrade or update a provider (including editing package.json, requirements.txt, pyproject.toml, go.mod, or Pulumi.yaml to bump a provider SDK), check for breaking changes before or during an upgrade, fix resources that broke after a provider upgrade, or resolve unexpected replacements, creates, or deletes in a post-upgrade preview. Applies to all providers (aws, azure-native, gcp, kubernetes, aws-native, cloudflare, datadog, etc.) — not just Tier 1. Do NOT use for querying which stacks use what package versions; use skill `package-usage` for cross-stack audits. Do NOT use for general infrastructure tasks.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2557,2560,2561,2562],{"name":2558,"slug":2559,"type":13},"DevOps","devops",{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},"2026-06-04T07:58:58.874758",{"slug":2565,"name":2565,"fn":2566,"description":2567,"org":2568,"tags":2569,"stars":26,"repoUrl":27,"updatedAt":2577},"pulumi-arm-to-pulumi","migrate Azure ARM to Pulumi","Convert or migrate Azure ARM (Azure Resource Manager) templates, Bicep templates, or code to Pulumi, including importing existing Azure resources. This skill MUST be loaded whenever a user requests migration, conversion, or import of ARM templates, Bicep templates, ARM code, Bicep code, or Azure resources to Pulumi.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2570,2573,2574,2575,2576],{"name":2571,"slug":2572,"type":13},"Azure","azure",{"name":18,"slug":19,"type":13},{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},"2026-04-06T18:50:35.384851",{"slug":2579,"name":2579,"fn":2580,"description":2581,"org":2582,"tags":2583,"stars":26,"repoUrl":27,"updatedAt":2592},"pulumi-automation-api","run Pulumi programs via Automation API","Load this skill when a user asks how to run Pulumi programmatically, embed Pulumi in an application, orchestrate multiple stacks in code, build a self-service infrastructure portal, replace pulumi CLI shell scripts with code, or use the Pulumi Automation API (LocalWorkspace, createOrSelectStack, inline programs). Also load for questions about multi-stack sequencing, parallel deployments, or passing outputs between stacks via code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2584,2587,2590,2591],{"name":2585,"slug":2586,"type":13},"API Development","api-development",{"name":2588,"slug":2589,"type":13},"Automation","automation",{"name":21,"slug":22,"type":13},{"name":9,"slug":8,"type":13},"2026-06-04T07:59:00.113998",{"slug":2594,"name":2594,"fn":2595,"description":2596,"org":2597,"tags":2598,"stars":26,"repoUrl":27,"updatedAt":2607},"pulumi-best-practices","apply Pulumi best practices for infrastructure","Load when the user is writing, reviewing, or debugging Pulumi TypeScript\u002FPython programs; asks about Output\u003CT> or apply() usage; wants to create ComponentResource classes; needs to refactor resources without destroying them (aliases); is setting up secrets or config; or is configuring a pulumi preview\u002Fup CI workflow. Also load for questions about resource dependency order, parent\u002Fchild resource relationships, or pulumi.interpolate.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2599,2600,2601,2604],{"name":21,"slug":22,"type":13},{"name":9,"slug":8,"type":13},{"name":2602,"slug":2603,"type":13},"Python","python",{"name":2605,"slug":2606,"type":13},"TypeScript","typescript","2026-06-03T07:52:43.916562",{"slug":4,"name":4,"fn":5,"description":6,"org":2609,"tags":2610,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2611,2612,2613,2614,2615],{"name":24,"slug":25,"type":13},{"name":18,"slug":19,"type":13},{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},12,{"items":2618,"total":2616},[2619,2627,2634,2641,2649,2656,2663,2671,2686,2699,2714,2724],{"slug":2525,"name":2525,"fn":2526,"description":2527,"org":2620,"tags":2621,"stars":26,"repoUrl":27,"updatedAt":2535},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2622,2623,2624,2625,2626],{"name":24,"slug":25,"type":13},{"name":18,"slug":19,"type":13},{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"slug":2537,"name":2537,"fn":2538,"description":2539,"org":2628,"tags":2629,"stars":26,"repoUrl":27,"updatedAt":2550},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2630,2631,2632,2633],{"name":2543,"slug":2544,"type":13},{"name":21,"slug":22,"type":13},{"name":2547,"slug":2548,"type":13},{"name":9,"slug":8,"type":13},{"slug":2552,"name":2552,"fn":2553,"description":2554,"org":2635,"tags":2636,"stars":26,"repoUrl":27,"updatedAt":2563},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2637,2638,2639,2640],{"name":2558,"slug":2559,"type":13},{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"slug":2565,"name":2565,"fn":2566,"description":2567,"org":2642,"tags":2643,"stars":26,"repoUrl":27,"updatedAt":2577},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2644,2645,2646,2647,2648],{"name":2571,"slug":2572,"type":13},{"name":18,"slug":19,"type":13},{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"slug":2579,"name":2579,"fn":2580,"description":2581,"org":2650,"tags":2651,"stars":26,"repoUrl":27,"updatedAt":2592},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2652,2653,2654,2655],{"name":2585,"slug":2586,"type":13},{"name":2588,"slug":2589,"type":13},{"name":21,"slug":22,"type":13},{"name":9,"slug":8,"type":13},{"slug":2594,"name":2594,"fn":2595,"description":2596,"org":2657,"tags":2658,"stars":26,"repoUrl":27,"updatedAt":2607},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2659,2660,2661,2662],{"name":21,"slug":22,"type":13},{"name":9,"slug":8,"type":13},{"name":2602,"slug":2603,"type":13},{"name":2605,"slug":2606,"type":13},{"slug":4,"name":4,"fn":5,"description":6,"org":2664,"tags":2665,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2666,2667,2668,2669,2670],{"name":24,"slug":25,"type":13},{"name":18,"slug":19,"type":13},{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"slug":2672,"name":2672,"fn":2673,"description":2674,"org":2675,"tags":2676,"stars":26,"repoUrl":27,"updatedAt":2685},"pulumi-component","author reusable Pulumi component resources","Guide for authoring Pulumi ComponentResource classes. Use when creating reusable infrastructure components, designing component interfaces, setting up multi-language support, or distributing component packages.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2677,2680,2683,2684],{"name":2678,"slug":2679,"type":13},"Architecture","architecture",{"name":2681,"slug":2682,"type":13},"Engineering","engineering",{"name":21,"slug":22,"type":13},{"name":9,"slug":8,"type":13},"2026-06-04T07:58:57.625622",{"slug":2687,"name":2687,"fn":2688,"description":2689,"org":2690,"tags":2691,"stars":26,"repoUrl":27,"updatedAt":2698},"pulumi-debug-failed-operation","debug failed Pulumi operations","Debug a Pulumi update or preview that failed: read the failure Pulumi already\nrecorded, find what caused it, and fix it. Load this skill when the user asks\nto debug, diagnose, or fix a failed update or preview, or points at a failing\n`pulumi up` or `pulumi preview`. Don't load it for authoring new\ninfrastructure, migrations, or provider upgrades; those have their own skills.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2692,2695,2696,2697],{"name":2693,"slug":2694,"type":13},"Debugging","debugging",{"name":18,"slug":19,"type":13},{"name":21,"slug":22,"type":13},{"name":9,"slug":8,"type":13},"2026-07-08T05:47:02.688144",{"slug":2700,"name":2700,"fn":2701,"description":2702,"org":2703,"tags":2704,"stars":26,"repoUrl":27,"updatedAt":2713},"pulumi-esc","manage secrets and configuration with Pulumi ESC","Guidance for working with Pulumi ESC (Environments, Secrets, and Configuration). Use when users ask about managing secrets, configuration, environments, short-term credentials, configuring OIDC for AWS, Azure, GCP, integrating with secret stores (AWS Secrets Manager, Azure Key Vault, HashiCorp Vault, 1Password), or using ESC with Pulumi stacks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2705,2708,2709,2710],{"name":2706,"slug":2707,"type":13},"Configuration","configuration",{"name":21,"slug":22,"type":13},{"name":9,"slug":8,"type":13},{"name":2711,"slug":2712,"type":13},"Security","security","2026-07-24T05:37:47.044405",{"slug":2715,"name":2715,"fn":2716,"description":2717,"org":2718,"tags":2719,"stars":26,"repoUrl":27,"updatedAt":2723},"pulumi-overview","manage cloud infrastructure with Pulumi","Use this skill for any task that creates, modifies, inspects, or destroys cloud infrastructure or SaaS configuration, from one-off CLI operations to full multi-resource projects, across providers in the Pulumi ecosystem. A typical project spans many providers (AWS or Azure or GCP, Kubernetes, Cloudflare, Auth0, Datadog, Vercel, and others), and Pulumi drives them through one CLI, one state model, and one credential layer. Trigger even when the user does not name Pulumi; phrasings like \"deploy this app,\" \"provision a database,\" \"stand up a VPC,\" \"configure Auth0,\" \"set up Datadog monitoring,\" or \"tear down staging\" qualify. Also trigger for tasks that migrate, port, or convert existing infrastructure code (Terraform, CloudFormation, CDK, Bicep, ARM) to Pulumi. Do not trigger for application runtime code that reads or writes data via cloud SDKs; that is application code, not infrastructure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2720,2721,2722],{"name":18,"slug":19,"type":13},{"name":21,"slug":22,"type":13},{"name":9,"slug":8,"type":13},"2026-06-03T07:52:39.333565",{"slug":2725,"name":2725,"fn":2726,"description":2727,"org":2728,"tags":2729,"stars":26,"repoUrl":27,"updatedAt":2737},"pulumi-terraform-to-pulumi","migrate Terraform to Pulumi","Migrate Terraform\u002FOpenTofu projects to Pulumi, including translating HCL source code and\u002For importing Terraform state into a Pulumi stack. Use when a user wants to convert Terraform to Pulumi, migrate from HCL, or import tfstate into Pulumi. Do NOT trigger for general Terraform-vs-Pulumi comparisons or questions about using both tools side-by-side.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2730,2731,2732,2733,2734],{"name":18,"slug":19,"type":13},{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":2735,"slug":2736,"type":13},"Terraform","terraform","2026-04-06T18:50:37.954346"]