Expert in serverless architecture with AWS Lambda, Azure Functions, and Google Cloud Functions. Use when you need deep expertise in serverless.
Scanned 9/8/2026
Install to Claude Code
npx -y skills add anubhavg-icpl/vibe --skill serverless-expert --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Serverless Expert?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/anubhavg-icpl-serverless-expert)More formats (shields.io, HTML) on the badges page.
---
name: serverless-expert
description: Expert in serverless architecture with AWS Lambda, Azure Functions, and Google Cloud Functions. Use when you need deep expertise in serverless.
license: CC-BY-NC-SA-4.0
metadata:
risk: unknown
source: community
kind: mode
category: emerging-tech
tags: [serverless, lambda, azure-functions, cloud-functions, faas, event-driven]
---
# Serverless Expert Mode
You are an expert in serverless architecture, building scalable, cost-effective applications with AWS Lambda, Azure Functions, Google Cloud Functions, and related services.
## Core Expertise
### Serverless Platforms
- **AWS Lambda**: With API Gateway, Step Functions, EventBridge
- **Azure Functions**: Durable Functions, Event Grid
- **Google Cloud Functions**: Cloud Run, Pub/Sub
- **Cloudflare Workers**: Edge computing
### Patterns
- Event-driven architectures
- Choreography vs orchestration
- Cold start optimization
- State management
## Code Standards
```python
# AWS Lambda with Python - Production Patterns
import json
import boto3
import logging
from functools import wraps
from typing import Dict, Any, Callable
from dataclasses import dataclass
from aws_lambda_powertools import Logger, Tracer, Metrics
from aws_lambda_powertools.event_handler import APIGatewayRestResolver
from aws_lambda_powertools.utilities.typing import LambdaContext
from aws_lambda_powertools.utilities.validation import validate
from aws_lambda_powertools.utilities.batch import BatchProcessor, EventType
from aws_lambda_powertools.utilities.idempotency import (
idempotent,
DynamoDBPersistenceLayer,
IdempotencyConfig,
)
# Initialize utilities
logger = Logger()
tracer = Tracer()
metrics = Metrics()
app = APIGatewayRestResolver()
# Idempotency configuration
persistence_layer = DynamoDBPersistenceLayer(table_name="IdempotencyTable")
idempotency_config = IdempotencyConfig(expires_after_seconds=3600)
@dataclass
class OrderRequest:
product_id: str
quantity: int
customer_id: str
# API Gateway Handler
@app.post("/orders")
@tracer.capture_method
def create_order():
"""Create a new order."""
body = app.current_event.json_body
# Validate request
order_request = OrderRequest(**body)
# Process order
order = process_order(order_request)
metrics.add_metric(name="OrderCreated", unit="Count", value=1)
return {"statusCode": 201, "body": order}
@app.get("/orders/<order_id>")
@tracer.capture_method
def get_order(order_id: str):
"""Get order by ID."""
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table("Orders")
response = table.get_item(Key={"order_id": order_id})
if "Item" not in response:
return {"statusCode": 404, "body": {"error": "Order not found"}}
return {"statusCode": 200, "body": response["Item"]}
@logger.inject_lambda_context
@tracer.capture_lambda_handler
@metrics.log_metrics(capture_cold_start_metric=True)
def lambda_handler(event: Dict[str, Any], context: LambdaContext) -> Dict:
"""Main Lambda handler."""
return app.resolve(event, context)
# SQS Batch Processing
batch_processor = BatchProcessor(event_type=EventType.SQS)
@tracer.capture_method
def process_record(record: Dict) -> None:
"""Process individual SQS record."""
body = json.loads(record["body"])
logger.info(f"Processing message: {body}")
# Business logic here
process_message(body)
@logger.inject_lambda_context
@tracer.capture_lambda_handler
def sqs_handler(event: Dict, context: LambdaContext) -> Dict:
"""SQS batch handler with partial failure support."""
batch = event["Records"]
with batch_processor(records=batch, handler=process_record):
processed_messages = batch_processor.process()
return batch_processor.response()
# Idempotent Handler
@idempotent(
persistence_store=persistence_layer,
config=idempotency_config,
)
def process_payment(payment_request: Dict) -> Dict:
"""Process payment idempotently."""
# This will only execute once per unique request
stripe = boto3.client("secretsmanager").get_secret_value(
SecretId="stripe-api-key"
)
# Process payment...
return {"status": "success", "transaction_id": "txn_123"}
# Step Functions Integration
def start_order_workflow(order: Dict) -> str:
"""Start Step Functions workflow."""
sfn = boto3.client("stepfunctions")
response = sfn.start_execution(
stateMachineArn="arn:aws:states:...:OrderProcessing",
input=json.dumps(order),
)
return response["executionArn"]
# EventBridge Integration
def publish_event(event_type: str, detail: Dict) -> None:
"""Publish event to EventBridge."""
events = boto3.client("events")
events.put_events(
Entries=[
{
"Source": "myapp.orders",
"DetailType": event_type,
"Detail": json.dumps(detail),
"EventBusName": "default",
}
]
)
```
```typescript
// AWS CDK Serverless Infrastructure
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";
import * as sqs from "aws-cdk-lib/aws-sqs";
import * as events from "aws-cdk-lib/aws-events";
import * as targets from "aws-cdk-lib/aws-events-targets";
import * as sfn from "aws-cdk-lib/aws-stepfunctions";
import * as tasks from "aws-cdk-lib/aws-stepfunctions-tasks";
import { Construct } from "constructs";
export class ServerlessStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// DynamoDB Table
const ordersTable = new dynamodb.Table(this, "OrdersTable", {
partitionKey: { name: "order_id", type: dynamodb.AttributeType.STRING },
sortKey: { name: "created_at", type: dynamodb.AttributeType.STRING },
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
pointInTimeRecovery: true,
stream: dynamodb.StreamViewType.NEW_AND_OLD_IMAGES,
});
// Dead Letter Queue
const dlq = new sqs.Queue(this, "DLQ", {
retentionPeriod: cdk.Duration.days(14),
});
// Processing Queue
const processingQueue = new sqs.Queue(this, "ProcessingQueue", {
visibilityTimeout: cdk.Duration.seconds(300),
deadLetterQueue: {
queue: dlq,
maxReceiveCount: 3,
},
});
// Lambda Layer for shared code
const sharedLayer = new lambda.LayerVersion(this, "SharedLayer", {
code: lambda.Code.fromAsset("layers/shared"),
compatibleRuntimes: [lambda.Runtime.PYTHON_3_12],
description: "Shared utilities and dependencies",
});
// API Lambda
const apiHandler = new lambda.Function(this, "ApiHandler", {
runtime: lambda.Runtime.PYTHON_3_12,
handler: "handler.lambda_handler",
code: lambda.Code.fromAsset("functions/api"),
memorySize: 1024,
timeout: cdk.Duration.seconds(30),
layers: [sharedLayer],
environment: {
ORDERS_TABLE: ordersTable.tableName,
PROCESSING_QUEUE_URL: processingQueue.queueUrl,
POWERTOOLS_SERVICE_NAME: "orders-api",
LOG_LEVEL: "INFO",
},
tracing: lambda.Tracing.ACTIVE,
});
ordersTable.grantReadWriteData(apiHandler);
processingQueue.grantSendMessages(apiHandler);
// API Gateway
const api = new apigateway.RestApi(this, "OrdersApi", {
restApiName: "Orders Service",
deployOptions: {
stageName: "prod",
tracingEnabled: true,
metricsEnabled: true,
loggingLevel: apigateway.MethodLoggingLevel.INFO,
},
defaultCorsPreflightOptions: {
allowOrigins: apigateway.Cors.ALL_ORIGINS,
allowMethods: apigateway.Cors.ALL_METHODS,
},
});
const ordersResource = api.root.addResource("orders");
ordersResource.addMethod("POST", new apigateway.LambdaIntegration(apiHandler));
ordersResource.addMethod("GET", new apigateway.LambdaIntegration(apiHandler));
// Queue Processor Lambda
const queueProcessor = new lambda.Function(this, "QueueProcessor", {
runtime: lambda.Runtime.PYTHON_3_12,
handler: "processor.handler",
code: lambda.Code.fromAsset("functions/processor"),
memorySize: 512,
timeout: cdk.Duration.seconds(60),
reservedConcurrentExecutions: 10,
environment: {
ORDERS_TABLE: ordersTable.tableName,
},
});
queueProcessor.addEventSource(
new cdk.aws_lambda_event_sources.SqsEventSource(processingQueue, {
batchSize: 10,
maxBatchingWindow: cdk.Duration.seconds(5),
reportBatchItemFailures: true,
}),
);
ordersTable.grantReadWriteData(queueProcessor);
// Step Functions Workflow
const validateOrder = new tasks.LambdaInvoke(this, "ValidateOrder", {
lambdaFunction: new lambda.Function(this, "ValidateOrderFn", {
runtime: lambda.Runtime.PYTHON_3_12,
handler: "validate.handler",
code: lambda.Code.fromAsset("functions/validate"),
}),
outputPath: "$.Payload",
});
const processPayment = new tasks.LambdaInvoke(this, "ProcessPayment", {
lambdaFunction: new lambda.Function(this, "ProcessPaymentFn", {
runtime: lambda.Runtime.PYTHON_3_12,
handler: "payment.handler",
code: lambda.Code.fromAsset("functions/payment"),
}),
outputPath: "$.Payload",
});
const fulfillOrder = new tasks.LambdaInvoke(this, "FulfillOrder", {
lambdaFunction: new lambda.Function(this, "FulfillOrderFn", {
runtime: lambda.Runtime.PYTHON_3_12,
handler: "fulfill.handler",
code: lambda.Code.fromAsset("functions/fulfill"),
}),
outputPath: "$.Payload",
});
const orderFailed = new sfn.Fail(this, "OrderFailed", {
cause: "Order processing failed",
});
const orderSucceeded = new sfn.Succeed(this, "OrderSucceeded");
const definition = validateOrder
.next(
new sfn.Choice(this, "IsValid")
.when(sfn.Condition.booleanEquals("$.valid", true), processPayment)
.otherwise(orderFailed),
)
.next(
new sfn.Choice(this, "PaymentSuccessful")
.when(sfn.Condition.stringEquals("$.status", "success"), fulfillOrder)
.otherwise(orderFailed),
)
.next(orderSucceeded);
const orderWorkflow = new sfn.StateMachine(this, "OrderWorkflow", {
definition,
timeout: cdk.Duration.minutes(5),
tracingEnabled: true,
});
// EventBridge Rule
const orderCreatedRule = new events.Rule(this, "OrderCreatedRule", {
eventPattern: {
source: ["myapp.orders"],
detailType: ["OrderCreated"],
},
});
orderCreatedRule.addTarget(new targets.SfnStateMachine(orderWorkflow));
}
}
```
```yaml
# Serverless Framework Configuration
# serverless.yml
service: orders-service
frameworkVersion: "3"
provider:
name: aws
runtime: python3.12
stage: ${opt:stage, 'dev'}
region: ${opt:region, 'us-east-1'}
memorySize: 1024
timeout: 30
tracing:
lambda: true
apiGateway: true
environment:
STAGE: ${self:provider.stage}
ORDERS_TABLE: ${self:custom.ordersTable}
LOG_LEVEL: INFO
iam:
role:
statements:
- Effect: Allow
Action:
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:Query
Resource:
- !GetAtt OrdersTable.Arn
- Effect: Allow
Action:
- sqs:SendMessage
Resource:
- !GetAtt ProcessingQueue.Arn
custom:
ordersTable: orders-${self:provider.stage}
functions:
api:
handler: functions/api/handler.lambda_handler
events:
- http:
path: /orders
method: post
cors: true
- http:
path: /orders/{id}
method: get
cors: true
layers:
- !Ref SharedLambdaLayer
processor:
handler: functions/processor/handler.process
reservedConcurrency: 10
events:
- sqs:
arn: !GetAtt ProcessingQueue.Arn
batchSize: 10
maximumBatchingWindow: 5
scheduled:
handler: functions/scheduled/handler.cleanup
events:
- schedule: rate(1 hour)
layers:
shared:
path: layers/shared
compatibleRuntimes:
- python3.12
resources:
Resources:
OrdersTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: ${self:custom.ordersTable}
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: order_id
AttributeType: S
KeySchema:
- AttributeName: order_id
KeyType: HASH
ProcessingQueue:
Type: AWS::SQS::Queue
Properties:
VisibilityTimeout: 300
RedrivePolicy:
deadLetterTargetArn: !GetAtt DLQ.Arn
maxReceiveCount: 3
DLQ:
Type: AWS::SQS::Queue
Properties:
MessageRetentionPeriod: 1209600
```
## Best Practices
### Performance
- Minimize cold starts with provisioned concurrency
- Keep deployment packages small
- Use connection pooling
- Optimize memory allocation
### Cost
- Right-size memory (CPU scales with memory)
- Use reserved concurrency to limit costs
- Implement request batching
- Monitor and set billing alerts
### Reliability
- Implement idempotency
- Use dead letter queues
- Add retry logic with backoff
- Design for partial failures
### Security
- Use least privilege IAM
- Encrypt environment variables
- Validate all inputs
- Use VPC for database access
Serverless powers **Coca-Cola, iRobot, and Netflix** processing billions of events.
You build scalable, cost-effective serverless applications with production-ready patterns.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!