Claude Code Plugins

Community-maintained marketplace

Feedback

AWS Cloud Development Kit infrastructure as code patterns and best practices for serverless, containers, and cloud-native applications

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name aws-cdk
description AWS Cloud Development Kit infrastructure as code patterns and best practices for serverless, containers, and cloud-native applications

AWS CDK Skill

Infrastructure as Code (IaC) using AWS Cloud Development Kit with TypeScript/Python for building scalable cloud applications.

When to Use This Skill

Activate this skill when the user:

  • Requests AWS infrastructure setup
  • Needs serverless application architecture
  • Wants to define cloud resources as code
  • Mentions "AWS CDK", "infrastructure as code", "CloudFormation", "serverless"
  • Requires best practices for AWS resource management
  • Asks about container orchestration (ECS, EKS)
  • Needs API Gateway, Lambda, DynamoDB patterns

Core Capabilities

1. Common CDK Patterns

  • Serverless API: API Gateway + Lambda + DynamoDB
  • Static Website: S3 + CloudFront + Route53
  • Container Service: ECS Fargate + ALB + RDS
  • Event-Driven: EventBridge + Lambda + SQS/SNS
  • Data Pipeline: S3 + Lambda + Glue + Athena
  • CI/CD Pipeline: CodePipeline + CodeBuild + CodeDeploy

2. CDK Constructs

  • L1 (CloudFormation): Direct CFN resources
  • L2 (Curated): AWS construct library
  • L3 (Patterns): High-level patterns
  • Custom Constructs: Reusable components

3. Best Practices

  • Multi-environment deployment (dev, staging, prod)
  • Tagging and cost allocation
  • Security best practices (IAM, VPC, encryption)
  • Monitoring and logging (CloudWatch)
  • Resource cleanup and lifecycle management

Example Patterns

Serverless API Stack

import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as apigateway from 'aws-cdk-lib/aws-apigateway';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';

export class ServerlessApiStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // DynamoDB Table
    const table = new dynamodb.Table(this, 'ItemsTable', {
      partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
      billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    });

    // Lambda Function
    const handler = new lambda.Function(this, 'ItemsHandler', {
      runtime: lambda.Runtime.NODEJS_18_X,
      code: lambda.Code.fromAsset('lambda'),
      handler: 'index.handler',
      environment: {
        TABLE_NAME: table.tableName,
      },
    });

    table.grantReadWriteData(handler);

    // API Gateway
    const api = new apigateway.RestApi(this, 'ItemsApi', {
      restApiName: 'Items Service',
      description: 'This service manages items.',
    });

    const items = api.root.addResource('items');
    items.addMethod('GET', new apigateway.LambdaIntegration(handler));
    items.addMethod('POST', new apigateway.LambdaIntegration(handler));

    const item = items.addResource('{id}');
    item.addMethod('GET', new apigateway.LambdaIntegration(handler));
    item.addMethod('PUT', new apigateway.LambdaIntegration(handler));
    item.addMethod('DELETE', new apigateway.LambdaIntegration(handler));
  }
}

Static Website with CloudFront

import * as s3 from 'aws-cdk-lib/aws-s3';
import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
import * as s3deploy from 'aws-cdk-lib/aws-s3-deployment';

export class StaticWebsiteStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // S3 Bucket
    const siteBucket = new s3.Bucket(this, 'SiteBucket', {
      websiteIndexDocument: 'index.html',
      websiteErrorDocument: 'error.html',
      publicReadAccess: true,
      removalPolicy: cdk.RemovalPolicy.DESTROY,
      autoDeleteObjects: true,
    });

    // CloudFront Distribution
    const distribution = new cloudfront.CloudFrontWebDistribution(this, 'SiteDistribution', {
      originConfigs: [{
        s3OriginSource: {
          s3BucketSource: siteBucket,
        },
        behaviors: [{ isDefaultBehavior: true }],
      }],
    });

    // Deploy site contents
    new s3deploy.BucketDeployment(this, 'DeployWebsite', {
      sources: [s3deploy.Source.asset('./website')],
      destinationBucket: siteBucket,
      distribution,
      distributionPaths: ['/*'],
    });

    new cdk.CfnOutput(this, 'DistributionDomainName', {
      value: distribution.distributionDomainName,
    });
  }
}

Best Practices

Do's

  • ✅ Use typed constructs (TypeScript recommended)
  • ✅ Separate stacks by lifecycle and team ownership
  • ✅ Tag all resources for cost tracking
  • ✅ Use environment variables for configuration
  • ✅ Implement proper IAM least privilege
  • ✅ Enable CloudWatch logs and metrics
  • ✅ Use CDK context for environment-specific values
  • ✅ Version lock your CDK dependencies

Don'ts

  • ❌ Don't hardcode sensitive values (use Secrets Manager)
  • ❌ Don't create circular dependencies between stacks
  • ❌ Don't forget to set removal policies
  • ❌ Don't ignore CDK security warnings
  • ❌ Don't deploy to production without testing

Resources