[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-pulumi-cloudformation-to-pulumi":3,"mdc-wszqsv-key":36,"related-org-pulumi-cloudformation-to-pulumi":2894,"related-repo-pulumi-cloudformation-to-pulumi":3053},{"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},"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},"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:36.677615",null,4,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":29},[],"https:\u002F\u002Fgithub.com\u002Fpulumi\u002Fagent-skills\u002Ftree\u002FHEAD\u002Fmigration\u002Fskills\u002Fcloudformation-to-pulumi","---\nname: cloudformation-to-pulumi\ndescription: 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.\n---\n\n## IMPORTANT: PLAN ADJUSTMENT REQUIRED\n\n**If you have already generated a migration plan before loading this skill, you MUST:**\n1. Review your existing plan against the workflows and requirements in this skill\n2. Identify any gaps, missing steps, or incorrect assumptions\n3. Update and revise your plan to align with this skill's guidance\n4. Communicate the adjusted plan to the user before proceeding\n\n## CRITICAL SUCCESS REQUIREMENTS\n\nThe migration output MUST meet all of the following:\n\n1. **Complete Resource Coverage**\n   - Every CloudFormation resource MUST be represented in the Pulumi program OR explicitly justified in the final report.\n\n2. **CloudFormation Logical ID as Resource Name**\n   - **CRITICAL**: Every Pulumi resource MUST use the CloudFormation Logical ID as its resource name.\n   - This enables the `cdk-importer` tool to automatically find import IDs.\n   - DO NOT rename resources. Automated import will FAIL if you change the logical IDs.\n\n3. **Successful Deployment**\n   - The produced Pulumi program must be structurally valid and capable of a successful `pulumi preview` (assuming proper config).\n\n4. **Zero-Diff Import Validation** (if importing existing resources)\n   - After import, `pulumi preview` must show NO updates, replaces, creates, or deletes.\n\n5. **Final Migration Report**\n   - Always output a formal migration report suitable for a Pull Request.\n\n## WHEN INFORMATION IS MISSING\n\nIf the user has not provided a CloudFormation template, you MUST fetch it from AWS using the stack name.\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 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.\n\n**For detailed ESC information:** Use skill `pulumi-esc`.\n\nYou MUST confirm the AWS region with the user.\n\n#### 1.2 Get the CloudFormation Template\n\n**If user provided a template file**: Read the template directly.\n\n**If user only provided a stack name**: Fetch the template from AWS:\n\n```bash\naws cloudformation get-template \\\n  --region \u003Cregion> \\\n  --stack-name \u003Cstack-name> \\\n  --query 'TemplateBody' \\\n  --output json > template.json\n```\n\n#### 1.3 Build Resource Inventory\n\nList all resources in the stack:\n\n```bash\naws cloudformation list-stack-resources \\\n  --region \u003Cregion> \\\n  --stack-name \u003Cstack-name> \\\n  --output json\n```\n\nThis provides:\n- `LogicalResourceId` - **Use this as the Pulumi resource name**\n- `PhysicalResourceId` - The actual AWS resource ID\n- `ResourceType` - The CloudFormation resource type\n\n#### 1.4 Analyze Template Structure\n\nExtract from the template:\n- Parameters and their defaults\n- Mappings\n- Conditions\n- Outputs\n- Resource dependencies (Ref, GetAtt, DependsOn)\n\n### 2. CODE CONVERSION (CloudFormation → Pulumi)\n\n**IMPORTANT:** There is NO automated conversion tool for CloudFormation. You MUST convert each resource manually.\n\n#### 2.1 Resource Name Convention (CRITICAL)\n\n**Every Pulumi resource MUST use the CloudFormation Logical ID as its name.**\n\n```typescript\n\u002F\u002F CloudFormation:\n\u002F\u002F \"MyAppBucketABC123\": { \"Type\": \"AWS::S3::Bucket\", ... }\n\n\u002F\u002F Pulumi - CORRECT:\nconst myAppBucket = new aws.s3.Bucket(\"MyAppBucketABC123\", { ... });\n\n\u002F\u002F Pulumi - WRONG (DO NOT do this - import will fail):\nconst myAppBucket = new aws.s3.Bucket(\"my-app-bucket\", { ... });\n```\n\nThis naming convention is REQUIRED because the `cdk-importer` tool matches resources by name.\n\n#### 2.2 Provider Strategy\n\n**⚠️ CRITICAL: ALWAYS USE aws-native BY DEFAULT ⚠️**\n\n- Use `aws-native` for all resources unless there's a specific reason to use `aws`.\n- CloudFormation types map directly to aws-native (e.g., `AWS::S3::Bucket` → `aws-native.s3.Bucket`).\n- Only use `aws` (classic) when aws-native doesn't support a required feature.\n\n**This is MANDATORY for successful imports with cdk-importer.** The cdk-importer works by matching CloudFormation resources to Pulumi resources, and CloudFormation maps 1:1 to aws-native. Using the classic `aws` provider will cause import failures.\n\n#### 2.3 CloudFormation Intrinsic Functions\n\nMap CloudFormation intrinsic functions to Pulumi equivalents:\n\n| CloudFormation | Pulumi Equivalent |\n|----------------|-------------------|\n| `!Ref` (resource) | Resource output (e.g., `bucket.id`) |\n| `!Ref` (parameter) | Pulumi config |\n| `!GetAtt Resource.Attr` | Resource property output |\n| `!Sub \"...\"` | `pulumi.interpolate` |\n| `!Join [delim, [...]]` | `pulumi.interpolate` or `.apply()` |\n| `!If [cond, true, false]` | Ternary operator |\n| `!Equals [a, b]` | `===` comparison |\n| `!Select [idx, list]` | Array indexing with `.apply()` |\n| `!Split [delim, str]` | `.apply(v => v.split(...))` |\n| `Fn::ImportValue` | Stack references or config |\n\n##### Example: !Sub\n\n```typescript\n\u002F\u002F CloudFormation: !Sub \"arn:aws:s3:::${MyBucket}\u002F*\"\n\u002F\u002F Pulumi:\nconst bucketArn = pulumi.interpolate`arn:aws:s3:::${myBucket.bucket}\u002F*`;\n```\n\n##### Example: !GetAtt\n\n```typescript\n\u002F\u002F CloudFormation: !GetAtt MyFunction.Arn\n\u002F\u002F Pulumi:\nconst functionArn = myFunction.arn;\n```\n\n#### 2.4 CloudFormation Conditions\n\nConvert CloudFormation conditions to TypeScript logic:\n\n```typescript\n\u002F\u002F CloudFormation:\n\u002F\u002F \"Conditions\": {\n\u002F\u002F   \"CreateProdResources\": { \"Fn::Equals\": [{ \"Ref\": \"Environment\" }, \"prod\"] }\n\u002F\u002F }\n\n\u002F\u002F Pulumi:\nconst config = new pulumi.Config();\nconst environment = config.require(\"environment\");\nconst createProdResources = environment === \"prod\";\n\nif (createProdResources) {\n  \u002F\u002F Create production-only resources\n}\n```\n\n#### 2.5 CloudFormation Parameters\n\nConvert parameters to Pulumi config:\n\n```typescript\n\u002F\u002F CloudFormation:\n\u002F\u002F \"Parameters\": {\n\u002F\u002F   \"InstanceType\": { \"Type\": \"String\", \"Default\": \"t3.micro\" }\n\u002F\u002F }\n\n\u002F\u002F Pulumi:\nconst config = new pulumi.Config();\nconst instanceType = config.get(\"instanceType\") || \"t3.micro\";\n```\n\n#### 2.6 CloudFormation Mappings\n\nConvert mappings to TypeScript objects:\n\n```typescript\n\u002F\u002F CloudFormation:\n\u002F\u002F \"Mappings\": {\n\u002F\u002F   \"RegionMap\": {\n\u002F\u002F     \"us-east-1\": { \"AMI\": \"ami-12345\" },\n\u002F\u002F     \"us-west-2\": { \"AMI\": \"ami-67890\" }\n\u002F\u002F   }\n\u002F\u002F }\n\n\u002F\u002F Pulumi:\nconst regionMap: Record\u003Cstring, { ami: string }> = {\n  \"us-east-1\": { ami: \"ami-12345\" },\n  \"us-west-2\": { ami: \"ami-67890\" },\n};\nconst ami = regionMap[aws.config.region!].ami;\n```\n\n#### 2.7 Custom Resources\n\nCloudFormation Custom Resources (`AWS::CloudFormation::CustomResource` or `Custom::*`) require special handling:\n\n1. **Identify the purpose**: Read the Lambda function code to understand what it does\n2. **Find native replacement**: Check if Pulumi has a native resource that provides the same functionality\n3. **If no replacement**: Document in the migration report that manual implementation is needed\n\n#### 2.8 TypeScript Output Handling\n\naws-native outputs often include undefined. Avoid `!` non-null assertions. Always safely unwrap with `.apply()`:\n\n```typescript\n\u002F\u002F WRONG\nfunctionName: lambdaFunction.functionName!,\n\n\u002F\u002F CORRECT\nfunctionName: lambdaFunction.functionName.apply(name => name || \"\"),\n```\n\n### 3. RESOURCE IMPORT\n\nAfter conversion, import existing resources to be managed by Pulumi.\n\n#### 3.0 Pre-Import Validation (REQUIRED)\n\n**Before proceeding with import, verify your code:**\n\n1. **Check Provider Usage**: Scan your code to ensure all resources use `aws-native`\n2. **Document Exceptions**: Any use of `aws` (classic) provider must be justified\n3. **Verify Resource Names**: Confirm all resources use CloudFormation Logical IDs as names\n\n#### 3.1 Automated Import with cdk-importer\n\nBecause you used CloudFormation Logical IDs as resource names, you can use the `cdk-importer` tool to automatically import resources.\n\nFollow [cfn-importer.md](cfn-importer.md) for detailed import procedures.\n\n#### 3.2 Manual Import for Failed Resources\n\nFor resources that fail automatic import:\n\n1. Follow [cloudformation-id-lookup.md](cloudformation-id-lookup.md) to find the import ID format\n2. Use `pulumi import`:\n\n```bash\npulumi import \u003Cpulumi-resource-type> \u003Clogical-id> \u003Cimport-id>\n```\n\n#### 3.3 Running Preview After Import\n\nAfter import, run `pulumi preview`. There must be:\n- NO updates\n- NO replaces\n- NO creates\n- NO deletes\n\nIf there are changes, investigate and update the program until preview is clean.\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; organized by file)\n4. **Resource Mapping Table**:\n\n| CloudFormation Logical ID | CFN Type | Pulumi Type | Provider |\n|---------------------------|----------|-------------|----------|\n| `MyAppBucketABC123` | `AWS::S3::Bucket` | `aws-native.s3.Bucket` | aws-native |\n| `MyLambdaFunction456` | `AWS::Lambda::Function` | `aws-native.lambda.Function` | aws-native |\n\n5. **Custom Resources Summary** (if any)\n6. **Final Migration Report** (PR-ready)\n7. **Next Steps** (import instructions)\n\n## FOR DETAILED DOCUMENTATION\n\nFetch content from official Pulumi documentation:\n- https:\u002F\u002Fwww.pulumi.com\u002Fdocs\u002Fiac\u002Fadopting-pulumi\u002Fmigrating-to-pulumi\u002Ffrom-aws\u002F\n",{"data":37,"body":38},{"name":4,"description":6},{"type":39,"children":40},"root",[41,50,60,85,91,96,221,227,232,238,250,257,264,269,289,307,312,318,328,338,493,499,504,597,602,643,649,654,682,688,698,704,712,950,962,968,976,1031,1048,1054,1059,1297,1304,1404,1410,1466,1472,1477,1715,1721,1726,1889,1895,1900,2216,2222,2242,2275,2281,2299,2429,2435,2440,2446,2454,2499,2505,2517,2530,2536,2541,2566,2638,2644,2656,2679,2684,2690,2695,2735,2832,2864,2870,2875,2888],{"type":42,"tag":43,"props":44,"children":46},"element","h2",{"id":45},"important-plan-adjustment-required",[47],{"type":48,"value":49},"text","IMPORTANT: PLAN ADJUSTMENT REQUIRED",{"type":42,"tag":51,"props":52,"children":53},"p",{},[54],{"type":42,"tag":55,"props":56,"children":57},"strong",{},[58],{"type":48,"value":59},"If you have already generated a migration plan before loading this skill, you MUST:",{"type":42,"tag":61,"props":62,"children":63},"ol",{},[64,70,75,80],{"type":42,"tag":65,"props":66,"children":67},"li",{},[68],{"type":48,"value":69},"Review your existing plan against the workflows and requirements in this skill",{"type":42,"tag":65,"props":71,"children":72},{},[73],{"type":48,"value":74},"Identify any gaps, missing steps, or incorrect assumptions",{"type":42,"tag":65,"props":76,"children":77},{},[78],{"type":48,"value":79},"Update and revise your plan to align with this skill's guidance",{"type":42,"tag":65,"props":81,"children":82},{},[83],{"type":48,"value":84},"Communicate the adjusted plan to the user before proceeding",{"type":42,"tag":43,"props":86,"children":88},{"id":87},"critical-success-requirements",[89],{"type":48,"value":90},"CRITICAL SUCCESS REQUIREMENTS",{"type":42,"tag":51,"props":92,"children":93},{},[94],{"type":48,"value":95},"The migration output MUST meet all of the following:",{"type":42,"tag":61,"props":97,"children":98},{},[99,116,156,180,205],{"type":42,"tag":65,"props":100,"children":101},{},[102,107],{"type":42,"tag":55,"props":103,"children":104},{},[105],{"type":48,"value":106},"Complete Resource Coverage",{"type":42,"tag":108,"props":109,"children":110},"ul",{},[111],{"type":42,"tag":65,"props":112,"children":113},{},[114],{"type":48,"value":115},"Every CloudFormation resource MUST be represented in the Pulumi program OR explicitly justified in the final report.",{"type":42,"tag":65,"props":117,"children":118},{},[119,124],{"type":42,"tag":55,"props":120,"children":121},{},[122],{"type":48,"value":123},"CloudFormation Logical ID as Resource Name",{"type":42,"tag":108,"props":125,"children":126},{},[127,137,151],{"type":42,"tag":65,"props":128,"children":129},{},[130,135],{"type":42,"tag":55,"props":131,"children":132},{},[133],{"type":48,"value":134},"CRITICAL",{"type":48,"value":136},": Every Pulumi resource MUST use the CloudFormation Logical ID as its resource name.",{"type":42,"tag":65,"props":138,"children":139},{},[140,142,149],{"type":48,"value":141},"This enables the ",{"type":42,"tag":143,"props":144,"children":146},"code",{"className":145},[],[147],{"type":48,"value":148},"cdk-importer",{"type":48,"value":150}," tool to automatically find import IDs.",{"type":42,"tag":65,"props":152,"children":153},{},[154],{"type":48,"value":155},"DO NOT rename resources. Automated import will FAIL if you change the logical IDs.",{"type":42,"tag":65,"props":157,"children":158},{},[159,164],{"type":42,"tag":55,"props":160,"children":161},{},[162],{"type":48,"value":163},"Successful Deployment",{"type":42,"tag":108,"props":165,"children":166},{},[167],{"type":42,"tag":65,"props":168,"children":169},{},[170,172,178],{"type":48,"value":171},"The produced Pulumi program must be structurally valid and capable of a successful ",{"type":42,"tag":143,"props":173,"children":175},{"className":174},[],[176],{"type":48,"value":177},"pulumi preview",{"type":48,"value":179}," (assuming proper config).",{"type":42,"tag":65,"props":181,"children":182},{},[183,188,190],{"type":42,"tag":55,"props":184,"children":185},{},[186],{"type":48,"value":187},"Zero-Diff Import Validation",{"type":48,"value":189}," (if importing existing resources)",{"type":42,"tag":108,"props":191,"children":192},{},[193],{"type":42,"tag":65,"props":194,"children":195},{},[196,198,203],{"type":48,"value":197},"After import, ",{"type":42,"tag":143,"props":199,"children":201},{"className":200},[],[202],{"type":48,"value":177},{"type":48,"value":204}," must show NO updates, replaces, creates, or deletes.",{"type":42,"tag":65,"props":206,"children":207},{},[208,213],{"type":42,"tag":55,"props":209,"children":210},{},[211],{"type":48,"value":212},"Final Migration Report",{"type":42,"tag":108,"props":214,"children":215},{},[216],{"type":42,"tag":65,"props":217,"children":218},{},[219],{"type":48,"value":220},"Always output a formal migration report suitable for a Pull Request.",{"type":42,"tag":43,"props":222,"children":224},{"id":223},"when-information-is-missing",[225],{"type":48,"value":226},"WHEN INFORMATION IS MISSING",{"type":42,"tag":51,"props":228,"children":229},{},[230],{"type":48,"value":231},"If the user has not provided a CloudFormation template, you MUST fetch it from AWS using the stack name.",{"type":42,"tag":43,"props":233,"children":235},{"id":234},"migration-workflow",[236],{"type":48,"value":237},"MIGRATION WORKFLOW",{"type":42,"tag":51,"props":239,"children":240},{},[241,243,248],{"type":48,"value":242},"Follow this workflow ",{"type":42,"tag":55,"props":244,"children":245},{},[246],{"type":48,"value":247},"exactly",{"type":48,"value":249}," and in this order:",{"type":42,"tag":251,"props":252,"children":254},"h3",{"id":253},"_1-information-gathering",[255],{"type":48,"value":256},"1. INFORMATION GATHERING",{"type":42,"tag":258,"props":259,"children":261},"h4",{"id":260},"_11-verify-aws-credentials-esc",[262],{"type":48,"value":263},"1.1 Verify AWS Credentials (ESC)",{"type":42,"tag":51,"props":265,"children":266},{},[267],{"type":48,"value":268},"Running AWS commands requires credentials loaded via Pulumi ESC.",{"type":42,"tag":108,"props":270,"children":271},{},[272,277],{"type":42,"tag":65,"props":273,"children":274},{},[275],{"type":48,"value":276},"If the user has already provided an ESC environment, use it.",{"type":42,"tag":65,"props":278,"children":279},{},[280,282,287],{"type":48,"value":281},"If no ESC environment is specified, ",{"type":42,"tag":55,"props":283,"children":284},{},[285],{"type":48,"value":286},"ask the user which ESC environment to use",{"type":48,"value":288}," before proceeding.",{"type":42,"tag":51,"props":290,"children":291},{},[292,297,299,305],{"type":42,"tag":55,"props":293,"children":294},{},[295],{"type":48,"value":296},"For detailed ESC information:",{"type":48,"value":298}," Use skill ",{"type":42,"tag":143,"props":300,"children":302},{"className":301},[],[303],{"type":48,"value":304},"pulumi-esc",{"type":48,"value":306},".",{"type":42,"tag":51,"props":308,"children":309},{},[310],{"type":48,"value":311},"You MUST confirm the AWS region with the user.",{"type":42,"tag":258,"props":313,"children":315},{"id":314},"_12-get-the-cloudformation-template",[316],{"type":48,"value":317},"1.2 Get the CloudFormation Template",{"type":42,"tag":51,"props":319,"children":320},{},[321,326],{"type":42,"tag":55,"props":322,"children":323},{},[324],{"type":48,"value":325},"If user provided a template file",{"type":48,"value":327},": Read the template directly.",{"type":42,"tag":51,"props":329,"children":330},{},[331,336],{"type":42,"tag":55,"props":332,"children":333},{},[334],{"type":48,"value":335},"If user only provided a stack name",{"type":48,"value":337},": Fetch the template from AWS:",{"type":42,"tag":339,"props":340,"children":345},"pre",{"className":341,"code":342,"language":343,"meta":344,"style":344},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","aws cloudformation get-template \\\n  --region \u003Cregion> \\\n  --stack-name \u003Cstack-name> \\\n  --query 'TemplateBody' \\\n  --output json > template.json\n","bash","",[346],{"type":42,"tag":143,"props":347,"children":348},{"__ignoreMap":344},[349,377,411,442,469],{"type":42,"tag":350,"props":351,"children":354},"span",{"class":352,"line":353},"line",1,[355,360,366,371],{"type":42,"tag":350,"props":356,"children":358},{"style":357},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[359],{"type":48,"value":25},{"type":42,"tag":350,"props":361,"children":363},{"style":362},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[364],{"type":48,"value":365}," cloudformation",{"type":42,"tag":350,"props":367,"children":368},{"style":362},[369],{"type":48,"value":370}," get-template",{"type":42,"tag":350,"props":372,"children":374},{"style":373},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[375],{"type":48,"value":376}," \\\n",{"type":42,"tag":350,"props":378,"children":380},{"class":352,"line":379},2,[381,386,392,397,402,407],{"type":42,"tag":350,"props":382,"children":383},{"style":362},[384],{"type":48,"value":385},"  --region",{"type":42,"tag":350,"props":387,"children":389},{"style":388},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[390],{"type":48,"value":391}," \u003C",{"type":42,"tag":350,"props":393,"children":394},{"style":362},[395],{"type":48,"value":396},"regio",{"type":42,"tag":350,"props":398,"children":399},{"style":373},[400],{"type":48,"value":401},"n",{"type":42,"tag":350,"props":403,"children":404},{"style":388},[405],{"type":48,"value":406},">",{"type":42,"tag":350,"props":408,"children":409},{"style":373},[410],{"type":48,"value":376},{"type":42,"tag":350,"props":412,"children":414},{"class":352,"line":413},3,[415,420,424,429,434,438],{"type":42,"tag":350,"props":416,"children":417},{"style":362},[418],{"type":48,"value":419},"  --stack-name",{"type":42,"tag":350,"props":421,"children":422},{"style":388},[423],{"type":48,"value":391},{"type":42,"tag":350,"props":425,"children":426},{"style":362},[427],{"type":48,"value":428},"stack-nam",{"type":42,"tag":350,"props":430,"children":431},{"style":373},[432],{"type":48,"value":433},"e",{"type":42,"tag":350,"props":435,"children":436},{"style":388},[437],{"type":48,"value":406},{"type":42,"tag":350,"props":439,"children":440},{"style":373},[441],{"type":48,"value":376},{"type":42,"tag":350,"props":443,"children":444},{"class":352,"line":30},[445,450,455,460,465],{"type":42,"tag":350,"props":446,"children":447},{"style":362},[448],{"type":48,"value":449},"  --query",{"type":42,"tag":350,"props":451,"children":452},{"style":388},[453],{"type":48,"value":454}," '",{"type":42,"tag":350,"props":456,"children":457},{"style":362},[458],{"type":48,"value":459},"TemplateBody",{"type":42,"tag":350,"props":461,"children":462},{"style":388},[463],{"type":48,"value":464},"'",{"type":42,"tag":350,"props":466,"children":467},{"style":373},[468],{"type":48,"value":376},{"type":42,"tag":350,"props":470,"children":472},{"class":352,"line":471},5,[473,478,483,488],{"type":42,"tag":350,"props":474,"children":475},{"style":362},[476],{"type":48,"value":477},"  --output",{"type":42,"tag":350,"props":479,"children":480},{"style":362},[481],{"type":48,"value":482}," json",{"type":42,"tag":350,"props":484,"children":485},{"style":388},[486],{"type":48,"value":487}," >",{"type":42,"tag":350,"props":489,"children":490},{"style":362},[491],{"type":48,"value":492}," template.json\n",{"type":42,"tag":258,"props":494,"children":496},{"id":495},"_13-build-resource-inventory",[497],{"type":48,"value":498},"1.3 Build Resource Inventory",{"type":42,"tag":51,"props":500,"children":501},{},[502],{"type":48,"value":503},"List all resources in the stack:",{"type":42,"tag":339,"props":505,"children":507},{"className":341,"code":506,"language":343,"meta":344,"style":344},"aws cloudformation list-stack-resources \\\n  --region \u003Cregion> \\\n  --stack-name \u003Cstack-name> \\\n  --output json\n",[508],{"type":42,"tag":143,"props":509,"children":510},{"__ignoreMap":344},[511,531,558,585],{"type":42,"tag":350,"props":512,"children":513},{"class":352,"line":353},[514,518,522,527],{"type":42,"tag":350,"props":515,"children":516},{"style":357},[517],{"type":48,"value":25},{"type":42,"tag":350,"props":519,"children":520},{"style":362},[521],{"type":48,"value":365},{"type":42,"tag":350,"props":523,"children":524},{"style":362},[525],{"type":48,"value":526}," list-stack-resources",{"type":42,"tag":350,"props":528,"children":529},{"style":373},[530],{"type":48,"value":376},{"type":42,"tag":350,"props":532,"children":533},{"class":352,"line":379},[534,538,542,546,550,554],{"type":42,"tag":350,"props":535,"children":536},{"style":362},[537],{"type":48,"value":385},{"type":42,"tag":350,"props":539,"children":540},{"style":388},[541],{"type":48,"value":391},{"type":42,"tag":350,"props":543,"children":544},{"style":362},[545],{"type":48,"value":396},{"type":42,"tag":350,"props":547,"children":548},{"style":373},[549],{"type":48,"value":401},{"type":42,"tag":350,"props":551,"children":552},{"style":388},[553],{"type":48,"value":406},{"type":42,"tag":350,"props":555,"children":556},{"style":373},[557],{"type":48,"value":376},{"type":42,"tag":350,"props":559,"children":560},{"class":352,"line":413},[561,565,569,573,577,581],{"type":42,"tag":350,"props":562,"children":563},{"style":362},[564],{"type":48,"value":419},{"type":42,"tag":350,"props":566,"children":567},{"style":388},[568],{"type":48,"value":391},{"type":42,"tag":350,"props":570,"children":571},{"style":362},[572],{"type":48,"value":428},{"type":42,"tag":350,"props":574,"children":575},{"style":373},[576],{"type":48,"value":433},{"type":42,"tag":350,"props":578,"children":579},{"style":388},[580],{"type":48,"value":406},{"type":42,"tag":350,"props":582,"children":583},{"style":373},[584],{"type":48,"value":376},{"type":42,"tag":350,"props":586,"children":587},{"class":352,"line":30},[588,592],{"type":42,"tag":350,"props":589,"children":590},{"style":362},[591],{"type":48,"value":477},{"type":42,"tag":350,"props":593,"children":594},{"style":362},[595],{"type":48,"value":596}," json\n",{"type":42,"tag":51,"props":598,"children":599},{},[600],{"type":48,"value":601},"This provides:",{"type":42,"tag":108,"props":603,"children":604},{},[605,621,632],{"type":42,"tag":65,"props":606,"children":607},{},[608,614,616],{"type":42,"tag":143,"props":609,"children":611},{"className":610},[],[612],{"type":48,"value":613},"LogicalResourceId",{"type":48,"value":615}," - ",{"type":42,"tag":55,"props":617,"children":618},{},[619],{"type":48,"value":620},"Use this as the Pulumi resource name",{"type":42,"tag":65,"props":622,"children":623},{},[624,630],{"type":42,"tag":143,"props":625,"children":627},{"className":626},[],[628],{"type":48,"value":629},"PhysicalResourceId",{"type":48,"value":631}," - The actual AWS resource ID",{"type":42,"tag":65,"props":633,"children":634},{},[635,641],{"type":42,"tag":143,"props":636,"children":638},{"className":637},[],[639],{"type":48,"value":640},"ResourceType",{"type":48,"value":642}," - The CloudFormation resource type",{"type":42,"tag":258,"props":644,"children":646},{"id":645},"_14-analyze-template-structure",[647],{"type":48,"value":648},"1.4 Analyze Template Structure",{"type":42,"tag":51,"props":650,"children":651},{},[652],{"type":48,"value":653},"Extract from the template:",{"type":42,"tag":108,"props":655,"children":656},{},[657,662,667,672,677],{"type":42,"tag":65,"props":658,"children":659},{},[660],{"type":48,"value":661},"Parameters and their defaults",{"type":42,"tag":65,"props":663,"children":664},{},[665],{"type":48,"value":666},"Mappings",{"type":42,"tag":65,"props":668,"children":669},{},[670],{"type":48,"value":671},"Conditions",{"type":42,"tag":65,"props":673,"children":674},{},[675],{"type":48,"value":676},"Outputs",{"type":42,"tag":65,"props":678,"children":679},{},[680],{"type":48,"value":681},"Resource dependencies (Ref, GetAtt, DependsOn)",{"type":42,"tag":251,"props":683,"children":685},{"id":684},"_2-code-conversion-cloudformation-pulumi",[686],{"type":48,"value":687},"2. CODE CONVERSION (CloudFormation → Pulumi)",{"type":42,"tag":51,"props":689,"children":690},{},[691,696],{"type":42,"tag":55,"props":692,"children":693},{},[694],{"type":48,"value":695},"IMPORTANT:",{"type":48,"value":697}," There is NO automated conversion tool for CloudFormation. You MUST convert each resource manually.",{"type":42,"tag":258,"props":699,"children":701},{"id":700},"_21-resource-name-convention-critical",[702],{"type":48,"value":703},"2.1 Resource Name Convention (CRITICAL)",{"type":42,"tag":51,"props":705,"children":706},{},[707],{"type":42,"tag":55,"props":708,"children":709},{},[710],{"type":48,"value":711},"Every Pulumi resource MUST use the CloudFormation Logical ID as its name.",{"type":42,"tag":339,"props":713,"children":717},{"className":714,"code":715,"language":716,"meta":344,"style":344},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F CloudFormation:\n\u002F\u002F \"MyAppBucketABC123\": { \"Type\": \"AWS::S3::Bucket\", ... }\n\n\u002F\u002F Pulumi - CORRECT:\nconst myAppBucket = new aws.s3.Bucket(\"MyAppBucketABC123\", { ... });\n\n\u002F\u002F Pulumi - WRONG (DO NOT do this - import will fail):\nconst myAppBucket = new aws.s3.Bucket(\"my-app-bucket\", { ... });\n","typescript",[718],{"type":42,"tag":143,"props":719,"children":720},{"__ignoreMap":344},[721,730,738,747,755,852,860,869],{"type":42,"tag":350,"props":722,"children":723},{"class":352,"line":353},[724],{"type":42,"tag":350,"props":725,"children":727},{"style":726},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[728],{"type":48,"value":729},"\u002F\u002F CloudFormation:\n",{"type":42,"tag":350,"props":731,"children":732},{"class":352,"line":379},[733],{"type":42,"tag":350,"props":734,"children":735},{"style":726},[736],{"type":48,"value":737},"\u002F\u002F \"MyAppBucketABC123\": { \"Type\": \"AWS::S3::Bucket\", ... }\n",{"type":42,"tag":350,"props":739,"children":740},{"class":352,"line":413},[741],{"type":42,"tag":350,"props":742,"children":744},{"emptyLinePlaceholder":743},true,[745],{"type":48,"value":746},"\n",{"type":42,"tag":350,"props":748,"children":749},{"class":352,"line":30},[750],{"type":42,"tag":350,"props":751,"children":752},{"style":726},[753],{"type":48,"value":754},"\u002F\u002F Pulumi - CORRECT:\n",{"type":42,"tag":350,"props":756,"children":757},{"class":352,"line":471},[758,764,769,774,779,784,788,793,797,803,808,813,818,822,827,832,837,842,847],{"type":42,"tag":350,"props":759,"children":761},{"style":760},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[762],{"type":48,"value":763},"const",{"type":42,"tag":350,"props":765,"children":766},{"style":373},[767],{"type":48,"value":768}," myAppBucket ",{"type":42,"tag":350,"props":770,"children":771},{"style":388},[772],{"type":48,"value":773},"=",{"type":42,"tag":350,"props":775,"children":776},{"style":388},[777],{"type":48,"value":778}," new",{"type":42,"tag":350,"props":780,"children":781},{"style":373},[782],{"type":48,"value":783}," aws",{"type":42,"tag":350,"props":785,"children":786},{"style":388},[787],{"type":48,"value":306},{"type":42,"tag":350,"props":789,"children":790},{"style":373},[791],{"type":48,"value":792},"s3",{"type":42,"tag":350,"props":794,"children":795},{"style":388},[796],{"type":48,"value":306},{"type":42,"tag":350,"props":798,"children":800},{"style":799},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[801],{"type":48,"value":802},"Bucket",{"type":42,"tag":350,"props":804,"children":805},{"style":373},[806],{"type":48,"value":807},"(",{"type":42,"tag":350,"props":809,"children":810},{"style":388},[811],{"type":48,"value":812},"\"",{"type":42,"tag":350,"props":814,"children":815},{"style":362},[816],{"type":48,"value":817},"MyAppBucketABC123",{"type":42,"tag":350,"props":819,"children":820},{"style":388},[821],{"type":48,"value":812},{"type":42,"tag":350,"props":823,"children":824},{"style":388},[825],{"type":48,"value":826},",",{"type":42,"tag":350,"props":828,"children":829},{"style":388},[830],{"type":48,"value":831}," {",{"type":42,"tag":350,"props":833,"children":834},{"style":388},[835],{"type":48,"value":836}," ...",{"type":42,"tag":350,"props":838,"children":839},{"style":388},[840],{"type":48,"value":841}," }",{"type":42,"tag":350,"props":843,"children":844},{"style":373},[845],{"type":48,"value":846},")",{"type":42,"tag":350,"props":848,"children":849},{"style":388},[850],{"type":48,"value":851},";\n",{"type":42,"tag":350,"props":853,"children":855},{"class":352,"line":854},6,[856],{"type":42,"tag":350,"props":857,"children":858},{"emptyLinePlaceholder":743},[859],{"type":48,"value":746},{"type":42,"tag":350,"props":861,"children":863},{"class":352,"line":862},7,[864],{"type":42,"tag":350,"props":865,"children":866},{"style":726},[867],{"type":48,"value":868},"\u002F\u002F Pulumi - WRONG (DO NOT do this - import will fail):\n",{"type":42,"tag":350,"props":870,"children":872},{"class":352,"line":871},8,[873,877,881,885,889,893,897,901,905,909,913,917,922,926,930,934,938,942,946],{"type":42,"tag":350,"props":874,"children":875},{"style":760},[876],{"type":48,"value":763},{"type":42,"tag":350,"props":878,"children":879},{"style":373},[880],{"type":48,"value":768},{"type":42,"tag":350,"props":882,"children":883},{"style":388},[884],{"type":48,"value":773},{"type":42,"tag":350,"props":886,"children":887},{"style":388},[888],{"type":48,"value":778},{"type":42,"tag":350,"props":890,"children":891},{"style":373},[892],{"type":48,"value":783},{"type":42,"tag":350,"props":894,"children":895},{"style":388},[896],{"type":48,"value":306},{"type":42,"tag":350,"props":898,"children":899},{"style":373},[900],{"type":48,"value":792},{"type":42,"tag":350,"props":902,"children":903},{"style":388},[904],{"type":48,"value":306},{"type":42,"tag":350,"props":906,"children":907},{"style":799},[908],{"type":48,"value":802},{"type":42,"tag":350,"props":910,"children":911},{"style":373},[912],{"type":48,"value":807},{"type":42,"tag":350,"props":914,"children":915},{"style":388},[916],{"type":48,"value":812},{"type":42,"tag":350,"props":918,"children":919},{"style":362},[920],{"type":48,"value":921},"my-app-bucket",{"type":42,"tag":350,"props":923,"children":924},{"style":388},[925],{"type":48,"value":812},{"type":42,"tag":350,"props":927,"children":928},{"style":388},[929],{"type":48,"value":826},{"type":42,"tag":350,"props":931,"children":932},{"style":388},[933],{"type":48,"value":831},{"type":42,"tag":350,"props":935,"children":936},{"style":388},[937],{"type":48,"value":836},{"type":42,"tag":350,"props":939,"children":940},{"style":388},[941],{"type":48,"value":841},{"type":42,"tag":350,"props":943,"children":944},{"style":373},[945],{"type":48,"value":846},{"type":42,"tag":350,"props":947,"children":948},{"style":388},[949],{"type":48,"value":851},{"type":42,"tag":51,"props":951,"children":952},{},[953,955,960],{"type":48,"value":954},"This naming convention is REQUIRED because the ",{"type":42,"tag":143,"props":956,"children":958},{"className":957},[],[959],{"type":48,"value":148},{"type":48,"value":961}," tool matches resources by name.",{"type":42,"tag":258,"props":963,"children":965},{"id":964},"_22-provider-strategy",[966],{"type":48,"value":967},"2.2 Provider Strategy",{"type":42,"tag":51,"props":969,"children":970},{},[971],{"type":42,"tag":55,"props":972,"children":973},{},[974],{"type":48,"value":975},"⚠️ CRITICAL: ALWAYS USE aws-native BY DEFAULT ⚠️",{"type":42,"tag":108,"props":977,"children":978},{},[979,998,1019],{"type":42,"tag":65,"props":980,"children":981},{},[982,984,990,992,997],{"type":48,"value":983},"Use ",{"type":42,"tag":143,"props":985,"children":987},{"className":986},[],[988],{"type":48,"value":989},"aws-native",{"type":48,"value":991}," for all resources unless there's a specific reason to use ",{"type":42,"tag":143,"props":993,"children":995},{"className":994},[],[996],{"type":48,"value":25},{"type":48,"value":306},{"type":42,"tag":65,"props":999,"children":1000},{},[1001,1003,1009,1011,1017],{"type":48,"value":1002},"CloudFormation types map directly to aws-native (e.g., ",{"type":42,"tag":143,"props":1004,"children":1006},{"className":1005},[],[1007],{"type":48,"value":1008},"AWS::S3::Bucket",{"type":48,"value":1010}," → ",{"type":42,"tag":143,"props":1012,"children":1014},{"className":1013},[],[1015],{"type":48,"value":1016},"aws-native.s3.Bucket",{"type":48,"value":1018},").",{"type":42,"tag":65,"props":1020,"children":1021},{},[1022,1024,1029],{"type":48,"value":1023},"Only use ",{"type":42,"tag":143,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":48,"value":25},{"type":48,"value":1030}," (classic) when aws-native doesn't support a required feature.",{"type":42,"tag":51,"props":1032,"children":1033},{},[1034,1039,1041,1046],{"type":42,"tag":55,"props":1035,"children":1036},{},[1037],{"type":48,"value":1038},"This is MANDATORY for successful imports with cdk-importer.",{"type":48,"value":1040}," The cdk-importer works by matching CloudFormation resources to Pulumi resources, and CloudFormation maps 1:1 to aws-native. Using the classic ",{"type":42,"tag":143,"props":1042,"children":1044},{"className":1043},[],[1045],{"type":48,"value":25},{"type":48,"value":1047}," provider will cause import failures.",{"type":42,"tag":258,"props":1049,"children":1051},{"id":1050},"_23-cloudformation-intrinsic-functions",[1052],{"type":48,"value":1053},"2.3 CloudFormation Intrinsic Functions",{"type":42,"tag":51,"props":1055,"children":1056},{},[1057],{"type":48,"value":1058},"Map CloudFormation intrinsic functions to Pulumi equivalents:",{"type":42,"tag":1060,"props":1061,"children":1062},"table",{},[1063,1082],{"type":42,"tag":1064,"props":1065,"children":1066},"thead",{},[1067],{"type":42,"tag":1068,"props":1069,"children":1070},"tr",{},[1071,1077],{"type":42,"tag":1072,"props":1073,"children":1074},"th",{},[1075],{"type":48,"value":1076},"CloudFormation",{"type":42,"tag":1072,"props":1078,"children":1079},{},[1080],{"type":48,"value":1081},"Pulumi Equivalent",{"type":42,"tag":1083,"props":1084,"children":1085},"tbody",{},[1086,1113,1131,1148,1169,1197,1214,1237,1259,1280],{"type":42,"tag":1068,"props":1087,"children":1088},{},[1089,1101],{"type":42,"tag":1090,"props":1091,"children":1092},"td",{},[1093,1099],{"type":42,"tag":143,"props":1094,"children":1096},{"className":1095},[],[1097],{"type":48,"value":1098},"!Ref",{"type":48,"value":1100}," (resource)",{"type":42,"tag":1090,"props":1102,"children":1103},{},[1104,1106,1112],{"type":48,"value":1105},"Resource output (e.g., ",{"type":42,"tag":143,"props":1107,"children":1109},{"className":1108},[],[1110],{"type":48,"value":1111},"bucket.id",{"type":48,"value":846},{"type":42,"tag":1068,"props":1114,"children":1115},{},[1116,1126],{"type":42,"tag":1090,"props":1117,"children":1118},{},[1119,1124],{"type":42,"tag":143,"props":1120,"children":1122},{"className":1121},[],[1123],{"type":48,"value":1098},{"type":48,"value":1125}," (parameter)",{"type":42,"tag":1090,"props":1127,"children":1128},{},[1129],{"type":48,"value":1130},"Pulumi config",{"type":42,"tag":1068,"props":1132,"children":1133},{},[1134,1143],{"type":42,"tag":1090,"props":1135,"children":1136},{},[1137],{"type":42,"tag":143,"props":1138,"children":1140},{"className":1139},[],[1141],{"type":48,"value":1142},"!GetAtt Resource.Attr",{"type":42,"tag":1090,"props":1144,"children":1145},{},[1146],{"type":48,"value":1147},"Resource property output",{"type":42,"tag":1068,"props":1149,"children":1150},{},[1151,1160],{"type":42,"tag":1090,"props":1152,"children":1153},{},[1154],{"type":42,"tag":143,"props":1155,"children":1157},{"className":1156},[],[1158],{"type":48,"value":1159},"!Sub \"...\"",{"type":42,"tag":1090,"props":1161,"children":1162},{},[1163],{"type":42,"tag":143,"props":1164,"children":1166},{"className":1165},[],[1167],{"type":48,"value":1168},"pulumi.interpolate",{"type":42,"tag":1068,"props":1170,"children":1171},{},[1172,1181],{"type":42,"tag":1090,"props":1173,"children":1174},{},[1175],{"type":42,"tag":143,"props":1176,"children":1178},{"className":1177},[],[1179],{"type":48,"value":1180},"!Join [delim, [...]]",{"type":42,"tag":1090,"props":1182,"children":1183},{},[1184,1189,1191],{"type":42,"tag":143,"props":1185,"children":1187},{"className":1186},[],[1188],{"type":48,"value":1168},{"type":48,"value":1190}," or ",{"type":42,"tag":143,"props":1192,"children":1194},{"className":1193},[],[1195],{"type":48,"value":1196},".apply()",{"type":42,"tag":1068,"props":1198,"children":1199},{},[1200,1209],{"type":42,"tag":1090,"props":1201,"children":1202},{},[1203],{"type":42,"tag":143,"props":1204,"children":1206},{"className":1205},[],[1207],{"type":48,"value":1208},"!If [cond, true, false]",{"type":42,"tag":1090,"props":1210,"children":1211},{},[1212],{"type":48,"value":1213},"Ternary operator",{"type":42,"tag":1068,"props":1215,"children":1216},{},[1217,1226],{"type":42,"tag":1090,"props":1218,"children":1219},{},[1220],{"type":42,"tag":143,"props":1221,"children":1223},{"className":1222},[],[1224],{"type":48,"value":1225},"!Equals [a, b]",{"type":42,"tag":1090,"props":1227,"children":1228},{},[1229,1235],{"type":42,"tag":143,"props":1230,"children":1232},{"className":1231},[],[1233],{"type":48,"value":1234},"===",{"type":48,"value":1236}," comparison",{"type":42,"tag":1068,"props":1238,"children":1239},{},[1240,1249],{"type":42,"tag":1090,"props":1241,"children":1242},{},[1243],{"type":42,"tag":143,"props":1244,"children":1246},{"className":1245},[],[1247],{"type":48,"value":1248},"!Select [idx, list]",{"type":42,"tag":1090,"props":1250,"children":1251},{},[1252,1254],{"type":48,"value":1253},"Array indexing with ",{"type":42,"tag":143,"props":1255,"children":1257},{"className":1256},[],[1258],{"type":48,"value":1196},{"type":42,"tag":1068,"props":1260,"children":1261},{},[1262,1271],{"type":42,"tag":1090,"props":1263,"children":1264},{},[1265],{"type":42,"tag":143,"props":1266,"children":1268},{"className":1267},[],[1269],{"type":48,"value":1270},"!Split [delim, str]",{"type":42,"tag":1090,"props":1272,"children":1273},{},[1274],{"type":42,"tag":143,"props":1275,"children":1277},{"className":1276},[],[1278],{"type":48,"value":1279},".apply(v => v.split(...))",{"type":42,"tag":1068,"props":1281,"children":1282},{},[1283,1292],{"type":42,"tag":1090,"props":1284,"children":1285},{},[1286],{"type":42,"tag":143,"props":1287,"children":1289},{"className":1288},[],[1290],{"type":48,"value":1291},"Fn::ImportValue",{"type":42,"tag":1090,"props":1293,"children":1294},{},[1295],{"type":48,"value":1296},"Stack references or config",{"type":42,"tag":1298,"props":1299,"children":1301},"h5",{"id":1300},"example-sub",[1302],{"type":48,"value":1303},"Example: !Sub",{"type":42,"tag":339,"props":1305,"children":1307},{"className":714,"code":1306,"language":716,"meta":344,"style":344},"\u002F\u002F CloudFormation: !Sub \"arn:aws:s3:::${MyBucket}\u002F*\"\n\u002F\u002F Pulumi:\nconst bucketArn = pulumi.interpolate`arn:aws:s3:::${myBucket.bucket}\u002F*`;\n",[1308],{"type":42,"tag":143,"props":1309,"children":1310},{"__ignoreMap":344},[1311,1319,1327],{"type":42,"tag":350,"props":1312,"children":1313},{"class":352,"line":353},[1314],{"type":42,"tag":350,"props":1315,"children":1316},{"style":726},[1317],{"type":48,"value":1318},"\u002F\u002F CloudFormation: !Sub \"arn:aws:s3:::${MyBucket}\u002F*\"\n",{"type":42,"tag":350,"props":1320,"children":1321},{"class":352,"line":379},[1322],{"type":42,"tag":350,"props":1323,"children":1324},{"style":726},[1325],{"type":48,"value":1326},"\u002F\u002F Pulumi:\n",{"type":42,"tag":350,"props":1328,"children":1329},{"class":352,"line":413},[1330,1334,1339,1343,1348,1352,1357,1362,1367,1372,1377,1381,1386,1391,1396,1400],{"type":42,"tag":350,"props":1331,"children":1332},{"style":760},[1333],{"type":48,"value":763},{"type":42,"tag":350,"props":1335,"children":1336},{"style":373},[1337],{"type":48,"value":1338}," bucketArn ",{"type":42,"tag":350,"props":1340,"children":1341},{"style":388},[1342],{"type":48,"value":773},{"type":42,"tag":350,"props":1344,"children":1345},{"style":373},[1346],{"type":48,"value":1347}," pulumi",{"type":42,"tag":350,"props":1349,"children":1350},{"style":388},[1351],{"type":48,"value":306},{"type":42,"tag":350,"props":1353,"children":1354},{"style":799},[1355],{"type":48,"value":1356},"interpolate",{"type":42,"tag":350,"props":1358,"children":1359},{"style":388},[1360],{"type":48,"value":1361},"`",{"type":42,"tag":350,"props":1363,"children":1364},{"style":362},[1365],{"type":48,"value":1366},"arn:aws:s3:::",{"type":42,"tag":350,"props":1368,"children":1369},{"style":388},[1370],{"type":48,"value":1371},"${",{"type":42,"tag":350,"props":1373,"children":1374},{"style":373},[1375],{"type":48,"value":1376},"myBucket",{"type":42,"tag":350,"props":1378,"children":1379},{"style":388},[1380],{"type":48,"value":306},{"type":42,"tag":350,"props":1382,"children":1383},{"style":373},[1384],{"type":48,"value":1385},"bucket",{"type":42,"tag":350,"props":1387,"children":1388},{"style":388},[1389],{"type":48,"value":1390},"}",{"type":42,"tag":350,"props":1392,"children":1393},{"style":362},[1394],{"type":48,"value":1395},"\u002F*",{"type":42,"tag":350,"props":1397,"children":1398},{"style":388},[1399],{"type":48,"value":1361},{"type":42,"tag":350,"props":1401,"children":1402},{"style":388},[1403],{"type":48,"value":851},{"type":42,"tag":1298,"props":1405,"children":1407},{"id":1406},"example-getatt",[1408],{"type":48,"value":1409},"Example: !GetAtt",{"type":42,"tag":339,"props":1411,"children":1413},{"className":714,"code":1412,"language":716,"meta":344,"style":344},"\u002F\u002F CloudFormation: !GetAtt MyFunction.Arn\n\u002F\u002F Pulumi:\nconst functionArn = myFunction.arn;\n",[1414],{"type":42,"tag":143,"props":1415,"children":1416},{"__ignoreMap":344},[1417,1425,1432],{"type":42,"tag":350,"props":1418,"children":1419},{"class":352,"line":353},[1420],{"type":42,"tag":350,"props":1421,"children":1422},{"style":726},[1423],{"type":48,"value":1424},"\u002F\u002F CloudFormation: !GetAtt MyFunction.Arn\n",{"type":42,"tag":350,"props":1426,"children":1427},{"class":352,"line":379},[1428],{"type":42,"tag":350,"props":1429,"children":1430},{"style":726},[1431],{"type":48,"value":1326},{"type":42,"tag":350,"props":1433,"children":1434},{"class":352,"line":413},[1435,1439,1444,1448,1453,1457,1462],{"type":42,"tag":350,"props":1436,"children":1437},{"style":760},[1438],{"type":48,"value":763},{"type":42,"tag":350,"props":1440,"children":1441},{"style":373},[1442],{"type":48,"value":1443}," functionArn ",{"type":42,"tag":350,"props":1445,"children":1446},{"style":388},[1447],{"type":48,"value":773},{"type":42,"tag":350,"props":1449,"children":1450},{"style":373},[1451],{"type":48,"value":1452}," myFunction",{"type":42,"tag":350,"props":1454,"children":1455},{"style":388},[1456],{"type":48,"value":306},{"type":42,"tag":350,"props":1458,"children":1459},{"style":373},[1460],{"type":48,"value":1461},"arn",{"type":42,"tag":350,"props":1463,"children":1464},{"style":388},[1465],{"type":48,"value":851},{"type":42,"tag":258,"props":1467,"children":1469},{"id":1468},"_24-cloudformation-conditions",[1470],{"type":48,"value":1471},"2.4 CloudFormation Conditions",{"type":42,"tag":51,"props":1473,"children":1474},{},[1475],{"type":48,"value":1476},"Convert CloudFormation conditions to TypeScript logic:",{"type":42,"tag":339,"props":1478,"children":1480},{"className":714,"code":1479,"language":716,"meta":344,"style":344},"\u002F\u002F CloudFormation:\n\u002F\u002F \"Conditions\": {\n\u002F\u002F   \"CreateProdResources\": { \"Fn::Equals\": [{ \"Ref\": \"Environment\" }, \"prod\"] }\n\u002F\u002F }\n\n\u002F\u002F Pulumi:\nconst config = new pulumi.Config();\nconst environment = config.require(\"environment\");\nconst createProdResources = environment === \"prod\";\n\nif (createProdResources) {\n  \u002F\u002F Create production-only resources\n}\n",[1481],{"type":42,"tag":143,"props":1482,"children":1483},{"__ignoreMap":344},[1484,1491,1499,1507,1515,1522,1529,1571,1626,1669,1677,1697,1706],{"type":42,"tag":350,"props":1485,"children":1486},{"class":352,"line":353},[1487],{"type":42,"tag":350,"props":1488,"children":1489},{"style":726},[1490],{"type":48,"value":729},{"type":42,"tag":350,"props":1492,"children":1493},{"class":352,"line":379},[1494],{"type":42,"tag":350,"props":1495,"children":1496},{"style":726},[1497],{"type":48,"value":1498},"\u002F\u002F \"Conditions\": {\n",{"type":42,"tag":350,"props":1500,"children":1501},{"class":352,"line":413},[1502],{"type":42,"tag":350,"props":1503,"children":1504},{"style":726},[1505],{"type":48,"value":1506},"\u002F\u002F   \"CreateProdResources\": { \"Fn::Equals\": [{ \"Ref\": \"Environment\" }, \"prod\"] }\n",{"type":42,"tag":350,"props":1508,"children":1509},{"class":352,"line":30},[1510],{"type":42,"tag":350,"props":1511,"children":1512},{"style":726},[1513],{"type":48,"value":1514},"\u002F\u002F }\n",{"type":42,"tag":350,"props":1516,"children":1517},{"class":352,"line":471},[1518],{"type":42,"tag":350,"props":1519,"children":1520},{"emptyLinePlaceholder":743},[1521],{"type":48,"value":746},{"type":42,"tag":350,"props":1523,"children":1524},{"class":352,"line":854},[1525],{"type":42,"tag":350,"props":1526,"children":1527},{"style":726},[1528],{"type":48,"value":1326},{"type":42,"tag":350,"props":1530,"children":1531},{"class":352,"line":862},[1532,1536,1541,1545,1549,1553,1557,1562,1567],{"type":42,"tag":350,"props":1533,"children":1534},{"style":760},[1535],{"type":48,"value":763},{"type":42,"tag":350,"props":1537,"children":1538},{"style":373},[1539],{"type":48,"value":1540}," config ",{"type":42,"tag":350,"props":1542,"children":1543},{"style":388},[1544],{"type":48,"value":773},{"type":42,"tag":350,"props":1546,"children":1547},{"style":388},[1548],{"type":48,"value":778},{"type":42,"tag":350,"props":1550,"children":1551},{"style":373},[1552],{"type":48,"value":1347},{"type":42,"tag":350,"props":1554,"children":1555},{"style":388},[1556],{"type":48,"value":306},{"type":42,"tag":350,"props":1558,"children":1559},{"style":799},[1560],{"type":48,"value":1561},"Config",{"type":42,"tag":350,"props":1563,"children":1564},{"style":373},[1565],{"type":48,"value":1566},"()",{"type":42,"tag":350,"props":1568,"children":1569},{"style":388},[1570],{"type":48,"value":851},{"type":42,"tag":350,"props":1572,"children":1573},{"class":352,"line":871},[1574,1578,1583,1587,1592,1596,1601,1605,1609,1614,1618,1622],{"type":42,"tag":350,"props":1575,"children":1576},{"style":760},[1577],{"type":48,"value":763},{"type":42,"tag":350,"props":1579,"children":1580},{"style":373},[1581],{"type":48,"value":1582}," environment ",{"type":42,"tag":350,"props":1584,"children":1585},{"style":388},[1586],{"type":48,"value":773},{"type":42,"tag":350,"props":1588,"children":1589},{"style":373},[1590],{"type":48,"value":1591}," config",{"type":42,"tag":350,"props":1593,"children":1594},{"style":388},[1595],{"type":48,"value":306},{"type":42,"tag":350,"props":1597,"children":1598},{"style":799},[1599],{"type":48,"value":1600},"require",{"type":42,"tag":350,"props":1602,"children":1603},{"style":373},[1604],{"type":48,"value":807},{"type":42,"tag":350,"props":1606,"children":1607},{"style":388},[1608],{"type":48,"value":812},{"type":42,"tag":350,"props":1610,"children":1611},{"style":362},[1612],{"type":48,"value":1613},"environment",{"type":42,"tag":350,"props":1615,"children":1616},{"style":388},[1617],{"type":48,"value":812},{"type":42,"tag":350,"props":1619,"children":1620},{"style":373},[1621],{"type":48,"value":846},{"type":42,"tag":350,"props":1623,"children":1624},{"style":388},[1625],{"type":48,"value":851},{"type":42,"tag":350,"props":1627,"children":1629},{"class":352,"line":1628},9,[1630,1634,1639,1643,1647,1651,1656,1661,1665],{"type":42,"tag":350,"props":1631,"children":1632},{"style":760},[1633],{"type":48,"value":763},{"type":42,"tag":350,"props":1635,"children":1636},{"style":373},[1637],{"type":48,"value":1638}," createProdResources ",{"type":42,"tag":350,"props":1640,"children":1641},{"style":388},[1642],{"type":48,"value":773},{"type":42,"tag":350,"props":1644,"children":1645},{"style":373},[1646],{"type":48,"value":1582},{"type":42,"tag":350,"props":1648,"children":1649},{"style":388},[1650],{"type":48,"value":1234},{"type":42,"tag":350,"props":1652,"children":1653},{"style":388},[1654],{"type":48,"value":1655}," \"",{"type":42,"tag":350,"props":1657,"children":1658},{"style":362},[1659],{"type":48,"value":1660},"prod",{"type":42,"tag":350,"props":1662,"children":1663},{"style":388},[1664],{"type":48,"value":812},{"type":42,"tag":350,"props":1666,"children":1667},{"style":388},[1668],{"type":48,"value":851},{"type":42,"tag":350,"props":1670,"children":1672},{"class":352,"line":1671},10,[1673],{"type":42,"tag":350,"props":1674,"children":1675},{"emptyLinePlaceholder":743},[1676],{"type":48,"value":746},{"type":42,"tag":350,"props":1678,"children":1680},{"class":352,"line":1679},11,[1681,1687,1692],{"type":42,"tag":350,"props":1682,"children":1684},{"style":1683},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[1685],{"type":48,"value":1686},"if",{"type":42,"tag":350,"props":1688,"children":1689},{"style":373},[1690],{"type":48,"value":1691}," (createProdResources) ",{"type":42,"tag":350,"props":1693,"children":1694},{"style":388},[1695],{"type":48,"value":1696},"{\n",{"type":42,"tag":350,"props":1698,"children":1700},{"class":352,"line":1699},12,[1701],{"type":42,"tag":350,"props":1702,"children":1703},{"style":726},[1704],{"type":48,"value":1705},"  \u002F\u002F Create production-only resources\n",{"type":42,"tag":350,"props":1707,"children":1709},{"class":352,"line":1708},13,[1710],{"type":42,"tag":350,"props":1711,"children":1712},{"style":388},[1713],{"type":48,"value":1714},"}\n",{"type":42,"tag":258,"props":1716,"children":1718},{"id":1717},"_25-cloudformation-parameters",[1719],{"type":48,"value":1720},"2.5 CloudFormation Parameters",{"type":42,"tag":51,"props":1722,"children":1723},{},[1724],{"type":48,"value":1725},"Convert parameters to Pulumi config:",{"type":42,"tag":339,"props":1727,"children":1729},{"className":714,"code":1728,"language":716,"meta":344,"style":344},"\u002F\u002F CloudFormation:\n\u002F\u002F \"Parameters\": {\n\u002F\u002F   \"InstanceType\": { \"Type\": \"String\", \"Default\": \"t3.micro\" }\n\u002F\u002F }\n\n\u002F\u002F Pulumi:\nconst config = new pulumi.Config();\nconst instanceType = config.get(\"instanceType\") || \"t3.micro\";\n",[1730],{"type":42,"tag":143,"props":1731,"children":1732},{"__ignoreMap":344},[1733,1740,1748,1756,1763,1770,1777,1816],{"type":42,"tag":350,"props":1734,"children":1735},{"class":352,"line":353},[1736],{"type":42,"tag":350,"props":1737,"children":1738},{"style":726},[1739],{"type":48,"value":729},{"type":42,"tag":350,"props":1741,"children":1742},{"class":352,"line":379},[1743],{"type":42,"tag":350,"props":1744,"children":1745},{"style":726},[1746],{"type":48,"value":1747},"\u002F\u002F \"Parameters\": {\n",{"type":42,"tag":350,"props":1749,"children":1750},{"class":352,"line":413},[1751],{"type":42,"tag":350,"props":1752,"children":1753},{"style":726},[1754],{"type":48,"value":1755},"\u002F\u002F   \"InstanceType\": { \"Type\": \"String\", \"Default\": \"t3.micro\" }\n",{"type":42,"tag":350,"props":1757,"children":1758},{"class":352,"line":30},[1759],{"type":42,"tag":350,"props":1760,"children":1761},{"style":726},[1762],{"type":48,"value":1514},{"type":42,"tag":350,"props":1764,"children":1765},{"class":352,"line":471},[1766],{"type":42,"tag":350,"props":1767,"children":1768},{"emptyLinePlaceholder":743},[1769],{"type":48,"value":746},{"type":42,"tag":350,"props":1771,"children":1772},{"class":352,"line":854},[1773],{"type":42,"tag":350,"props":1774,"children":1775},{"style":726},[1776],{"type":48,"value":1326},{"type":42,"tag":350,"props":1778,"children":1779},{"class":352,"line":862},[1780,1784,1788,1792,1796,1800,1804,1808,1812],{"type":42,"tag":350,"props":1781,"children":1782},{"style":760},[1783],{"type":48,"value":763},{"type":42,"tag":350,"props":1785,"children":1786},{"style":373},[1787],{"type":48,"value":1540},{"type":42,"tag":350,"props":1789,"children":1790},{"style":388},[1791],{"type":48,"value":773},{"type":42,"tag":350,"props":1793,"children":1794},{"style":388},[1795],{"type":48,"value":778},{"type":42,"tag":350,"props":1797,"children":1798},{"style":373},[1799],{"type":48,"value":1347},{"type":42,"tag":350,"props":1801,"children":1802},{"style":388},[1803],{"type":48,"value":306},{"type":42,"tag":350,"props":1805,"children":1806},{"style":799},[1807],{"type":48,"value":1561},{"type":42,"tag":350,"props":1809,"children":1810},{"style":373},[1811],{"type":48,"value":1566},{"type":42,"tag":350,"props":1813,"children":1814},{"style":388},[1815],{"type":48,"value":851},{"type":42,"tag":350,"props":1817,"children":1818},{"class":352,"line":871},[1819,1823,1828,1832,1836,1840,1845,1849,1853,1858,1862,1867,1872,1876,1881,1885],{"type":42,"tag":350,"props":1820,"children":1821},{"style":760},[1822],{"type":48,"value":763},{"type":42,"tag":350,"props":1824,"children":1825},{"style":373},[1826],{"type":48,"value":1827}," instanceType ",{"type":42,"tag":350,"props":1829,"children":1830},{"style":388},[1831],{"type":48,"value":773},{"type":42,"tag":350,"props":1833,"children":1834},{"style":373},[1835],{"type":48,"value":1591},{"type":42,"tag":350,"props":1837,"children":1838},{"style":388},[1839],{"type":48,"value":306},{"type":42,"tag":350,"props":1841,"children":1842},{"style":799},[1843],{"type":48,"value":1844},"get",{"type":42,"tag":350,"props":1846,"children":1847},{"style":373},[1848],{"type":48,"value":807},{"type":42,"tag":350,"props":1850,"children":1851},{"style":388},[1852],{"type":48,"value":812},{"type":42,"tag":350,"props":1854,"children":1855},{"style":362},[1856],{"type":48,"value":1857},"instanceType",{"type":42,"tag":350,"props":1859,"children":1860},{"style":388},[1861],{"type":48,"value":812},{"type":42,"tag":350,"props":1863,"children":1864},{"style":373},[1865],{"type":48,"value":1866},") ",{"type":42,"tag":350,"props":1868,"children":1869},{"style":388},[1870],{"type":48,"value":1871},"||",{"type":42,"tag":350,"props":1873,"children":1874},{"style":388},[1875],{"type":48,"value":1655},{"type":42,"tag":350,"props":1877,"children":1878},{"style":362},[1879],{"type":48,"value":1880},"t3.micro",{"type":42,"tag":350,"props":1882,"children":1883},{"style":388},[1884],{"type":48,"value":812},{"type":42,"tag":350,"props":1886,"children":1887},{"style":388},[1888],{"type":48,"value":851},{"type":42,"tag":258,"props":1890,"children":1892},{"id":1891},"_26-cloudformation-mappings",[1893],{"type":48,"value":1894},"2.6 CloudFormation Mappings",{"type":42,"tag":51,"props":1896,"children":1897},{},[1898],{"type":48,"value":1899},"Convert mappings to TypeScript objects:",{"type":42,"tag":339,"props":1901,"children":1903},{"className":714,"code":1902,"language":716,"meta":344,"style":344},"\u002F\u002F CloudFormation:\n\u002F\u002F \"Mappings\": {\n\u002F\u002F   \"RegionMap\": {\n\u002F\u002F     \"us-east-1\": { \"AMI\": \"ami-12345\" },\n\u002F\u002F     \"us-west-2\": { \"AMI\": \"ami-67890\" }\n\u002F\u002F   }\n\u002F\u002F }\n\n\u002F\u002F Pulumi:\nconst regionMap: Record\u003Cstring, { ami: string }> = {\n  \"us-east-1\": { ami: \"ami-12345\" },\n  \"us-west-2\": { ami: \"ami-67890\" },\n};\nconst ami = regionMap[aws.config.region!].ami;\n",[1904],{"type":42,"tag":143,"props":1905,"children":1906},{"__ignoreMap":344},[1907,1914,1922,1930,1938,1946,1954,1961,1968,1975,2045,2096,2145,2153],{"type":42,"tag":350,"props":1908,"children":1909},{"class":352,"line":353},[1910],{"type":42,"tag":350,"props":1911,"children":1912},{"style":726},[1913],{"type":48,"value":729},{"type":42,"tag":350,"props":1915,"children":1916},{"class":352,"line":379},[1917],{"type":42,"tag":350,"props":1918,"children":1919},{"style":726},[1920],{"type":48,"value":1921},"\u002F\u002F \"Mappings\": {\n",{"type":42,"tag":350,"props":1923,"children":1924},{"class":352,"line":413},[1925],{"type":42,"tag":350,"props":1926,"children":1927},{"style":726},[1928],{"type":48,"value":1929},"\u002F\u002F   \"RegionMap\": {\n",{"type":42,"tag":350,"props":1931,"children":1932},{"class":352,"line":30},[1933],{"type":42,"tag":350,"props":1934,"children":1935},{"style":726},[1936],{"type":48,"value":1937},"\u002F\u002F     \"us-east-1\": { \"AMI\": \"ami-12345\" },\n",{"type":42,"tag":350,"props":1939,"children":1940},{"class":352,"line":471},[1941],{"type":42,"tag":350,"props":1942,"children":1943},{"style":726},[1944],{"type":48,"value":1945},"\u002F\u002F     \"us-west-2\": { \"AMI\": \"ami-67890\" }\n",{"type":42,"tag":350,"props":1947,"children":1948},{"class":352,"line":854},[1949],{"type":42,"tag":350,"props":1950,"children":1951},{"style":726},[1952],{"type":48,"value":1953},"\u002F\u002F   }\n",{"type":42,"tag":350,"props":1955,"children":1956},{"class":352,"line":862},[1957],{"type":42,"tag":350,"props":1958,"children":1959},{"style":726},[1960],{"type":48,"value":1514},{"type":42,"tag":350,"props":1962,"children":1963},{"class":352,"line":871},[1964],{"type":42,"tag":350,"props":1965,"children":1966},{"emptyLinePlaceholder":743},[1967],{"type":48,"value":746},{"type":42,"tag":350,"props":1969,"children":1970},{"class":352,"line":1628},[1971],{"type":42,"tag":350,"props":1972,"children":1973},{"style":726},[1974],{"type":48,"value":1326},{"type":42,"tag":350,"props":1976,"children":1977},{"class":352,"line":1671},[1978,1982,1987,1992,1997,2002,2007,2011,2015,2021,2025,2030,2035,2040],{"type":42,"tag":350,"props":1979,"children":1980},{"style":760},[1981],{"type":48,"value":763},{"type":42,"tag":350,"props":1983,"children":1984},{"style":373},[1985],{"type":48,"value":1986}," regionMap",{"type":42,"tag":350,"props":1988,"children":1989},{"style":388},[1990],{"type":48,"value":1991},":",{"type":42,"tag":350,"props":1993,"children":1994},{"style":357},[1995],{"type":48,"value":1996}," Record",{"type":42,"tag":350,"props":1998,"children":1999},{"style":388},[2000],{"type":48,"value":2001},"\u003C",{"type":42,"tag":350,"props":2003,"children":2004},{"style":357},[2005],{"type":48,"value":2006},"string",{"type":42,"tag":350,"props":2008,"children":2009},{"style":388},[2010],{"type":48,"value":826},{"type":42,"tag":350,"props":2012,"children":2013},{"style":388},[2014],{"type":48,"value":831},{"type":42,"tag":350,"props":2016,"children":2018},{"style":2017},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[2019],{"type":48,"value":2020}," ami",{"type":42,"tag":350,"props":2022,"children":2023},{"style":388},[2024],{"type":48,"value":1991},{"type":42,"tag":350,"props":2026,"children":2027},{"style":357},[2028],{"type":48,"value":2029}," string",{"type":42,"tag":350,"props":2031,"children":2032},{"style":388},[2033],{"type":48,"value":2034}," }>",{"type":42,"tag":350,"props":2036,"children":2037},{"style":388},[2038],{"type":48,"value":2039}," =",{"type":42,"tag":350,"props":2041,"children":2042},{"style":388},[2043],{"type":48,"value":2044}," {\n",{"type":42,"tag":350,"props":2046,"children":2047},{"class":352,"line":1679},[2048,2053,2058,2062,2066,2070,2074,2078,2082,2087,2091],{"type":42,"tag":350,"props":2049,"children":2050},{"style":388},[2051],{"type":48,"value":2052},"  \"",{"type":42,"tag":350,"props":2054,"children":2055},{"style":2017},[2056],{"type":48,"value":2057},"us-east-1",{"type":42,"tag":350,"props":2059,"children":2060},{"style":388},[2061],{"type":48,"value":812},{"type":42,"tag":350,"props":2063,"children":2064},{"style":388},[2065],{"type":48,"value":1991},{"type":42,"tag":350,"props":2067,"children":2068},{"style":388},[2069],{"type":48,"value":831},{"type":42,"tag":350,"props":2071,"children":2072},{"style":2017},[2073],{"type":48,"value":2020},{"type":42,"tag":350,"props":2075,"children":2076},{"style":388},[2077],{"type":48,"value":1991},{"type":42,"tag":350,"props":2079,"children":2080},{"style":388},[2081],{"type":48,"value":1655},{"type":42,"tag":350,"props":2083,"children":2084},{"style":362},[2085],{"type":48,"value":2086},"ami-12345",{"type":42,"tag":350,"props":2088,"children":2089},{"style":388},[2090],{"type":48,"value":812},{"type":42,"tag":350,"props":2092,"children":2093},{"style":388},[2094],{"type":48,"value":2095}," },\n",{"type":42,"tag":350,"props":2097,"children":2098},{"class":352,"line":1699},[2099,2103,2108,2112,2116,2120,2124,2128,2132,2137,2141],{"type":42,"tag":350,"props":2100,"children":2101},{"style":388},[2102],{"type":48,"value":2052},{"type":42,"tag":350,"props":2104,"children":2105},{"style":2017},[2106],{"type":48,"value":2107},"us-west-2",{"type":42,"tag":350,"props":2109,"children":2110},{"style":388},[2111],{"type":48,"value":812},{"type":42,"tag":350,"props":2113,"children":2114},{"style":388},[2115],{"type":48,"value":1991},{"type":42,"tag":350,"props":2117,"children":2118},{"style":388},[2119],{"type":48,"value":831},{"type":42,"tag":350,"props":2121,"children":2122},{"style":2017},[2123],{"type":48,"value":2020},{"type":42,"tag":350,"props":2125,"children":2126},{"style":388},[2127],{"type":48,"value":1991},{"type":42,"tag":350,"props":2129,"children":2130},{"style":388},[2131],{"type":48,"value":1655},{"type":42,"tag":350,"props":2133,"children":2134},{"style":362},[2135],{"type":48,"value":2136},"ami-67890",{"type":42,"tag":350,"props":2138,"children":2139},{"style":388},[2140],{"type":48,"value":812},{"type":42,"tag":350,"props":2142,"children":2143},{"style":388},[2144],{"type":48,"value":2095},{"type":42,"tag":350,"props":2146,"children":2147},{"class":352,"line":1708},[2148],{"type":42,"tag":350,"props":2149,"children":2150},{"style":388},[2151],{"type":48,"value":2152},"};\n",{"type":42,"tag":350,"props":2154,"children":2156},{"class":352,"line":2155},14,[2157,2161,2166,2170,2175,2179,2184,2188,2193,2198,2203,2207,2212],{"type":42,"tag":350,"props":2158,"children":2159},{"style":760},[2160],{"type":48,"value":763},{"type":42,"tag":350,"props":2162,"children":2163},{"style":373},[2164],{"type":48,"value":2165}," ami ",{"type":42,"tag":350,"props":2167,"children":2168},{"style":388},[2169],{"type":48,"value":773},{"type":42,"tag":350,"props":2171,"children":2172},{"style":373},[2173],{"type":48,"value":2174}," regionMap[aws",{"type":42,"tag":350,"props":2176,"children":2177},{"style":388},[2178],{"type":48,"value":306},{"type":42,"tag":350,"props":2180,"children":2181},{"style":373},[2182],{"type":48,"value":2183},"config",{"type":42,"tag":350,"props":2185,"children":2186},{"style":388},[2187],{"type":48,"value":306},{"type":42,"tag":350,"props":2189,"children":2190},{"style":373},[2191],{"type":48,"value":2192},"region",{"type":42,"tag":350,"props":2194,"children":2195},{"style":388},[2196],{"type":48,"value":2197},"!",{"type":42,"tag":350,"props":2199,"children":2200},{"style":373},[2201],{"type":48,"value":2202},"]",{"type":42,"tag":350,"props":2204,"children":2205},{"style":388},[2206],{"type":48,"value":306},{"type":42,"tag":350,"props":2208,"children":2209},{"style":373},[2210],{"type":48,"value":2211},"ami",{"type":42,"tag":350,"props":2213,"children":2214},{"style":388},[2215],{"type":48,"value":851},{"type":42,"tag":258,"props":2217,"children":2219},{"id":2218},"_27-custom-resources",[2220],{"type":48,"value":2221},"2.7 Custom Resources",{"type":42,"tag":51,"props":2223,"children":2224},{},[2225,2227,2233,2234,2240],{"type":48,"value":2226},"CloudFormation Custom Resources (",{"type":42,"tag":143,"props":2228,"children":2230},{"className":2229},[],[2231],{"type":48,"value":2232},"AWS::CloudFormation::CustomResource",{"type":48,"value":1190},{"type":42,"tag":143,"props":2235,"children":2237},{"className":2236},[],[2238],{"type":48,"value":2239},"Custom::*",{"type":48,"value":2241},") require special handling:",{"type":42,"tag":61,"props":2243,"children":2244},{},[2245,2255,2265],{"type":42,"tag":65,"props":2246,"children":2247},{},[2248,2253],{"type":42,"tag":55,"props":2249,"children":2250},{},[2251],{"type":48,"value":2252},"Identify the purpose",{"type":48,"value":2254},": Read the Lambda function code to understand what it does",{"type":42,"tag":65,"props":2256,"children":2257},{},[2258,2263],{"type":42,"tag":55,"props":2259,"children":2260},{},[2261],{"type":48,"value":2262},"Find native replacement",{"type":48,"value":2264},": Check if Pulumi has a native resource that provides the same functionality",{"type":42,"tag":65,"props":2266,"children":2267},{},[2268,2273],{"type":42,"tag":55,"props":2269,"children":2270},{},[2271],{"type":48,"value":2272},"If no replacement",{"type":48,"value":2274},": Document in the migration report that manual implementation is needed",{"type":42,"tag":258,"props":2276,"children":2278},{"id":2277},"_28-typescript-output-handling",[2279],{"type":48,"value":2280},"2.8 TypeScript Output Handling",{"type":42,"tag":51,"props":2282,"children":2283},{},[2284,2286,2291,2293,2298],{"type":48,"value":2285},"aws-native outputs often include undefined. Avoid ",{"type":42,"tag":143,"props":2287,"children":2289},{"className":2288},[],[2290],{"type":48,"value":2197},{"type":48,"value":2292}," non-null assertions. Always safely unwrap with ",{"type":42,"tag":143,"props":2294,"children":2296},{"className":2295},[],[2297],{"type":48,"value":1196},{"type":48,"value":1991},{"type":42,"tag":339,"props":2300,"children":2302},{"className":714,"code":2301,"language":716,"meta":344,"style":344},"\u002F\u002F WRONG\nfunctionName: lambdaFunction.functionName!,\n\n\u002F\u002F CORRECT\nfunctionName: lambdaFunction.functionName.apply(name => name || \"\"),\n",[2303],{"type":42,"tag":143,"props":2304,"children":2305},{"__ignoreMap":344},[2306,2314,2344,2351,2359],{"type":42,"tag":350,"props":2307,"children":2308},{"class":352,"line":353},[2309],{"type":42,"tag":350,"props":2310,"children":2311},{"style":726},[2312],{"type":48,"value":2313},"\u002F\u002F WRONG\n",{"type":42,"tag":350,"props":2315,"children":2316},{"class":352,"line":379},[2317,2322,2326,2331,2335,2339],{"type":42,"tag":350,"props":2318,"children":2319},{"style":357},[2320],{"type":48,"value":2321},"functionName",{"type":42,"tag":350,"props":2323,"children":2324},{"style":388},[2325],{"type":48,"value":1991},{"type":42,"tag":350,"props":2327,"children":2328},{"style":373},[2329],{"type":48,"value":2330}," lambdaFunction",{"type":42,"tag":350,"props":2332,"children":2333},{"style":388},[2334],{"type":48,"value":306},{"type":42,"tag":350,"props":2336,"children":2337},{"style":373},[2338],{"type":48,"value":2321},{"type":42,"tag":350,"props":2340,"children":2341},{"style":388},[2342],{"type":48,"value":2343},"!,\n",{"type":42,"tag":350,"props":2345,"children":2346},{"class":352,"line":413},[2347],{"type":42,"tag":350,"props":2348,"children":2349},{"emptyLinePlaceholder":743},[2350],{"type":48,"value":746},{"type":42,"tag":350,"props":2352,"children":2353},{"class":352,"line":30},[2354],{"type":42,"tag":350,"props":2355,"children":2356},{"style":726},[2357],{"type":48,"value":2358},"\u002F\u002F CORRECT\n",{"type":42,"tag":350,"props":2360,"children":2361},{"class":352,"line":471},[2362,2366,2370,2374,2378,2382,2386,2391,2395,2401,2406,2411,2415,2420,2424],{"type":42,"tag":350,"props":2363,"children":2364},{"style":357},[2365],{"type":48,"value":2321},{"type":42,"tag":350,"props":2367,"children":2368},{"style":388},[2369],{"type":48,"value":1991},{"type":42,"tag":350,"props":2371,"children":2372},{"style":373},[2373],{"type":48,"value":2330},{"type":42,"tag":350,"props":2375,"children":2376},{"style":388},[2377],{"type":48,"value":306},{"type":42,"tag":350,"props":2379,"children":2380},{"style":373},[2381],{"type":48,"value":2321},{"type":42,"tag":350,"props":2383,"children":2384},{"style":388},[2385],{"type":48,"value":306},{"type":42,"tag":350,"props":2387,"children":2388},{"style":799},[2389],{"type":48,"value":2390},"apply",{"type":42,"tag":350,"props":2392,"children":2393},{"style":373},[2394],{"type":48,"value":807},{"type":42,"tag":350,"props":2396,"children":2398},{"style":2397},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[2399],{"type":48,"value":2400},"name",{"type":42,"tag":350,"props":2402,"children":2403},{"style":760},[2404],{"type":48,"value":2405}," =>",{"type":42,"tag":350,"props":2407,"children":2408},{"style":373},[2409],{"type":48,"value":2410}," name ",{"type":42,"tag":350,"props":2412,"children":2413},{"style":388},[2414],{"type":48,"value":1871},{"type":42,"tag":350,"props":2416,"children":2417},{"style":388},[2418],{"type":48,"value":2419}," \"\"",{"type":42,"tag":350,"props":2421,"children":2422},{"style":373},[2423],{"type":48,"value":846},{"type":42,"tag":350,"props":2425,"children":2426},{"style":388},[2427],{"type":48,"value":2428},",\n",{"type":42,"tag":251,"props":2430,"children":2432},{"id":2431},"_3-resource-import",[2433],{"type":48,"value":2434},"3. RESOURCE IMPORT",{"type":42,"tag":51,"props":2436,"children":2437},{},[2438],{"type":48,"value":2439},"After conversion, import existing resources to be managed by Pulumi.",{"type":42,"tag":258,"props":2441,"children":2443},{"id":2442},"_30-pre-import-validation-required",[2444],{"type":48,"value":2445},"3.0 Pre-Import Validation (REQUIRED)",{"type":42,"tag":51,"props":2447,"children":2448},{},[2449],{"type":42,"tag":55,"props":2450,"children":2451},{},[2452],{"type":48,"value":2453},"Before proceeding with import, verify your code:",{"type":42,"tag":61,"props":2455,"children":2456},{},[2457,2472,2489],{"type":42,"tag":65,"props":2458,"children":2459},{},[2460,2465,2467],{"type":42,"tag":55,"props":2461,"children":2462},{},[2463],{"type":48,"value":2464},"Check Provider Usage",{"type":48,"value":2466},": Scan your code to ensure all resources use ",{"type":42,"tag":143,"props":2468,"children":2470},{"className":2469},[],[2471],{"type":48,"value":989},{"type":42,"tag":65,"props":2473,"children":2474},{},[2475,2480,2482,2487],{"type":42,"tag":55,"props":2476,"children":2477},{},[2478],{"type":48,"value":2479},"Document Exceptions",{"type":48,"value":2481},": Any use of ",{"type":42,"tag":143,"props":2483,"children":2485},{"className":2484},[],[2486],{"type":48,"value":25},{"type":48,"value":2488}," (classic) provider must be justified",{"type":42,"tag":65,"props":2490,"children":2491},{},[2492,2497],{"type":42,"tag":55,"props":2493,"children":2494},{},[2495],{"type":48,"value":2496},"Verify Resource Names",{"type":48,"value":2498},": Confirm all resources use CloudFormation Logical IDs as names",{"type":42,"tag":258,"props":2500,"children":2502},{"id":2501},"_31-automated-import-with-cdk-importer",[2503],{"type":48,"value":2504},"3.1 Automated Import with cdk-importer",{"type":42,"tag":51,"props":2506,"children":2507},{},[2508,2510,2515],{"type":48,"value":2509},"Because you used CloudFormation Logical IDs as resource names, you can use the ",{"type":42,"tag":143,"props":2511,"children":2513},{"className":2512},[],[2514],{"type":48,"value":148},{"type":48,"value":2516}," tool to automatically import resources.",{"type":42,"tag":51,"props":2518,"children":2519},{},[2520,2522,2528],{"type":48,"value":2521},"Follow ",{"type":42,"tag":2523,"props":2524,"children":2526},"a",{"href":2525},"cfn-importer.md",[2527],{"type":48,"value":2525},{"type":48,"value":2529}," for detailed import procedures.",{"type":42,"tag":258,"props":2531,"children":2533},{"id":2532},"_32-manual-import-for-failed-resources",[2534],{"type":48,"value":2535},"3.2 Manual Import for Failed Resources",{"type":42,"tag":51,"props":2537,"children":2538},{},[2539],{"type":48,"value":2540},"For resources that fail automatic import:",{"type":42,"tag":61,"props":2542,"children":2543},{},[2544,2555],{"type":42,"tag":65,"props":2545,"children":2546},{},[2547,2548,2553],{"type":48,"value":2521},{"type":42,"tag":2523,"props":2549,"children":2551},{"href":2550},"cloudformation-id-lookup.md",[2552],{"type":48,"value":2550},{"type":48,"value":2554}," to find the import ID format",{"type":42,"tag":65,"props":2556,"children":2557},{},[2558,2559,2565],{"type":48,"value":983},{"type":42,"tag":143,"props":2560,"children":2562},{"className":2561},[],[2563],{"type":48,"value":2564},"pulumi import",{"type":48,"value":1991},{"type":42,"tag":339,"props":2567,"children":2569},{"className":341,"code":2568,"language":343,"meta":344,"style":344},"pulumi import \u003Cpulumi-resource-type> \u003Clogical-id> \u003Cimport-id>\n",[2570],{"type":42,"tag":143,"props":2571,"children":2572},{"__ignoreMap":344},[2573],{"type":42,"tag":350,"props":2574,"children":2575},{"class":352,"line":353},[2576,2580,2585,2589,2594,2598,2602,2606,2611,2616,2620,2624,2629,2633],{"type":42,"tag":350,"props":2577,"children":2578},{"style":357},[2579],{"type":48,"value":8},{"type":42,"tag":350,"props":2581,"children":2582},{"style":362},[2583],{"type":48,"value":2584}," import",{"type":42,"tag":350,"props":2586,"children":2587},{"style":388},[2588],{"type":48,"value":391},{"type":42,"tag":350,"props":2590,"children":2591},{"style":362},[2592],{"type":48,"value":2593},"pulumi-resource-typ",{"type":42,"tag":350,"props":2595,"children":2596},{"style":373},[2597],{"type":48,"value":433},{"type":42,"tag":350,"props":2599,"children":2600},{"style":388},[2601],{"type":48,"value":406},{"type":42,"tag":350,"props":2603,"children":2604},{"style":388},[2605],{"type":48,"value":391},{"type":42,"tag":350,"props":2607,"children":2608},{"style":362},[2609],{"type":48,"value":2610},"logical-i",{"type":42,"tag":350,"props":2612,"children":2613},{"style":373},[2614],{"type":48,"value":2615},"d",{"type":42,"tag":350,"props":2617,"children":2618},{"style":388},[2619],{"type":48,"value":406},{"type":42,"tag":350,"props":2621,"children":2622},{"style":388},[2623],{"type":48,"value":391},{"type":42,"tag":350,"props":2625,"children":2626},{"style":362},[2627],{"type":48,"value":2628},"import-i",{"type":42,"tag":350,"props":2630,"children":2631},{"style":373},[2632],{"type":48,"value":2615},{"type":42,"tag":350,"props":2634,"children":2635},{"style":388},[2636],{"type":48,"value":2637},">\n",{"type":42,"tag":258,"props":2639,"children":2641},{"id":2640},"_33-running-preview-after-import",[2642],{"type":48,"value":2643},"3.3 Running Preview After Import",{"type":42,"tag":51,"props":2645,"children":2646},{},[2647,2649,2654],{"type":48,"value":2648},"After import, run ",{"type":42,"tag":143,"props":2650,"children":2652},{"className":2651},[],[2653],{"type":48,"value":177},{"type":48,"value":2655},". There must be:",{"type":42,"tag":108,"props":2657,"children":2658},{},[2659,2664,2669,2674],{"type":42,"tag":65,"props":2660,"children":2661},{},[2662],{"type":48,"value":2663},"NO updates",{"type":42,"tag":65,"props":2665,"children":2666},{},[2667],{"type":48,"value":2668},"NO replaces",{"type":42,"tag":65,"props":2670,"children":2671},{},[2672],{"type":48,"value":2673},"NO creates",{"type":42,"tag":65,"props":2675,"children":2676},{},[2677],{"type":48,"value":2678},"NO deletes",{"type":42,"tag":51,"props":2680,"children":2681},{},[2682],{"type":48,"value":2683},"If there are changes, investigate and update the program until preview is clean.",{"type":42,"tag":43,"props":2685,"children":2687},{"id":2686},"output-format-required",[2688],{"type":48,"value":2689},"OUTPUT FORMAT (REQUIRED)",{"type":42,"tag":51,"props":2691,"children":2692},{},[2693],{"type":48,"value":2694},"When performing a migration, always produce:",{"type":42,"tag":61,"props":2696,"children":2697},{},[2698,2708,2716,2726],{"type":42,"tag":65,"props":2699,"children":2700},{},[2701,2706],{"type":42,"tag":55,"props":2702,"children":2703},{},[2704],{"type":48,"value":2705},"Overview",{"type":48,"value":2707}," (high-level description)",{"type":42,"tag":65,"props":2709,"children":2710},{},[2711],{"type":42,"tag":55,"props":2712,"children":2713},{},[2714],{"type":48,"value":2715},"Migration Plan Summary",{"type":42,"tag":65,"props":2717,"children":2718},{},[2719,2724],{"type":42,"tag":55,"props":2720,"children":2721},{},[2722],{"type":48,"value":2723},"Pulumi Code Outputs",{"type":48,"value":2725}," (TypeScript; organized by file)",{"type":42,"tag":65,"props":2727,"children":2728},{},[2729,2734],{"type":42,"tag":55,"props":2730,"children":2731},{},[2732],{"type":48,"value":2733},"Resource Mapping Table",{"type":48,"value":1991},{"type":42,"tag":1060,"props":2736,"children":2737},{},[2738,2764],{"type":42,"tag":1064,"props":2739,"children":2740},{},[2741],{"type":42,"tag":1068,"props":2742,"children":2743},{},[2744,2749,2754,2759],{"type":42,"tag":1072,"props":2745,"children":2746},{},[2747],{"type":48,"value":2748},"CloudFormation Logical ID",{"type":42,"tag":1072,"props":2750,"children":2751},{},[2752],{"type":48,"value":2753},"CFN Type",{"type":42,"tag":1072,"props":2755,"children":2756},{},[2757],{"type":48,"value":2758},"Pulumi Type",{"type":42,"tag":1072,"props":2760,"children":2761},{},[2762],{"type":48,"value":2763},"Provider",{"type":42,"tag":1083,"props":2765,"children":2766},{},[2767,2798],{"type":42,"tag":1068,"props":2768,"children":2769},{},[2770,2778,2786,2794],{"type":42,"tag":1090,"props":2771,"children":2772},{},[2773],{"type":42,"tag":143,"props":2774,"children":2776},{"className":2775},[],[2777],{"type":48,"value":817},{"type":42,"tag":1090,"props":2779,"children":2780},{},[2781],{"type":42,"tag":143,"props":2782,"children":2784},{"className":2783},[],[2785],{"type":48,"value":1008},{"type":42,"tag":1090,"props":2787,"children":2788},{},[2789],{"type":42,"tag":143,"props":2790,"children":2792},{"className":2791},[],[2793],{"type":48,"value":1016},{"type":42,"tag":1090,"props":2795,"children":2796},{},[2797],{"type":48,"value":989},{"type":42,"tag":1068,"props":2799,"children":2800},{},[2801,2810,2819,2828],{"type":42,"tag":1090,"props":2802,"children":2803},{},[2804],{"type":42,"tag":143,"props":2805,"children":2807},{"className":2806},[],[2808],{"type":48,"value":2809},"MyLambdaFunction456",{"type":42,"tag":1090,"props":2811,"children":2812},{},[2813],{"type":42,"tag":143,"props":2814,"children":2816},{"className":2815},[],[2817],{"type":48,"value":2818},"AWS::Lambda::Function",{"type":42,"tag":1090,"props":2820,"children":2821},{},[2822],{"type":42,"tag":143,"props":2823,"children":2825},{"className":2824},[],[2826],{"type":48,"value":2827},"aws-native.lambda.Function",{"type":42,"tag":1090,"props":2829,"children":2830},{},[2831],{"type":48,"value":989},{"type":42,"tag":61,"props":2833,"children":2834},{"start":471},[2835,2845,2854],{"type":42,"tag":65,"props":2836,"children":2837},{},[2838,2843],{"type":42,"tag":55,"props":2839,"children":2840},{},[2841],{"type":48,"value":2842},"Custom Resources Summary",{"type":48,"value":2844}," (if any)",{"type":42,"tag":65,"props":2846,"children":2847},{},[2848,2852],{"type":42,"tag":55,"props":2849,"children":2850},{},[2851],{"type":48,"value":212},{"type":48,"value":2853}," (PR-ready)",{"type":42,"tag":65,"props":2855,"children":2856},{},[2857,2862],{"type":42,"tag":55,"props":2858,"children":2859},{},[2860],{"type":48,"value":2861},"Next Steps",{"type":48,"value":2863}," (import instructions)",{"type":42,"tag":43,"props":2865,"children":2867},{"id":2866},"for-detailed-documentation",[2868],{"type":48,"value":2869},"FOR DETAILED DOCUMENTATION",{"type":42,"tag":51,"props":2871,"children":2872},{},[2873],{"type":48,"value":2874},"Fetch content from official Pulumi documentation:",{"type":42,"tag":108,"props":2876,"children":2877},{},[2878],{"type":42,"tag":65,"props":2879,"children":2880},{},[2881],{"type":42,"tag":2523,"props":2882,"children":2886},{"href":2883,"rel":2884},"https:\u002F\u002Fwww.pulumi.com\u002Fdocs\u002Fiac\u002Fadopting-pulumi\u002Fmigrating-to-pulumi\u002Ffrom-aws\u002F",[2885],"nofollow",[2887],{"type":48,"value":2883},{"type":42,"tag":2889,"props":2890,"children":2891},"style",{},[2892],{"type":48,"value":2893},"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":2895,"total":1699},[2896,2904,2919,2932,2946,2961,2975,2987,3002,3015,3029,3039],{"slug":4,"name":4,"fn":5,"description":6,"org":2897,"tags":2898,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2899,2900,2901,2902,2903],{"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":2905,"name":2905,"fn":2906,"description":2907,"org":2908,"tags":2909,"stars":26,"repoUrl":27,"updatedAt":2918},"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},[2910,2913,2914,2917],{"name":2911,"slug":2912,"type":13},"Audit","audit",{"name":21,"slug":22,"type":13},{"name":2915,"slug":2916,"type":13},"Operations","operations",{"name":9,"slug":8,"type":13},"2026-07-24T05:37:48.019964",{"slug":2920,"name":2920,"fn":2921,"description":2922,"org":2923,"tags":2924,"stars":26,"repoUrl":27,"updatedAt":2931},"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},[2925,2928,2929,2930],{"name":2926,"slug":2927,"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":2933,"name":2933,"fn":2934,"description":2935,"org":2936,"tags":2937,"stars":26,"repoUrl":27,"updatedAt":2945},"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},[2938,2941,2942,2943,2944],{"name":2939,"slug":2940,"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":2947,"name":2947,"fn":2948,"description":2949,"org":2950,"tags":2951,"stars":26,"repoUrl":27,"updatedAt":2960},"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},[2952,2955,2958,2959],{"name":2953,"slug":2954,"type":13},"API Development","api-development",{"name":2956,"slug":2957,"type":13},"Automation","automation",{"name":21,"slug":22,"type":13},{"name":9,"slug":8,"type":13},"2026-06-04T07:59:00.113998",{"slug":2962,"name":2962,"fn":2963,"description":2964,"org":2965,"tags":2966,"stars":26,"repoUrl":27,"updatedAt":2974},"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},[2967,2968,2969,2972],{"name":21,"slug":22,"type":13},{"name":9,"slug":8,"type":13},{"name":2970,"slug":2971,"type":13},"Python","python",{"name":2973,"slug":716,"type":13},"TypeScript","2026-06-03T07:52:43.916562",{"slug":2976,"name":2976,"fn":2977,"description":2978,"org":2979,"tags":2980,"stars":26,"repoUrl":27,"updatedAt":2986},"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},[2981,2982,2983,2984,2985],{"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:39.23999",{"slug":2988,"name":2988,"fn":2989,"description":2990,"org":2991,"tags":2992,"stars":26,"repoUrl":27,"updatedAt":3001},"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},[2993,2996,2999,3000],{"name":2994,"slug":2995,"type":13},"Architecture","architecture",{"name":2997,"slug":2998,"type":13},"Engineering","engineering",{"name":21,"slug":22,"type":13},{"name":9,"slug":8,"type":13},"2026-06-04T07:58:57.625622",{"slug":3003,"name":3003,"fn":3004,"description":3005,"org":3006,"tags":3007,"stars":26,"repoUrl":27,"updatedAt":3014},"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},[3008,3011,3012,3013],{"name":3009,"slug":3010,"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":304,"name":304,"fn":3016,"description":3017,"org":3018,"tags":3019,"stars":26,"repoUrl":27,"updatedAt":3028},"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},[3020,3023,3024,3025],{"name":3021,"slug":3022,"type":13},"Configuration","configuration",{"name":21,"slug":22,"type":13},{"name":9,"slug":8,"type":13},{"name":3026,"slug":3027,"type":13},"Security","security","2026-07-24T05:37:47.044405",{"slug":3030,"name":3030,"fn":3031,"description":3032,"org":3033,"tags":3034,"stars":26,"repoUrl":27,"updatedAt":3038},"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},[3035,3036,3037],{"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":3040,"name":3040,"fn":3041,"description":3042,"org":3043,"tags":3044,"stars":26,"repoUrl":27,"updatedAt":3052},"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},[3045,3046,3047,3048,3049],{"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":3050,"slug":3051,"type":13},"Terraform","terraform","2026-04-06T18:50:37.954346",{"items":3054,"total":1699},[3055,3063,3070,3077,3085,3092,3099],{"slug":4,"name":4,"fn":5,"description":6,"org":3056,"tags":3057,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3058,3059,3060,3061,3062],{"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":2905,"name":2905,"fn":2906,"description":2907,"org":3064,"tags":3065,"stars":26,"repoUrl":27,"updatedAt":2918},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3066,3067,3068,3069],{"name":2911,"slug":2912,"type":13},{"name":21,"slug":22,"type":13},{"name":2915,"slug":2916,"type":13},{"name":9,"slug":8,"type":13},{"slug":2920,"name":2920,"fn":2921,"description":2922,"org":3071,"tags":3072,"stars":26,"repoUrl":27,"updatedAt":2931},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3073,3074,3075,3076],{"name":2926,"slug":2927,"type":13},{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"slug":2933,"name":2933,"fn":2934,"description":2935,"org":3078,"tags":3079,"stars":26,"repoUrl":27,"updatedAt":2945},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3080,3081,3082,3083,3084],{"name":2939,"slug":2940,"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":2947,"name":2947,"fn":2948,"description":2949,"org":3086,"tags":3087,"stars":26,"repoUrl":27,"updatedAt":2960},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3088,3089,3090,3091],{"name":2953,"slug":2954,"type":13},{"name":2956,"slug":2957,"type":13},{"name":21,"slug":22,"type":13},{"name":9,"slug":8,"type":13},{"slug":2962,"name":2962,"fn":2963,"description":2964,"org":3093,"tags":3094,"stars":26,"repoUrl":27,"updatedAt":2974},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3095,3096,3097,3098],{"name":21,"slug":22,"type":13},{"name":9,"slug":8,"type":13},{"name":2970,"slug":2971,"type":13},{"name":2973,"slug":716,"type":13},{"slug":2976,"name":2976,"fn":2977,"description":2978,"org":3100,"tags":3101,"stars":26,"repoUrl":27,"updatedAt":2986},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3102,3103,3104,3105,3106],{"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}]