{"id":"f96c0a07-bf58-4678-a121-57a21e057956","shortId":"dbdahg","kind":"skill","title":"Aws Serverless","tagline":"Antigravity Awesome Skills skill by Sickn33","description":"# AWS Serverless\n\nSpecialized skill for building production-ready serverless applications on AWS.\nCovers Lambda functions, API Gateway, DynamoDB, SQS/SNS event-driven patterns,\nSAM/CDK deployment, and cold start optimization.\n\n## Principles\n\n- Right-size memory and timeout (measure before optimizing)\n- Minimize cold starts for latency-sensitive workloads\n- Use SnapStart for Java/.NET functions\n- Prefer HTTP API over REST API for simple use cases\n- Design for failure with DLQs and retries\n- Keep deployment packages small\n- Use environment variables for configuration\n- Implement structured logging with correlation IDs\n\n## Patterns\n\n### Lambda Handler Pattern\n\nProper Lambda function structure with error handling\n\n**When to use**: Any Lambda function implementation,API handlers, event processors, scheduled tasks\n\n```javascript\n// Node.js Lambda Handler\n// handler.js\n\n// Initialize outside handler (reused across invocations)\nconst { DynamoDBClient } = require('@aws-sdk/client-dynamodb');\nconst { DynamoDBDocumentClient, GetCommand } = require('@aws-sdk/lib-dynamodb');\n\nconst client = new DynamoDBClient({});\nconst docClient = DynamoDBDocumentClient.from(client);\n\n// Handler function\nexports.handler = async (event, context) => {\n  // Optional: Don't wait for event loop to clear (Node.js)\n  context.callbackWaitsForEmptyEventLoop = false;\n\n  try {\n    // Parse input based on event source\n    const body = typeof event.body === 'string'\n      ? JSON.parse(event.body)\n      : event.body;\n\n    // Business logic\n    const result = await processRequest(body);\n\n    // Return API Gateway compatible response\n    return {\n      statusCode: 200,\n      headers: {\n        'Content-Type': 'application/json',\n        'Access-Control-Allow-Origin': '*'\n      },\n      body: JSON.stringify(result)\n    };\n  } catch (error) {\n    console.error('Error:', JSON.stringify({\n      error: error.message,\n      stack: error.stack,\n      requestId: context.awsRequestId\n    }));\n\n    return {\n      statusCode: error.statusCode || 500,\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({\n        error: error.message || 'Internal server error'\n      })\n    };\n  }\n};\n\nasync function processRequest(data) {\n  // Your business logic here\n  const result = await docClient.send(new GetCommand({\n    TableName: process.env.TABLE_NAME,\n    Key: { id: data.id }\n  }));\n  return result.Item;\n}\n```\n\n```python\n# Python Lambda Handler\n# handler.py\n\nimport json\nimport os\nimport logging\nimport boto3\nfrom botocore.exceptions import ClientError\n\n# Initialize outside handler (reused across invocations)\nlogger = logging.getLogger()\nlogger.setLevel(logging.INFO)\n\ndynamodb = boto3.resource('dynamodb')\ntable = dynamodb.Table(os.environ['TABLE_NAME'])\n\ndef handler(event, context):\n    try:\n        # Parse input\n        body = json.loads(event.get('body', '{}')) if isinstance(event.get('body'), str) else event.get('body', {})\n\n        # Business logic\n        result = process_request(body)\n\n        return {\n            'statusCode': 200,\n            'headers': {\n                'Content-Type': 'application/json',\n                'Access-Control-Allow-Origin': '*'\n            },\n            'body': json.dumps(result)\n        }\n\n    except ClientError as e:\n        logger.error(f\"DynamoDB error: {e.response['Error']['Message']}\")\n        return error_response(500, 'Database error')\n\n    except json.JSONDecodeError:\n        return error_response(400, 'Invalid JSON')\n\n    except Exception as e:\n        logger.error(f\"Unexpected error: {str(e)}\", exc_info=True)\n        return error_response(500, 'Internal server error')\n\ndef process_request(data):\n    response = table.get_item(Key={'id': data['id']})\n    return response.get('Item')\n\ndef error_response(status_code, message):\n    return {\n        'statusCode': status_code,\n        'headers': {'Content-Type': 'application/json'},\n        'body': json.dumps({'error': message})\n    }\n```\n\n### Best_practices\n\n- Initialize clients outside handler (reused across warm invocations)\n- Always return proper API Gateway response format\n- Log with structured JSON for CloudWatch Insights\n- Include request ID in error logs for tracing\n\n### API Gateway Integration Pattern\n\nREST API and HTTP API integration with Lambda\n\n**When to use**: Building REST APIs backed by Lambda,Need HTTP endpoints for functions\n\n```yaml\n# template.yaml (SAM)\nAWSTemplateFormatVersion: '2010-09-09'\nTransform: AWS::Serverless-2016-10-31\n\nGlobals:\n  Function:\n    Runtime: nodejs20.x\n    Timeout: 30\n    MemorySize: 256\n    Environment:\n      Variables:\n        TABLE_NAME: !Ref ItemsTable\n\nResources:\n  # HTTP API (recommended for simple use cases)\n  HttpApi:\n    Type: AWS::Serverless::HttpApi\n    Properties:\n      StageName: prod\n      CorsConfiguration:\n        AllowOrigins:\n          - \"*\"\n        AllowMethods:\n          - GET\n          - POST\n          - DELETE\n        AllowHeaders:\n          - \"*\"\n\n  # Lambda Functions\n  GetItemFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      Handler: src/handlers/get.handler\n      Events:\n        GetItem:\n          Type: HttpApi\n          Properties:\n            ApiId: !Ref HttpApi\n            Path: /items/{id}\n            Method: GET\n      Policies:\n        - DynamoDBReadPolicy:\n            TableName: !Ref ItemsTable\n\n  CreateItemFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      Handler: src/handlers/create.handler\n      Events:\n        CreateItem:\n          Type: HttpApi\n          Properties:\n            ApiId: !Ref HttpApi\n            Path: /items\n            Method: POST\n      Policies:\n        - DynamoDBCrudPolicy:\n            TableName: !Ref ItemsTable\n\n  # DynamoDB Table\n  ItemsTable:\n    Type: AWS::DynamoDB::Table\n    Properties:\n      AttributeDefinitions:\n        - AttributeName: id\n          AttributeType: S\n      KeySchema:\n        - AttributeName: id\n          KeyType: HASH\n      BillingMode: PAY_PER_REQUEST\n\nOutputs:\n  ApiUrl:\n    Value: !Sub \"https://${HttpApi}.execute-api.${AWS::Region}.amazonaws.com/prod\"\n```\n\n```javascript\n// src/handlers/get.js\nconst { getItem } = require('../lib/dynamodb');\n\nexports.handler = async (event) => {\n  const id = event.pathParameters?.id;\n\n  if (!id) {\n    return {\n      statusCode: 400,\n      body: JSON.stringify({ error: 'Missing id parameter' })\n    };\n  }\n\n  const item = await getItem(id);\n\n  if (!item) {\n    return {\n      statusCode: 404,\n      body: JSON.stringify({ error: 'Item not found' })\n    };\n  }\n\n  return {\n    statusCode: 200,\n    body: JSON.stringify(item)\n  };\n};\n```\n\n### Structure\n\nproject/\n├── template.yaml      # SAM template\n├── src/\n│   ├── handlers/\n│   │   ├── get.js\n│   │   ├── create.js\n│   │   └── delete.js\n│   └── lib/\n│       └── dynamodb.js\n└── events/\n    └── event.json     # Test events\n\n### Api_comparison\n\n- Http_api:\n  - Lower latency (~10ms)\n  - Lower cost (50-70% cheaper)\n  - Simpler, fewer features\n  - Best for: Most REST APIs\n- Rest_api:\n  - More features (caching, request validation, WAF)\n  - Usage plans and API keys\n  - Request/response transformation\n  - Best for: Complex APIs, enterprise features\n\n### Event-Driven SQS Pattern\n\nLambda triggered by SQS for reliable async processing\n\n**When to use**: Decoupled, asynchronous processing,Need retry logic and DLQ,Processing messages in batches\n\n```yaml\n# template.yaml\nResources:\n  ProcessorFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      Handler: src/handlers/processor.handler\n      Events:\n        SQSEvent:\n          Type: SQS\n          Properties:\n            Queue: !GetAtt ProcessingQueue.Arn\n            BatchSize: 10\n            FunctionResponseTypes:\n              - ReportBatchItemFailures  # Partial batch failure handling\n\n  ProcessingQueue:\n    Type: AWS::SQS::Queue\n    Properties:\n      VisibilityTimeout: 180  # 6x Lambda timeout\n      RedrivePolicy:\n        deadLetterTargetArn: !GetAtt DeadLetterQueue.Arn\n        maxReceiveCount: 3\n\n  DeadLetterQueue:\n    Type: AWS::SQS::Queue\n    Properties:\n      MessageRetentionPeriod: 1209600  # 14 days\n```\n\n```javascript\n// src/handlers/processor.js\nexports.handler = async (event) => {\n  const batchItemFailures = [];\n\n  for (const record of event.Records) {\n    try {\n      const body = JSON.parse(record.body);\n      await processMessage(body);\n    } catch (error) {\n      console.error(`Failed to process message ${record.messageId}:`, error);\n      // Report this item as failed (will be retried)\n      batchItemFailures.push({\n        itemIdentifier: record.messageId\n      });\n    }\n  }\n\n  // Return failed items for retry\n  return { batchItemFailures };\n};\n\nasync function processMessage(message) {\n  // Your processing logic\n  console.log('Processing:', message);\n\n  // Simulate work\n  await saveToDatabase(message);\n}\n```\n\n```python\n# Python version\nimport json\nimport logging\n\nlogger = logging.getLogger()\n\ndef handler(event, context):\n    batch_item_failures = []\n\n    for record in event['Records']:\n        try:\n            body = json.loads(record['body'])\n            process_message(body)\n        except Exception as e:\n            logger.error(f\"Failed to process {record['messageId']}: {e}\")\n            batch_item_failures.append({\n                'itemIdentifier': record['messageId']\n            })\n\n    return {'batchItemFailures': batch_item_failures}\n```\n\n### Best_practices\n\n- Set VisibilityTimeout to 6x Lambda timeout\n- Use ReportBatchItemFailures for partial batch failure\n- Always configure a DLQ for poison messages\n- Process messages idempotently\n\n### DynamoDB Streams Pattern\n\nReact to DynamoDB table changes with Lambda\n\n**When to use**: Real-time reactions to data changes,Cross-region replication,Audit logging, notifications\n\n```yaml\n# template.yaml\nResources:\n  ItemsTable:\n    Type: AWS::DynamoDB::Table\n    Properties:\n      TableName: items\n      AttributeDefinitions:\n        - AttributeName: id\n          AttributeType: S\n      KeySchema:\n        - AttributeName: id\n          KeyType: HASH\n      BillingMode: PAY_PER_REQUEST\n      StreamSpecification:\n        StreamViewType: NEW_AND_OLD_IMAGES\n\n  StreamProcessorFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      Handler: src/handlers/stream.handler\n      Events:\n        Stream:\n          Type: DynamoDB\n          Properties:\n            Stream: !GetAtt ItemsTable.StreamArn\n            StartingPosition: TRIM_HORIZON\n            BatchSize: 100\n            MaximumRetryAttempts: 3\n            DestinationConfig:\n              OnFailure:\n                Destination: !GetAtt StreamDLQ.Arn\n\n  StreamDLQ:\n    Type: AWS::SQS::Queue\n```\n\n```javascript\n// src/handlers/stream.js\nexports.handler = async (event) => {\n  for (const record of event.Records) {\n    const eventName = record.eventName;  // INSERT, MODIFY, REMOVE\n\n    // Unmarshall DynamoDB format to plain JS objects\n    const newImage = record.dynamodb.NewImage\n      ? unmarshall(record.dynamodb.NewImage)\n      : null;\n    const oldImage = record.dynamodb.OldImage\n      ? unmarshall(record.dynamodb.OldImage)\n      : null;\n\n    console.log(`${eventName}: `, { newImage, oldImage });\n\n    switch (eventName) {\n      case 'INSERT':\n        await handleInsert(newImage);\n        break;\n      case 'MODIFY':\n        await handleModify(oldImage, newImage);\n        break;\n      case 'REMOVE':\n        await handleRemove(oldImage);\n        break;\n    }\n  }\n};\n\n// Use AWS SDK v3 unmarshall\nconst { unmarshall } = require('@aws-sdk/util-dynamodb');\n```\n\n### Stream_view_types\n\n- KEYS_ONLY: Only key attributes\n- NEW_IMAGE: After modification\n- OLD_IMAGE: Before modification\n- NEW_AND_OLD_IMAGES: Both before and after\n\n### Cold Start Optimization Pattern\n\nMinimize Lambda cold start latency\n\n**When to use**: Latency-sensitive applications,User-facing APIs,High-traffic functions\n\n## 1. Optimize Package Size\n\n```javascript\n// Use modular AWS SDK v3 imports\n// GOOD - only imports what you need\nconst { DynamoDBClient } = require('@aws-sdk/client-dynamodb');\nconst { DynamoDBDocumentClient, GetCommand } = require('@aws-sdk/lib-dynamodb');\n\n// BAD - imports entire SDK\nconst AWS = require('aws-sdk');  // Don't do this!\n```\n\n## 2. Use SnapStart (Java/.NET)\n\n```yaml\n# template.yaml\nResources:\n  JavaFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      Handler: com.example.Handler::handleRequest\n      Runtime: java21\n      SnapStart:\n        ApplyOn: PublishedVersions  # Enable SnapStart\n      AutoPublishAlias: live\n```\n\n## 3. Right-size Memory\n\n```yaml\n# More memory = more CPU = faster init\nResources:\n  FastFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      MemorySize: 1024  # 1GB gets full vCPU\n      Timeout: 30\n```\n\n## 4. Provisioned Concurrency (when needed)\n\n```yaml\nResources:\n  CriticalFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      Handler: src/handlers/critical.handler\n      AutoPublishAlias: live\n\n  ProvisionedConcurrency:\n    Type: AWS::Lambda::ProvisionedConcurrencyConfig\n    Properties:\n      FunctionName: !Ref CriticalFunction\n      Qualifier: live\n      ProvisionedConcurrentExecutions: 5\n```\n\n## 5. Keep Init Light\n\n```python\n# GOOD - Lazy initialization\n_table = None\n\ndef get_table():\n    global _table\n    if _table is None:\n        dynamodb = boto3.resource('dynamodb')\n        _table = dynamodb.Table(os.environ['TABLE_NAME'])\n    return _table\n\ndef handler(event, context):\n    table = get_table()  # Only initializes on first use\n    # ...\n```\n\n### Optimization_priority\n\n- 1: Reduce package size (biggest impact)\n- 2: Use SnapStart for Java/.NET\n- 3: Increase memory for faster init\n- 4: Delay heavy imports\n- 5: Provisioned concurrency (last resort)\n\n### SAM Local Development Pattern\n\nLocal testing and debugging with SAM CLI\n\n**When to use**: Local development and testing,Debugging Lambda functions,Testing API Gateway locally\n\n```bash\n# Install SAM CLI\npip install aws-sam-cli\n\n# Initialize new project\nsam init --runtime nodejs20.x --name my-api\n\n# Build the project\nsam build\n\n# Run locally\nsam local start-api\n\n# Invoke single function\nsam local invoke GetItemFunction --event events/get.json\n\n# Local debugging (Node.js with VS Code)\nsam local invoke --debug-port 5858 GetItemFunction\n\n# Deploy\nsam deploy --guided\n```\n\n```json\n// events/get.json (test event)\n{\n  \"pathParameters\": {\n    \"id\": \"123\"\n  },\n  \"httpMethod\": \"GET\",\n  \"path\": \"/items/123\"\n}\n```\n\n```json\n// .vscode/launch.json (for debugging)\n{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"name\": \"Attach to SAM CLI\",\n      \"type\": \"node\",\n      \"request\": \"attach\",\n      \"address\": \"localhost\",\n      \"port\": 5858,\n      \"localRoot\": \"${workspaceRoot}/src\",\n      \"remoteRoot\": \"/var/task/src\",\n      \"protocol\": \"inspector\"\n    }\n  ]\n}\n```\n\n### Commands\n\n- Sam_build: Build Lambda deployment packages\n- Sam_local_start_api: Start local API Gateway\n- Sam_local_invoke: Invoke single function\n- Sam_deploy: Deploy to AWS\n- Sam_logs: Tail CloudWatch logs\n\n### CDK Serverless Pattern\n\nInfrastructure as code with AWS CDK\n\n**When to use**: Complex infrastructure beyond Lambda,Prefer programming languages over YAML,Need reusable constructs\n\n```typescript\n// lib/api-stack.ts\nimport * as cdk from 'aws-cdk-lib';\nimport * as lambda from 'aws-cdk-lib/aws-lambda';\nimport * as apigateway from 'aws-cdk-lib/aws-apigateway';\nimport * as dynamodb from 'aws-cdk-lib/aws-dynamodb';\nimport { Construct } from 'constructs';\n\nexport class ApiStack extends cdk.Stack {\n  constructor(scope: Construct, id: string, props?: cdk.StackProps) {\n    super(scope, id, props);\n\n    // DynamoDB Table\n    const table = new dynamodb.Table(this, 'ItemsTable', {\n      partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },\n      billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,\n      removalPolicy: cdk.RemovalPolicy.DESTROY, // For dev only\n    });\n\n    // Lambda Function\n    const getItemFn = new lambda.Function(this, 'GetItemFunction', {\n      runtime: lambda.Runtime.NODEJS_20_X,\n      handler: 'get.handler',\n      code: lambda.Code.fromAsset('src/handlers'),\n      environment: {\n        TABLE_NAME: table.tableName,\n      },\n      memorySize: 256,\n      timeout: cdk.Duration.seconds(30),\n    });\n\n    // Grant permissions\n    table.grantReadData(getItemFn);\n\n    // API Gateway\n    const api = new apigateway.RestApi(this, 'ItemsApi', {\n      restApiName: 'Items Service',\n      defaultCorsPreflightOptions: {\n        allowOrigins: apigateway.Cors.ALL_ORIGINS,\n        allowMethods: apigateway.Cors.ALL_METHODS,\n      },\n    });\n\n    const items = api.root.addResource('items');\n    const item = items.addResource('{id}');\n\n    item.addMethod('GET', new apigateway.LambdaIntegration(getItemFn));\n\n    // Output API URL\n    new cdk.CfnOutput(this, 'ApiUrl', {\n      value: api.url,\n    });\n  }\n}\n```\n\n```bash\n# CDK commands\nnpm install -g aws-cdk\ncdk init app --language typescript\ncdk synth    # Generate CloudFormation\ncdk diff     # Show changes\ncdk deploy   # Deploy to AWS\n```\n\n## Sharp Edges\n\n### Cold Start INIT Phase Now Billed (Aug 2025)\n\nSeverity: HIGH\n\nSituation: Running Lambda functions in production\n\nSymptoms:\nUnexplained increase in Lambda costs (10-50% higher).\nBill includes charges for function initialization.\nFunctions with heavy startup logic cost more than expected.\n\nWhy this breaks:\nAs of August 1, 2025, AWS bills the INIT phase the same way it bills\ninvocation duration. Previously, cold start initialization wasn't billed\nfor the full duration.\n\nThis affects functions with:\n- Heavy dependency loading (large packages)\n- Slow initialization code\n- Frequent cold starts (low traffic or poor concurrency)\n\nCold starts now directly impact your bill, not just latency.\n\nRecommended fix:\n\n## Measure your INIT phase\n\n```bash\n# Check CloudWatch Logs for INIT_REPORT\n# Look for Init Duration in milliseconds\n\n# Example log line:\n# INIT_REPORT Init Duration: 423.45 ms\n```\n\n## Reduce INIT duration\n\n```javascript\n// 1. Minimize package size\n// Use tree shaking, exclude dev dependencies\n// npm prune --production\n\n// 2. Lazy load heavy dependencies\nlet heavyLib = null;\nfunction getHeavyLib() {\n  if (!heavyLib) {\n    heavyLib = require('heavy-library');\n  }\n  return heavyLib;\n}\n\n// 3. Use AWS SDK v3 modular imports\nconst { S3Client } = require('@aws-sdk/client-s3');\n// NOT: const AWS = require('aws-sdk');\n```\n\n## Use SnapStart for Java/.NET\n\n```yaml\nResources:\n  JavaFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      Runtime: java21\n      SnapStart:\n        ApplyOn: PublishedVersions\n```\n\n## Monitor cold start frequency\n\n```javascript\n// Track cold starts with custom metric\nlet isColdStart = true;\n\nexports.handler = async (event) => {\n  if (isColdStart) {\n    console.log('COLD_START');\n    // CloudWatch custom metric here\n    isColdStart = false;\n  }\n  // ...\n};\n```\n\n### Lambda Timeout Misconfiguration\n\nSeverity: HIGH\n\nSituation: Running Lambda functions, especially with external calls\n\nSymptoms:\nFunction times out unexpectedly.\n\"Task timed out after X seconds\" in logs.\nPartial processing with no response.\nSilent failures with no error caught.\n\nWhy this breaks:\nDefault Lambda timeout is only 3 seconds. Maximum is 15 minutes.\n\nCommon timeout causes:\n- Default timeout too short for workload\n- Downstream service taking longer than expected\n- Network issues in VPC\n- Infinite loops or blocking operations\n- S3 downloads larger than expected\n\nLambda terminates at timeout without graceful shutdown.\n\nRecommended fix:\n\n## Set appropriate timeout\n\n```yaml\n# template.yaml\nResources:\n  MyFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      Timeout: 30  # Seconds (max 900)\n      # Set to expected duration + buffer\n```\n\n## Implement timeout awareness\n\n```javascript\nexports.handler = async (event, context) => {\n  // Get remaining time\n  const remainingTime = context.getRemainingTimeInMillis();\n\n  // If running low on time, fail gracefully\n  if (remainingTime < 5000) {\n    console.warn('Running low on time, aborting');\n    throw new Error('Insufficient time remaining');\n  }\n\n  // For long operations, check periodically\n  for (const item of items) {\n    if (context.getRemainingTimeInMillis() < 10000) {\n      // Save progress and exit gracefully\n      await saveProgress(processedItems);\n      throw new Error('Timeout approaching, saved progress');\n    }\n    await processItem(item);\n  }\n};\n```\n\n## Set downstream timeouts\n\n```javascript\nconst axios = require('axios');\n\n// Always set timeouts on HTTP calls\nconst response = await axios.get('https://api.example.com/data', {\n  timeout: 5000  // 5 seconds\n});\n```\n\n### Out of Memory (OOM) Crash\n\nSeverity: HIGH\n\nSituation: Lambda function processing data\n\nSymptoms:\nFunction stops abruptly without error.\nCloudWatch logs appear truncated.\n\"Max Memory Used\" hits configured limit.\nInconsistent behavior under load.\n\nWhy this breaks:\nWhen Lambda exceeds memory allocation, AWS forcibly terminates\nthe runtime. This happens without raising a catchable exception.\n\nCommon causes:\n- Processing large files in memory\n- Memory leaks across invocations\n- Buffering entire response bodies\n- Heavy libraries consuming too much memory\n\nRecommended fix:\n\n## Increase memory allocation\n\n```yaml\nResources:\n  MyFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      MemorySize: 1024  # MB (128-10240)\n      # More memory = more CPU too\n```\n\n## Stream large data\n\n```javascript\n// BAD - loads entire file into memory\nconst data = await s3.getObject(params).promise();\nconst content = data.Body.toString();\n\n// GOOD - stream processing\nconst { S3Client, GetObjectCommand } = require('@aws-sdk/client-s3');\nconst s3 = new S3Client({});\n\nconst response = await s3.send(new GetObjectCommand(params));\nconst stream = response.Body;\n\n// Process stream in chunks\nfor await (const chunk of stream) {\n  await processChunk(chunk);\n}\n```\n\n## Monitor memory usage\n\n```javascript\nexports.handler = async (event, context) => {\n  const used = process.memoryUsage();\n  console.log('Memory:', {\n    heapUsed: Math.round(used.heapUsed / 1024 / 1024) + 'MB',\n    heapTotal: Math.round(used.heapTotal / 1024 / 1024) + 'MB'\n  });\n  // ...\n};\n```\n\n## Use Lambda Power Tuning\n\n```bash\n# Find optimal memory setting\n# https://github.com/alexcasalboni/aws-lambda-power-tuning\n```\n\n### VPC-Attached Lambda Cold Start Delay\n\nSeverity: MEDIUM\n\nSituation: Lambda functions in VPC accessing private resources\n\nSymptoms:\nExtremely slow cold starts (was 10+ seconds, now ~100ms).\nTimeouts on first invocation after idle period.\nFunctions work in VPC but slow compared to non-VPC.\n\nWhy this breaks:\nLambda functions in VPC need Elastic Network Interfaces (ENIs).\nAWS improved this significantly with Hyperplane ENIs, but:\n\n- First cold start in VPC still has overhead\n- NAT Gateway issues can cause timeouts\n- Security group misconfig blocks traffic\n- DNS resolution can be slow\n\nRecommended fix:\n\n## Verify VPC configuration\n\n```yaml\nResources:\n  MyFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      VpcConfig:\n        SecurityGroupIds:\n          - !Ref LambdaSecurityGroup\n        SubnetIds:\n          - !Ref PrivateSubnet1\n          - !Ref PrivateSubnet2  # Multiple AZs\n\n  LambdaSecurityGroup:\n    Type: AWS::EC2::SecurityGroup\n    Properties:\n      GroupDescription: Lambda SG\n      VpcId: !Ref VPC\n      SecurityGroupEgress:\n        - IpProtocol: tcp\n          FromPort: 443\n          ToPort: 443\n          CidrIp: 0.0.0.0/0  # Allow HTTPS outbound\n```\n\n## Use VPC endpoints for AWS services\n\n```yaml\n# Avoid NAT Gateway for AWS service calls\nDynamoDBEndpoint:\n  Type: AWS::EC2::VPCEndpoint\n  Properties:\n    ServiceName: !Sub com.amazonaws.${AWS::Region}.dynamodb\n    VpcId: !Ref VPC\n    RouteTableIds:\n      - !Ref PrivateRouteTable\n    VpcEndpointType: Gateway\n\nS3Endpoint:\n  Type: AWS::EC2::VPCEndpoint\n  Properties:\n    ServiceName: !Sub com.amazonaws.${AWS::Region}.s3\n    VpcId: !Ref VPC\n    VpcEndpointType: Gateway\n```\n\n## Only use VPC when necessary\n\nDon't attach Lambda to VPC unless you need:\n- Access to RDS/ElastiCache in VPC\n- Access to private EC2 instances\n- Compliance requirements\n\nMost AWS services can be accessed without VPC.\n\n### Node.js Event Loop Not Cleared\n\nSeverity: MEDIUM\n\nSituation: Node.js Lambda function with callbacks or timers\n\nSymptoms:\nFunction takes full timeout duration to return.\n\"Task timed out\" even though logic completed.\nExtra billing for idle time.\n\nWhy this breaks:\nBy default, Lambda waits for the Node.js event loop to be empty\nbefore returning. If you have:\n- Unresolved setTimeout/setInterval\n- Dangling database connections\n- Pending callbacks\n\nLambda waits until timeout, even if your response was ready.\n\nRecommended fix:\n\n## Tell Lambda not to wait for event loop\n\n```javascript\nexports.handler = async (event, context) => {\n  // Don't wait for event loop to clear\n  context.callbackWaitsForEmptyEventLoop = false;\n\n  // Your code here\n  const result = await processRequest(event);\n\n  return {\n    statusCode: 200,\n    body: JSON.stringify(result)\n  };\n};\n```\n\n## Close connections properly\n\n```javascript\n// For database connections, use connection pooling\n// or close connections explicitly\n\nconst mysql = require('mysql2/promise');\n\nexports.handler = async (event, context) => {\n  context.callbackWaitsForEmptyEventLoop = false;\n\n  const connection = await mysql.createConnection({...});\n  try {\n    const [rows] = await connection.query('SELECT * FROM users');\n    return { statusCode: 200, body: JSON.stringify(rows) };\n  } finally {\n    await connection.end();  // Always close\n  }\n};\n```\n\n### API Gateway Payload Size Limits\n\nSeverity: MEDIUM\n\nSituation: Returning large responses or receiving large requests\n\nSymptoms:\n\"413 Request Entity Too Large\" error\n\"Execution failed due to configuration error: Malformed Lambda proxy response\"\nResponse truncated or failed\n\nWhy this breaks:\nAPI Gateway has hard payload limits:\n- REST API: 10 MB request/response\n- HTTP API: 10 MB request/response\n- Lambda itself: 6 MB sync response, 256 KB async\n\nExceeding these causes failures that may not be obvious.\n\nRecommended fix:\n\n## For large file uploads\n\n```javascript\n// Use presigned S3 URLs instead of passing through API Gateway\n\nconst { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3');\nconst { getSignedUrl } = require('@aws-sdk/s3-request-presigner');\n\nexports.handler = async (event) => {\n  const s3 = new S3Client({});\n\n  const command = new PutObjectCommand({\n    Bucket: process.env.BUCKET_NAME,\n    Key: `uploads/${Date.now()}.file`\n  });\n\n  const uploadUrl = await getSignedUrl(s3, command, { expiresIn: 300 });\n\n  return {\n    statusCode: 200,\n    body: JSON.stringify({ uploadUrl })\n  };\n};\n```\n\n## For large responses\n\n```javascript\n// Store in S3, return presigned download URL\nexports.handler = async (event) => {\n  const largeData = await generateLargeReport();\n\n  await s3.send(new PutObjectCommand({\n    Bucket: process.env.BUCKET_NAME,\n    Key: `reports/${reportId}.json`,\n    Body: JSON.stringify(largeData)\n  }));\n\n  const downloadUrl = await getSignedUrl(s3,\n    new GetObjectCommand({\n      Bucket: process.env.BUCKET_NAME,\n      Key: `reports/${reportId}.json`\n    }),\n    { expiresIn: 3600 }\n  );\n\n  return {\n    statusCode: 200,\n    body: JSON.stringify({ downloadUrl })\n  };\n};\n```\n\n### Infinite Loop or Recursive Invocation\n\nSeverity: HIGH\n\nSituation: Lambda triggered by events\n\nSymptoms:\nRunaway costs.\nThousands of invocations in minutes.\nCloudWatch logs show repeated invocations.\nLambda writing to source bucket/table that triggers it.\n\nWhy this breaks:\nLambda can accidentally trigger itself:\n- S3 trigger writes back to same bucket\n- DynamoDB trigger updates same table\n- SNS publishes to topic that triggers it\n- Step Functions with wrong error handling\n\nRecommended fix:\n\n## Use different buckets/prefixes\n\n```yaml\n# S3 trigger with prefix filter\nEvents:\n  S3Event:\n    Type: S3\n    Properties:\n      Bucket: !Ref InputBucket\n      Events: s3:ObjectCreated:*\n      Filter:\n        S3Key:\n          Rules:\n            - Name: prefix\n              Value: uploads/  # Only trigger on uploads/\n\n# Output to different bucket or prefix\n# OutputBucket or processed/ prefix\n```\n\n## Add idempotency checks\n\n```javascript\nexports.handler = async (event) => {\n  for (const record of event.Records) {\n    const key = record.s3.object.key;\n\n    // Skip if this is a processed file\n    if (key.startsWith('processed/')) {\n      console.log('Skipping already processed file:', key);\n      continue;\n    }\n\n    // Process and write to different location\n    await processFile(key);\n    await writeToS3(`processed/${key}`, result);\n  }\n};\n```\n\n## Set reserved concurrency as circuit breaker\n\n```yaml\nResources:\n  RiskyFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      ReservedConcurrentExecutions: 10  # Max 10 parallel\n      # Limits blast radius of runaway invocations\n```\n\n## Monitor with CloudWatch alarms\n\n```yaml\nInvocationAlarm:\n  Type: AWS::CloudWatch::Alarm\n  Properties:\n    MetricName: Invocations\n    Namespace: AWS/Lambda\n    Statistic: Sum\n    Period: 60\n    EvaluationPeriods: 1\n    Threshold: 1000  # Alert if >1000 invocations/min\n    ComparisonOperator: GreaterThanThreshold\n```\n\n## Validation Checks\n\n### Hardcoded AWS Credentials\n\nSeverity: ERROR\n\nAWS credentials must never be hardcoded\n\nMessage: Hardcoded AWS access key detected. Use IAM roles or environment variables.\n\n### AWS Secret Key in Source Code\n\nSeverity: ERROR\n\nSecret keys should use Secrets Manager or environment variables\n\nMessage: Hardcoded AWS secret key. Use IAM roles or Secrets Manager.\n\n### Overly Permissive IAM Policy\n\nSeverity: WARNING\n\nAvoid wildcard permissions in Lambda IAM roles\n\nMessage: Overly permissive IAM policy. Use least privilege principle.\n\n### Lambda Handler Without Error Handling\n\nSeverity: WARNING\n\nLambda handlers should have try/catch for graceful errors\n\nMessage: Lambda handler without error handling. Add try/catch.\n\n### Missing callbackWaitsForEmptyEventLoop\n\nSeverity: INFO\n\nNode.js handlers should set callbackWaitsForEmptyEventLoop\n\nMessage: Consider setting context.callbackWaitsForEmptyEventLoop = false\n\n### Default Memory Configuration\n\nSeverity: INFO\n\nDefault 128MB may be too low for many workloads\n\nMessage: Using default 128MB memory. Consider increasing for better performance.\n\n### Low Timeout Configuration\n\nSeverity: WARNING\n\nVery low timeout may cause unexpected failures\n\nMessage: Timeout of 1-3 seconds may be too low. Increase if making external calls.\n\n### No Dead Letter Queue Configuration\n\nSeverity: WARNING\n\nAsync functions should have DLQ for failed invocations\n\nMessage: No DLQ configured. Add for async invocations.\n\n### Importing Full AWS SDK v2\n\nSeverity: WARNING\n\nImport specific clients from AWS SDK v3 for smaller packages\n\nMessage: Importing full AWS SDK. Use modular SDK v3 imports for smaller packages.\n\n### Hardcoded DynamoDB Table Name\n\nSeverity: WARNING\n\nTable names should come from environment variables\n\nMessage: Hardcoded table name. Use environment variable for portability.\n\n## Collaboration\n\n### Delegation Triggers\n\n- user needs GCP serverless -> gcp-cloud-run (Cloud Run for containers, Cloud Functions for events)\n- user needs Azure serverless -> azure-functions (Azure Functions, Logic Apps)\n- user needs database design -> postgres-wizard (RDS design, or use DynamoDB patterns)\n- user needs authentication -> auth-specialist (Cognito, API Gateway authorizers)\n- user needs complex workflows -> workflow-automation (Step Functions, EventBridge)\n- user needs AI integration -> llm-architect (Lambda calling Bedrock or external LLMs)\n\n## When to Use\nUse this skill when the request clearly matches the capabilities and patterns described above.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["aws","serverless","antigravity","awesome","skills","sickn33"],"capabilities":["skill","source-sickn33","category-antigravity-awesome-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/aws-serverless","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"install_from":"skills.sh"}},"qualityScore":"0.300","qualityRationale":"deterministic score 0.30 from registry signals: · indexed on skills.sh · published under sickn33/antigravity-awesome-skills","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill:v1","enrichmentVersion":1,"enrichedAt":"2026-04-25T11:40:47.023Z","embedding":null,"createdAt":"2026-04-18T20:34:24.789Z","updatedAt":"2026-04-25T11:40:47.023Z","lastSeenAt":"2026-04-25T11:40:47.023Z","tsv":"'-09':479,480 '-10':485 '-10240':2221 '-2016':484 '-3':3254 '-31':486 '-50':1720 '-70':684 '/0':2455 '/alexcasalboni/aws-lambda-power-tuning':2320 '/aws-apigateway':1546 '/aws-dynamodb':1555 '/aws-lambda':1537 '/client-dynamodb':135,1167 '/client-s3':1875,2256,2799 '/data'',':2126 '/items':543,569 '/items/123':1436 '/lib-dynamodb':143,1175 '/lib/dynamodb':617 '/prod':611 '/s3-request-presigner':2806 '/src':1459 '/util-dynamodb':1095 '/var/task/src':1461 '0.0.0.0':2454 '0.2.0':1442 '1':1144,1315,1743,1830,3093,3253 '10':763,1719,2344,2749,2754,3063,3065 '100':1011 '1000':3095,3098 '10000':2087 '100ms':2347 '1024':1235,2218,2300,2301,2306,2307 '10ms':680 '1209600':794 '123':1432 '128':2220 '128mb':3220,3231 '14':795 '15':1977 '180':777 '1gb':1236 '2':1190,1321,1843 '20':1608 '200':199,324,654,2651,2693,2835,2889 '2010':478 '2025':1704,1744 '256':494,1620,2763 '3':786,1013,1215,1326,1862,1973 '30':492,1241,1623,2030 '300':2832 '3600':2886 '4':1242,1332 '400':360,629 '404':645 '413':2718 '423.45':1824 '443':2450,2452 '5':1271,1272,1336,2129 '50':683 '500':227,352,379 '5000':2062,2128 '5858':1420,1456 '6':2759 '60':3091 '6x':778,914 '900':2033 'abort':2068 'abrupt':2146 'access':206,331,2335,2524,2529,2541,3118 'access-control-allow-origin':205,330 'accident':2931 'across':127,283,423,2192 'add':3002,3198,3284 'address':1453 'affect':1769 'ai':3405 'alarm':3076,3082 'alert':3096 'alloc':2170,2208 'allow':208,333,2456 'allowhead':523 'allowmethod':519,1643 'alloworigin':518,1640 'alreadi':3029 'alway':426,923,2114,2700 'amazonaws.com':610 'amazonaws.com/prod':609 'antigrav':3 'api':25,64,67,112,193,429,448,453,456,465,503,606,674,677,693,695,705,712,1139,1363,1386,1398,1474,1477,1628,1631,1660,2702,2741,2748,2753,2790,3390 'api.example.com':2125 'api.example.com/data'',':2124 'api.root.addresource':1648 'api.url':1667 'apigateway':1540 'apigateway.cors.all':1641,1644 'apigateway.lambdaintegration':1657 'apigateway.restapi':1633 'apiid':539,565 'apistack':1562 'apiurl':600,1665 'app':1679,3369 'appear':2151 'applic':19,1135 'application/json':204,232,329,411 'applyon':1209,1898 'approach':2100 'appropri':2018 'architect':3409 'ask':3466 'async':155,240,619,726,800,844,1027,1915,2044,2289,2628,2674,2765,2808,2851,3007,3272,3286 'asynchron':732 'attach':1445,1452,2323,2517 'attribut':1103 'attributedefinit':585,971 'attributenam':586,591,972,977 'attributetyp':588,974 'audit':957 'aug':1703 'august':1742 'auth':3387 'auth-specialist':3386 'authent':3385 'author':3392 'autom':3399 'autopublishalia':1213,1257 'avoid':2466,3161 'aw':1,9,21,133,141,482,511,528,554,581,607,748,772,789,965,993,1021,1085,1093,1151,1165,1173,1181,1184,1199,1230,1251,1261,1373,1489,1502,1526,1534,1543,1552,1675,1694,1745,1864,1873,1878,1881,1891,2025,2171,2213,2254,2378,2419,2436,2463,2470,2475,2482,2495,2502,2537,2797,2804,3058,3080,3105,3109,3117,3127,3146,3290,3299,3308 'await':189,250,638,814,856,1067,1073,1080,2093,2103,2122,2239,2263,2276,2281,2646,2681,2686,2698,2827,2855,2857,2873,3040,3043 'awar':2041 'awesom':4 'aws-cdk':1674 'aws-cdk-lib':1525,1533,1542,1551 'aws-sam-c':1372 'aws-sdk':132,140,1092,1164,1172,1183,1872,1880,2253,2796,2803 'aws/lambda':3087 'awstemplateformatvers':477 'axio':2111,2113 'axios.get':2123 'az':2433 'azur':3361,3364,3366 'azure-funct':3363 'back':466,2937 'bad':1176,2231 'base':173 'bash':1366,1668,1804,2313 'batch':742,767,872,906,921 'batch_item_failures.append':900 'batchitemfailur':803,843,905 'batchitemfailures.push':834 'batchsiz':762,1010 'bedrock':3412 'behavior':2160 'best':416,689,709,909 'better':3236 'beyond':1509 'biggest':1319 'bill':1702,1722,1746,1754,1763,1794,2575 'billingmod':595,981,1589 'blast':3068 'block':2001,2403 'bodi':178,191,210,233,304,307,311,315,321,335,412,630,646,655,811,816,881,884,887,2197,2652,2694,2836,2868,2890 'boto3':274 'boto3.resource':290,1292 'botocore.exceptions':276 'boundari':3474 'break':1070,1077,1083,1739,1967,2165,2368,2581,2740,2928 'breaker':3053 'bucket':2818,2861,2878,2940,2975,2995 'bucket/table':2922 'buckets/prefixes':2963 'buffer':2038,2194 'build':14,463,1387,1391,1466,1467 'busi':185,245,316 'cach':698 'call':1940,2119,2472,3264,3411 'callback':2556,2605 'callbackwaitsforemptyeventloop':3201,3208 'capabl':3428 'case':71,508,1065,1071,1078 'catch':213,817 'catchabl':2181 'category-antigravity-awesome-skills' 'caught':1964 'caus':1981,2184,2398,2768,3247 'cdk':1495,1503,1523,1527,1535,1544,1553,1669,1676,1677,1682,1686,1690 'cdk.cfnoutput':1663 'cdk.duration.seconds':1622 'cdk.removalpolicy.destroy':1594 'cdk.stack':1564 'cdk.stackprops':1571 'chang':940,952,1689 'charg':1724 'cheaper':685 'check':1805,2078,3004,3103 'chunk':2274,2278,2283 'cidrip':2453 'circuit':3052 'clarif':3468 'class':1561 'clear':166,2548,2638,3425,3441 'cli':1351,1369,1375,1448 'client':145,151,419,3297 'clienterror':278,339 'close':2655,2666,2701 'cloud':3349,3351,3355 'cloudform':1685 'cloudwatch':438,1493,1806,1922,2149,2913,3075,3081 'code':401,406,1413,1500,1612,1779,2642,3132 'cognito':3389 'cold':36,50,1120,1126,1697,1758,1781,1788,1901,1906,1920,2325,2341,2387 'collabor':3340 'com.amazonaws':2481,2501 'com.example.handler':1204 'come':3327 'command':1464,1670,2815,2830 'common':1979,2183 'compar':2361 'comparison':675 'comparisonoper':3100 'compat':195 'complet':2573 'complex':711,1507,3395 'complianc':2534 'concurr':1244,1338,1787,3050 'configur':87,924,1443,2157,2414,2728,3216,3240,3269,3283 'connect':2603,2656,2661,2663,2667,2680 'connection.end':2699 'connection.query':2687 'consid':3210,3233 'console.error':215,819 'console.log':851,1059,1919,2295,3027 'console.warn':2063 'const':129,136,144,148,177,187,248,614,621,636,802,805,810,1030,1034,1047,1053,1089,1161,1168,1180,1578,1600,1630,1646,1650,1869,1877,2050,2081,2110,2120,2237,2243,2249,2257,2261,2268,2277,2292,2644,2669,2679,2684,2792,2800,2810,2814,2825,2853,2871,3010,3014 'construct':1518,1557,1559,1567 'constructor':1565 'consum':2200 'contain':3354 'content':202,230,327,409,2244 'content-typ':201,229,326,408 'context':157,300,871,1304,2046,2291,2630,2676 'context.awsrequestid':223 'context.callbackwaitsforemptyeventloop':168,2639,2677,3212 'context.getremainingtimeinmillis':2052,2086 'continu':3033 'control':207,332 'correl':92 'corsconfigur':517 'cost':682,1718,1733,2907 'cover':22 'cpu':1224,2225 'crash':2135 'create.js':666 'createitem':561 'createitemfunct':552 'credenti':3106,3110 'criteria':3477 'criticalfunct':1249,1267 'cross':954 'cross-region':953 'custom':1909,1923 'dangl':2601 'data':243,386,392,951,2142,2229,2238 'data.body.tostring':2245 'data.id':259 'databas':353,2602,2660,3372 'date.now':2823 'day':796 'dead':3266 'deadletterqueu':787 'deadletterqueue.arn':784 'deadlettertargetarn':782 'debug':1348,1359,1409,1418,1440 'debug-port':1417 'decoupl':731 'def':297,383,397,868,1282,1301 'default':1968,1982,2583,3214,3219,3230 'defaultcorspreflightopt':1639 'delay':1333,2327 'deleg':3341 'delet':522 'delete.js':667 'depend':1773,1839,1847 'deploy':34,80,1422,1424,1469,1486,1487,1691,1692 'describ':3431,3445 'design':72,3373,3378 'destin':1016 'destinationconfig':1014 'detect':3120 'dev':1596,1838 'develop':1343,1356 'diff':1687 'differ':2962,2994,3038 'direct':1791 'dlq':738,926,3276,3282 'dlqs':76 'dns':2405 'docclient':149 'docclient.send':251 'download':2004,2848 'downloadurl':2872,2892 'downstream':1988,2107 'driven':31,717 'due':2726 'durat':1756,1767,1814,1823,1828,2037,2564 'dynamodb':27,289,291,344,577,582,933,938,966,1002,1041,1291,1293,1549,1576,2484,2941,3319,3381 'dynamodb.attributetype.string':1588 'dynamodb.billingmode.pay':1590 'dynamodb.js':669 'dynamodb.table':293,1295,1581 'dynamodbcli':130,147,1162 'dynamodbcrudpolici':573 'dynamodbdocumentcli':137,1169 'dynamodbdocumentclient.from':150 'dynamodbendpoint':2473 'dynamodbreadpolici':548 'e':341,366,372,891,899 'e.response':346 'ec2':2437,2476,2496,2532 'edg':1696 'elast':2374 'els':313 'empti':2593 'enabl':1211 'endpoint':471,2461 'eni':2377,2384 'enterpris':713 'entir':1178,2195,2233 'entiti':2720 'environ':84,495,1615,3125,3142,3329,3336,3457 'environment-specif':3456 'error':103,214,216,218,235,239,345,347,350,354,358,370,377,382,398,414,444,632,648,818,825,1963,2071,2098,2148,2723,2729,2957,3108,3134,3180,3191,3196 'error.message':219,236 'error.stack':221 'error.statuscode':226 'especi':1937 'evaluationperiod':3092 'even':2570,2610 'event':30,114,156,163,175,299,534,560,620,670,673,716,754,801,870,878,999,1028,1303,1406,1429,1916,2045,2290,2545,2589,2624,2629,2635,2648,2675,2809,2852,2904,2970,2978,3008,3358 'event-driven':29,715 'event.body':180,183,184 'event.get':306,310,314 'event.json':671 'event.pathparameters':623 'event.records':808,1033,3013 'eventbridg':3402 'eventnam':1035,1060,1064 'events/get.json':1407,1427 'exampl':1817 'exc':373 'exceed':2168,2766 'except':338,355,363,364,888,889,2182 'exclud':1837 'execut':605,2724 'execute-api':604 'exit':2091 'expect':1736,1993,2007,2036 'expert':3462 'expiresin':2831,2885 'explicit':2668 'export':1560 'exports.handler':154,618,799,1026,1914,2043,2288,2627,2673,2807,2850,3006 'extend':1563 'extern':1939,3263,3414 'extra':2574 'extrem':2339 'f':343,368,893 'face':1138 'fail':820,830,838,894,2058,2725,2737,3278 'failur':74,768,874,908,922,1960,2769,3249 'fals':169,1927,2640,2678,3213 'faster':1225,1330 'fastfunct':1228 'featur':688,697,714 'fewer':687 'file':2187,2234,2779,2824,3023,3031 'filter':2969,2981 'final':2697 'find':2314 'first':1311,2350,2386 'fix':1799,2016,2205,2411,2617,2776,2960 'forcibl':2172 'format':432,1042 'found':651 'frequenc':1903 'frequent':1780 'fromport':2449 'full':1238,1766,2562,3289,3307 'function':24,61,100,110,153,241,473,488,525,530,556,750,845,995,1143,1201,1232,1253,1361,1401,1484,1599,1710,1726,1728,1770,1851,1893,1936,1942,2027,2140,2144,2215,2332,2355,2370,2421,2554,2560,2954,3060,3273,3356,3365,3367,3401 'functionnam':1265 'functionresponsetyp':764 'g':1673 'gateway':26,194,430,449,1364,1478,1629,2395,2468,2492,2509,2703,2742,2791,3391 'gcp':3345,3348 'gcp-cloud-run':3347 'generat':1684 'generatelargereport':2856 'get':520,546,1237,1283,1306,1434,1655,2047 'get.handler':1611 'get.js':665 'getatt':760,783,1005,1017 'getcommand':138,253,1170 'getheavylib':1852 'getitem':535,615,639 'getitemfn':1601,1627,1658 'getitemfunct':526,1405,1421,1605 'getobjectcommand':2251,2266,2877 'getsignedurl':2801,2828,2874 'github.com':2319 'github.com/alexcasalboni/aws-lambda-power-tuning':2318 'global':487,1285 'good':1155,1277,2246 'grace':2013,2059,2092,3190 'grant':1624 'greaterthanthreshold':3101 'group':2401 'groupdescript':2440 'guid':1425 'handl':104,769,2958,3181,3197 'handleinsert':1068 'handlemodifi':1074 'handler':96,113,121,125,152,265,281,298,421,532,558,664,752,869,997,1203,1255,1302,1610,3178,3185,3194,3205 'handler.js':122 'handler.py':266 'handleremov':1081 'handlerequest':1205 'happen':2177 'hard':2744 'hardcod':3104,3114,3116,3145,3318,3332 'hash':594,980 'header':200,228,325,407 'heaptot':2303 'heapus':2297 'heavi':1334,1730,1772,1846,1858,2198 'heavy-librari':1857 'heavylib':1849,1854,1855,1861 'high':1141,1706,1932,2137,2899 'high-traff':1140 'higher':1721 'hit':2156 'horizon':1009 'http':63,455,470,502,676,2118,2752 'httpapi':509,513,537,541,563,567,603 'httpmethod':1433 'https':2457 'hyperplan':2383 'iam':3122,3150,3157,3166,3171 'id':93,258,391,393,442,544,587,592,622,624,626,634,640,973,978,1431,1568,1574,1586,1653 'idempot':932,3003 'idl':2353,2577 'imag':990,1105,1109,1115 'impact':1320,1792 'implement':88,111,2039 'import':267,269,271,273,277,862,864,1154,1157,1177,1335,1521,1529,1538,1547,1556,1868,3288,3295,3306,3314 'improv':2379 'includ':440,1723 'inconsist':2159 'increas':1327,1715,2206,3234,3260 'infinit':1998,2893 'info':374,3203,3218 'infrastructur':1498,1508 'init':1226,1274,1331,1380,1678,1699,1748,1802,1809,1813,1820,1822,1827 'initi':123,279,418,1279,1309,1376,1727,1760,1778 'input':172,303,3471 'inputbucket':2977 'insert':1037,1066 'insight':439 'inspector':1463 'instal':1367,1371,1672 'instanc':2533 'instead':2786 'insuffici':2072 'integr':450,457,3406 'interfac':2376 'intern':237,380 'invalid':361 'invoc':128,284,425,1755,2193,2351,2897,2910,2917,3072,3085,3279,3287 'invocationalarm':3078 'invocations/min':3099 'invok':1399,1404,1416,1481,1482 'ipprotocol':2447 'iscoldstart':1912,1918,1926 'isinst':309 'issu':1995,2396 'item':389,396,637,642,649,657,828,839,873,907,970,1637,1647,1649,1651,2082,2084,2105 'item.addmethod':1654 'itemidentifi':835,901 'items.addresource':1652 'itemsapi':1635 'itemst':500,551,576,579,963,1583 'itemstable.streamarn':1006 'java/.net':60,1193,1325,1886 'java21':1207,1896 'javafunct':1197,1889 'javascript':118,612,797,1024,1148,1829,1904,2042,2109,2230,2287,2626,2658,2781,2842,3005 'js':1045 'json':268,362,436,863,1426,1437,2867,2884 'json.dumps':336,413 'json.jsondecodeerror':356 'json.loads':305,882 'json.parse':182,812 'json.stringify':211,217,234,631,647,656,2653,2695,2837,2869,2891 'kb':2764 'keep':79,1273 'key':257,390,706,1099,1102,2821,2864,2881,3015,3032,3042,3046,3119,3129,3136,3148 'key.startswith':3025 'keyschema':590,976 'keytyp':593,979 'lambda':23,95,99,109,120,264,459,468,524,720,779,915,942,1125,1262,1360,1468,1510,1531,1598,1709,1717,1928,1935,1969,2008,2139,2167,2310,2324,2331,2369,2441,2518,2553,2584,2606,2619,2731,2757,2901,2918,2929,3165,3177,3184,3193,3410 'lambda.code.fromasset':1613 'lambda.function':1603 'lambda.runtime.nodejs':1607 'lambdasecuritygroup':2426,2434 'languag':1513,1680 'larg':1775,2186,2228,2711,2715,2722,2778,2840 'largedata':2854,2870 'larger':2005 'last':1339 'latenc':54,679,1128,1133,1797 'latency-sensit':53,1132 'lazi':1278,1844 'leak':2191 'least':3174 'let':1848,1911 'letter':3267 'lib':668,1528,1536,1545,1554 'lib/api-stack.ts':1520 'librari':1859,2199 'light':1275 'limit':2158,2706,2746,3067,3433 'line':1819 'live':1214,1258,1269 'llm':3408 'llm-architect':3407 'llms':3415 'load':1774,1845,2162,2232 'local':1342,1345,1355,1365,1393,1395,1403,1408,1415,1472,1476,1480 'localhost':1454 'localroot':1457 'locat':3039 'log':90,272,433,445,865,958,1491,1494,1807,1818,1953,2150,2914 'logger':285,866 'logger.error':342,367,892 'logger.setlevel':287 'logging.getlogger':286,867 'logging.info':288 'logic':186,246,317,736,850,1732,2572,3368 'long':2076 'longer':1991 'look':1811 'loop':164,1999,2546,2590,2625,2636,2894 'low':1783,2055,2065,3224,3238,3244,3259 'lower':678,681 'make':3262 'malform':2730 'manag':3140,3154 'mani':3226 'match':3426,3442 'math.round':2298,2304 'max':2032,2153,3064 'maximum':1975 'maximumretryattempt':1012 'maxreceivecount':785 'may':2771,3221,3246,3256 'mb':2219,2302,2308,2750,2755,2760 'measur':46,1800 'medium':2329,2550,2708 'memori':43,1219,1222,1328,2133,2154,2169,2189,2190,2203,2207,2223,2236,2285,2296,2316,3215,3232 'memorys':493,1234,1619,2217 'messag':348,402,415,740,823,847,853,858,886,929,931,3115,3144,3168,3192,3209,3228,3250,3280,3305,3331 'messageid':898,903 'messageretentionperiod':793 'method':545,570,1645 'metric':1910,1924 'metricnam':3084 'millisecond':1816 'minim':49,1124,1831 'minut':1978,2912 'misconfig':2402 'misconfigur':1930 'miss':633,3200,3479 'modif':1107,1111 'modifi':1038,1072 'modular':1150,1867,3311 'monitor':1900,2284,3073 'ms':1825 'much':2202 'multipl':2432 'must':3111 'my-api':1384 'myfunct':2023,2211,2417 'mysql':2670 'mysql.createconnection':2682 'mysql2/promise':2672 'name':256,296,498,1298,1383,1444,1585,1617,2820,2863,2880,2984,3321,3325,3334 'namespac':3086 'nat':2394,2467 'necessari':2514 'need':469,734,1160,1246,1516,2373,2523,3344,3360,3371,3384,3394,3404 'network':1994,2375 'never':3112 'new':146,252,987,1104,1112,1377,1580,1602,1632,1656,1662,2070,2097,2259,2265,2812,2816,2859,2876 'newimag':1048,1061,1069,1076 'node':1450 'node.js':119,167,1410,2544,2552,2588,3204 'nodejs20.x':490,1382 'non':2364 'non-vpc':2363 'none':1281,1290 'notif':959 'npm':1671,1840 'null':1052,1058,1850 'object':1046 'objectcr':2980 'obvious':2774 'old':989,1108,1114 'oldimag':1054,1062,1075,1082 'onfailur':1015 'oom':2134 'oper':2002,2077 'optim':38,48,1122,1145,1313,2315 'option':158 'origin':209,334,1642 'os':270 'os.environ':294,1296 'outbound':2458 'output':599,1659,2992,3451 'outputbucket':2998 'outsid':124,280,420 'over':3155,3169 'overhead':2393 'packag':81,1146,1317,1470,1776,1832,3304,3317 'parallel':3066 'param':2241,2267 'paramet':635 'pars':171,302 'partial':766,920,1954 'partitionkey':1584 'pass':2788 'path':542,568,1435 'pathparamet':1430 'pattern':32,94,97,451,719,935,1123,1344,1497,3382,3430 'pay':596,982 'payload':2704,2745 'pend':2604 'per':597,983,1591 'perform':3237 'period':2079,2354,3090 'permiss':1625,3156,3163,3170,3472 'phase':1700,1749,1803 'pip':1370 'plain':1044 'plan':703 'poison':928 'polici':547,572,3158,3172 'pool':2664 'poor':1786 'port':1419,1455 'portabl':3339 'post':521,571 'postgr':3375 'postgres-wizard':3374 'power':2311 'practic':417,910 'prefer':62,1511 'prefix':2968,2985,2997,3001 'presign':2783,2847 'previous':1757 'principl':39,3176 'prioriti':1314 'privat':2336,2531 'privateroutet':2490 'privatesubnet1':2429 'privatesubnet2':2431 'privileg':3175 'process':319,384,727,733,739,822,849,852,885,896,930,1955,2141,2185,2248,2271,3000,3022,3026,3030,3034,3045 'process.env.bucket':2819,2862,2879 'process.env.table':255 'process.memoryusage':2294 'processchunk':2282 'processeditem':2095 'processfil':3041 'processingqueu':770 'processingqueue.arn':761 'processitem':2104 'processmessag':815,846 'processor':115 'processorfunct':746 'processrequest':190,242,2647 'prod':516 'product':16,1712,1842 'production-readi':15 'program':1512 'progress':2089,2102 'project':659,1378,1389 'promis':2242 'prop':1570,1575 'proper':98,428,2657 'properti':514,531,538,557,564,584,751,758,775,792,968,996,1003,1202,1233,1254,1264,1894,2028,2216,2422,2439,2478,2498,2974,3061,3083 'protocol':1462 'provis':1243,1337 'provisionedconcurr':1259 'provisionedconcurrencyconfig':1263 'provisionedconcurrentexecut':1270 'proxi':2732 'prune':1841 'publish':2947 'publishedvers':1210,1899 'putobjectcommand':2794,2817,2860 'python':262,263,859,860,1276 'qualifi':1268 'queue':759,774,791,1023,3268 'radius':3069 'rais':2179 'rds':3377 'rds/elasticache':2526 'react':936 'reaction':949 'readi':17,2615 'real':947 'real-tim':946 'receiv':2714 'recommend':504,1798,2015,2204,2410,2616,2775,2959 'record':806,876,879,883,897,902,1031,3011 'record.body':813 'record.dynamodb.newimage':1049,1051 'record.dynamodb.oldimage':1055,1057 'record.eventname':1036 'record.messageid':824,836 'record.s3.object.key':3016 'recurs':2896 'redrivepolici':781 'reduc':1316,1826 'ref':499,540,550,566,575,1266,2425,2428,2430,2444,2486,2489,2506,2976 'region':608,955,2483,2503 'reliabl':725 'remain':2048,2074 'remainingtim':2051,2061 'remoteroot':1460 'remov':1039,1079 'removalpolici':1593 'repeat':2916 'replic':956 'report':826,1810,1821,2865,2882 'reportbatchitemfailur':765,918 'reportid':2866,2883 'request':320,385,441,598,699,984,1451,1592,2716,2719,3424 'request/response':707,2751,2756 'requestid':222 'requir':131,139,616,1091,1163,1171,1182,1856,1871,1879,2112,2252,2535,2671,2795,2802,3470 'reserv':3049 'reservedconcurrentexecut':3062 'resolut':2406 'resort':1340 'resourc':501,745,962,1196,1227,1248,1888,2022,2210,2337,2416,3055 'respons':196,351,359,378,387,399,431,1958,2121,2196,2262,2613,2712,2733,2734,2762,2841 'response.body':2270 'response.get':395 'rest':66,452,464,692,694,2747 'restapinam':1636 'result':188,212,249,318,337,2645,2654,3047 'result.item':261 'retri':78,735,833,841 'return':192,197,224,260,322,349,357,376,394,403,427,627,643,652,837,842,904,1299,1860,2566,2595,2649,2691,2710,2833,2846,2887 'reus':126,282,422 'reusabl':1517 'review':3463 'right':41,1217 'right-siz':40,1216 'riskyfunct':3056 'role':3123,3151,3167 'routetableid':2488 'row':2685,2696 'rule':2983 'run':1392,1708,1934,2054,2064,3350,3352 'runaway':2906,3071 'runtim':489,1206,1381,1606,1895,2175 's3':2003,2258,2504,2784,2811,2829,2845,2875,2934,2965,2973,2979 's3.getobject':2240 's3.send':2264,2858 's3client':1870,2250,2260,2793,2813 's3endpoint':2493 's3event':2971 's3key':2982 'safeti':3473 'sam':476,661,1341,1350,1368,1374,1379,1390,1394,1402,1414,1423,1447,1465,1471,1479,1485,1490 'sam/cdk':33 'save':2088,2101 'saveprogress':2094 'savetodatabas':857 'schedul':116 'scope':1566,1573,3444 'sdk':134,142,1086,1094,1152,1166,1174,1179,1185,1865,1874,1882,2255,2798,2805,3291,3300,3309,3312 'second':1951,1974,2031,2130,2345,3255 'secret':3128,3135,3139,3147,3153 'secur':2400 'securitygroup':2438 'securitygroupegress':2446 'securitygroupid':2424 'select':2688 'sensit':55,1134 'server':238,381 'serverless':2,10,18,483,512,529,555,749,994,1200,1231,1252,1496,1892,2026,2214,2420,3059,3346,3362 'servic':1638,1989,2464,2471,2538 'servicenam':2479,2499 'set':911,2017,2034,2106,2115,2317,3048,3207,3211 'settimeout/setinterval':2600 'sever':1705,1931,2136,2328,2549,2707,2898,3107,3133,3159,3182,3202,3217,3241,3270,3293,3322 'sg':2442 'shake':1836 'sharp':1695 'short':1985 'show':1688,2915 'shutdown':2014 'sickn33':8 'signific':2381 'silent':1959 'simpl':69,506 'simpler':686 'simul':854 'singl':1400,1483 'situat':1707,1933,2138,2330,2551,2709,2900 'size':42,1147,1218,1318,1833,2705 'skill':5,6,12,3421,3436 'skip':3017,3028 'slow':1777,2340,2360,2409 'small':82 'smaller':3303,3316 'snapstart':58,1192,1208,1212,1323,1884,1897 'sns':2946 'sourc':176,2921,3131 'source-sickn33' 'special':11 'specialist':3388 'specif':3296,3458 'sqs':718,723,757,773,790,1022 'sqs/sns':28 'sqsevent':755 'src':663 'src/handlers':1614 'src/handlers/create.handler':559 'src/handlers/critical.handler':1256 'src/handlers/get.handler':533 'src/handlers/get.js':613 'src/handlers/processor.handler':753 'src/handlers/processor.js':798 'src/handlers/stream.handler':998 'src/handlers/stream.js':1025 'stack':220 'stagenam':515 'start':37,51,1121,1127,1397,1473,1475,1698,1759,1782,1789,1902,1907,1921,2326,2342,2388 'start-api':1396 'startingposit':1007 'startup':1731 'statist':3088 'status':400,405 'statuscod':198,225,323,404,628,644,653,2650,2692,2834,2888 'step':2953,3400 'still':2391 'stop':2145,3464 'store':2843 'str':312,371 'stream':934,1000,1004,1096,2227,2247,2269,2272,2280 'streamdlq':1019 'streamdlq.arn':1018 'streamprocessorfunct':991 'streamspecif':985 'streamviewtyp':986 'string':181,1569 'structur':89,101,435,658 'sub':602,2480,2500 'subnetid':2427 'substitut':3454 'success':3476 'sum':3089 'super':1572 'switch':1063 'symptom':1713,1941,2143,2338,2559,2717,2905 'sync':2761 'synth':1683 'tabl':292,295,497,578,583,939,967,1280,1284,1286,1288,1294,1297,1300,1305,1307,1577,1579,1616,2945,3320,3324,3333 'table.get':388 'table.grantreaddata':1626 'table.tablename':1618 'tablenam':254,549,574,969 'tail':1492 'take':1990,2561 'task':117,1946,2567,3440 'tcp':2448 'tell':2618 'templat':662 'template.yaml':475,660,744,961,1195,2021 'termin':2009,2173 'test':672,1346,1358,1362,1428,3460 'though':2571 'thousand':2908 'threshold':3094 'throw':2069,2096 'time':948,1943,1947,2049,2057,2067,2073,2568,2578 'timeout':45,491,780,916,1240,1621,1929,1970,1980,1983,2011,2019,2029,2040,2099,2108,2116,2127,2348,2399,2563,2609,3239,3245,3251 'timer':2558 'topic':2949 'toport':2451 'trace':447 'track':1905 'traffic':1142,1784,2404 'transform':481,708 'treat':3449 'tree':1835 'tri':170,301,809,880,2683 'trigger':721,2902,2924,2932,2935,2942,2951,2966,2989,3342 'trim':1008 'true':375,1913 'truncat':2152,2735 'try/catch':3188,3199 'tune':2312 'type':203,231,328,410,510,527,536,553,562,580,747,756,771,788,964,992,1001,1020,1098,1198,1229,1250,1260,1449,1587,1890,2024,2212,2418,2435,2474,2494,2972,3057,3079 'typeof':179 'typescript':1519,1681 'unexpect':369,1945,3248 'unexplain':1714 'unless':2521 'unmarshal':1040,1050,1056,1088,1090 'unresolv':2599 'updat':2943 'upload':2780,2822,2987,2991 'uploadurl':2826,2838 'url':1661,2785,2849 'usag':702,2286 'use':57,70,83,107,462,507,730,917,945,1084,1131,1149,1191,1312,1322,1354,1506,1834,1863,1883,2155,2293,2309,2459,2511,2662,2782,2961,3121,3138,3149,3173,3229,3310,3335,3380,3418,3419,3434 'used.heaptotal':2305 'used.heapused':2299 'user':1137,2690,3343,3359,3370,3383,3393,3403 'user-fac':1136 'v2':3292 'v3':1087,1153,1866,3301,3313 'valid':700,3102,3459 'valu':601,1666,2986 'variabl':85,496,3126,3143,3330,3337 'vcpu':1239 'verifi':2412 'version':861,1441 'view':1097 'visibilitytimeout':776,912 'vpc':1997,2322,2334,2358,2365,2372,2390,2413,2445,2460,2487,2507,2512,2520,2528,2543 'vpc-attach':2321 'vpcconfig':2423 'vpcendpoint':2477,2497 'vpcendpointtyp':2491,2508 'vpcid':2443,2485,2505 'vs':1412 'vscode/launch.json':1438 'waf':701 'wait':161,2585,2607,2622,2633 'warm':424 'warn':3160,3183,3242,3271,3294,3323 'wasn':1761 'way':1752 'wildcard':3162 'without':2012,2147,2178,2542,3179,3195 'wizard':3376 'work':855,2356 'workflow':3396,3398 'workflow-autom':3397 'workload':56,1987,3227 'workspaceroot':1458 'write':2919,2936,3036 'writetos3':3044 'wrong':2956 'x':1609,1950 'yaml':474,743,960,1194,1220,1247,1515,1887,2020,2209,2415,2465,2964,3054,3077","prices":[{"id":"8b748e98-6870-4a17-ba2b-874a2e6dfcca","listingId":"f96c0a07-bf58-4678-a121-57a21e057956","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:34:24.789Z"}],"sources":[{"listingId":"f96c0a07-bf58-4678-a121-57a21e057956","source":"github","sourceId":"sickn33/antigravity-awesome-skills/aws-serverless","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/aws-serverless","isPrimary":false,"firstSeenAt":"2026-04-18T21:31:44.966Z","lastSeenAt":"2026-04-25T06:50:31.218Z"},{"listingId":"f96c0a07-bf58-4678-a121-57a21e057956","source":"skills_sh","sourceId":"sickn33/antigravity-awesome-skills/aws-serverless","sourceUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/aws-serverless","isPrimary":true,"firstSeenAt":"2026-04-18T20:34:24.789Z","lastSeenAt":"2026-04-25T11:40:47.023Z"}],"details":{"listingId":"f96c0a07-bf58-4678-a121-57a21e057956","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"aws-serverless","source":"skills_sh","category":"antigravity-awesome-skills","skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/aws-serverless"},"updatedAt":"2026-04-25T11:40:47.023Z"}}