aws-lambda — Cursor rule: what it does, how to install
This Cursor rule guides AWS Lambda code structure, security, performance, and testing. Use it while building or reviewing a serverless AWS project.
.cursor/rules/aws-lambda.mdcWhat aws-lambda does
The rule covers Lambda handler design, configuration, logging, permissions, and event processing. It recommends creating SDK clients outside the handler, using environment variables for operational settings, and keeping IAM permissions limited to the actions a function needs. Repeated events call for idempotency; workflows with several steps can be coordinated with AWS Step Functions.
Its examples use aws-lambda-powertools, AWS CDK v2, and DynamoDB. For local checks, it names AWS SAM CLI and LocalStack; for input validation, it points to Pydantic or the Parser utility in aws-lambda-powertools. Secrets can be stored with AWS Secrets Manager or AWS Systems Manager Parameter Store. Broad permissions such as s3:* run against the rule’s least-privilege guidance, so review the execution role before applying it.
What it helps with
- move SDK client creation out of the handler
- add structured JSON logging to a Lambda function
- guard event processing against duplicate invocations
- restrict an IAM role to specific actions
- test a Lambda locally or against AWS services
Example prompts for the agent
- Apply the
aws-lambdarule and moveboto3client creation outside the handler. - Review this Lambda function for duplicate event handling and excessive IAM permissions.
- Show me how to test this handler locally with AWS SAM CLI using the
aws-lambdarule.
How to install aws-lambda
Manually: put the files in place
.cursor/rules/aws-lambda.mdcFrontmatter: description, globs, alwaysApply
Manually: put the files in place
.claude/rules/aws-lambda.mdThe paths frontmatter field limits the files: move globs from the source into paths
AGENTS.md
Codex reads AGENTS.md: paste the rule text there
Manually: put the files in place
.github/instructions/aws-lambda.instructions.mdThe applyTo field sets which files it applies to: move globs from the source into applyTo
Manually: put the files in place
.devin/rules/aws-lambda.mdManually: put the files in place
.clinerules/aws-lambda.mdStep by step, with commands for each platform: Cursor rules: .mdc files, four modes and what replaced .cursorrules
Questions about aws-lambda
How do I install aws-lambda in Cursor?
Add the rule file at .cursor/rules/aws-lambda.mdc.
What does the aws-lambda rule do?
It provides guidance for AWS Lambda structure, configuration, security, performance, and testing.
How does the rule handle duplicate events?
It recommends idempotent functions and shows an example using aws-lambda-powertools with DynamoDB persistence.
Source text
aws-lambda.mdc · CC0-1.0
---
description: Definitive guidelines for writing secure, performant, and maintainable AWS Lambda functions using modern best practices.
globs: **/*
---
# aws-lambda Best Practices
This guide outlines the definitive best practices for developing AWS Lambda functions. Adhere to these principles to build reliable, cost-effective, and secure serverless applications.
## Code Organization and Structure
**1. Single Responsibility Principle:** Each Lambda function must perform one distinct task. Decompose complex workflows into smaller, focused functions orchestrated by services like AWS Step Functions.
**2. Initialize Outside the Handler:** Leverage execution environment reuse by initializing SDK clients, database connections, and heavy dependencies in the global scope.
❌ BAD:
```python
import boto3
def handler(event, context):
s3 = boto3.client('s3') # Initialized on every invocation
# ...
```
✅ GOOD:
```python
import boto3
s3 = boto3.client('s3') # Initialized once per execution environment
def handler(event, context):
# s3 client is reused across invocations
# ...
```
**3. Use Lambda Layers for Shared Code:** Keep deployment packages small and promote code reuse for common libraries and dependencies.
**4. Configuration via Environment Variables:** Never hardcode operational parameters. Use environment variables for dynamic configuration. For sensitive data, use AWS Secrets Manager or AWS Systems Manager Parameter Store.
**5. Structured JSON Logging:** Output logs in JSON format to CloudWatch. This makes logs easily queryable and analyzable. Use `aws-lambda-powertools` Logger utility.
❌ BAD:
```python
print(f"Processing event: {event}")
```
✅ GOOD:
```python
from aws_lambda_powertools import Logger
logger = Logger()
@logger.inject_lambda_context
def handler(event, context):
logger.info("Processing event", event=event)
# ...
```
**6. Infrastructure as Code (AWS CDK v2):** Define your Lambda functions and their surrounding infrastructure (API Gateway, DynamoDB, IAM roles) using AWS CDK v2. This ensures version control, repeatability, and safe deployments.
✅ GOOD:
```python
# Example using AWS CDK v2 (Python)
from aws_cdk import Stack, aws_lambda as lambda_
from constructs import Construct
class MyLambdaStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
lambda_.Function(self, "MyHandler",
runtime=lambda_.Runtime.PYTHON_3_12,
handler="index.handler",
code=lambda_.Code.from_asset("lambda"), # 'lambda' directory contains index.py
environment={
"TABLE_NAME": "MyTable",
},
# Add more configurations like memory, timeout, IAM roles
)
```
## Common Patterns and Anti-patterns
**1. Implement Idempotency:** Design functions to produce the same result even if invoked multiple times with the same input. Use `aws-lambda-powertools` for robust idempotency.
❌ BAD:
```python
# No idempotency check, might process duplicate events
def handler(event, context):
order_id = event['detail']['orderId']
# Process order, could be duplicated
# ...
```
✅ GOOD:
```python
from aws_lambda_powertools.utilities.idempotency import idempotent
from aws_lambda_powertools.utilities.idempotency.persistence import DynamoDBPersistenceLayer
import os
persistence_layer = DynamoDBPersistenceLayer(table_name=os.environ["IDEMPOTENCY_TABLE"])
@idempotent(persistence_layer=persistence_layer)
def handler(event, context):
order_id = event['detail']['orderId']
# Process order, guaranteed to run once
# ...
```
**2. Stateless Functions:** Functions must not rely on mutable local state between invocations. Any mutable data belongs in external, durable storage (e.g., DynamoDB, S3).
**3. Orchestrate with Step Functions:** For complex, multi-step workflows, use AWS Step Functions to manage state and coordination. Keep individual Lambda functions simple.
## Performance Considerations
**1. Optimize Memory and CPU:** Memory allocation directly impacts CPU. Use the AWS Lambda Power Tuning tool to find the optimal memory configuration for your function.
**2. Keep Deployment Packages Small:** Minimize cold start times by reducing package size. Use Lambda Layers and only include necessary dependencies.
**3. Use Keep-Alive for Persistent Connections:** Prevent idle connections from being purged, especially for HTTP clients.
✅ GOOD:
```python
import http.client
import ssl
# Global scope for connection reuse
http_client = http.client.HTTPSConnection("example.com", context=ssl._create_unverified_context())
def handler(event, context):
http_client.request("GET", "/api/data")
response = http_client.getresponse()
# ...
```
## Common Pitfalls and Gotchas
**1. Over-privileged IAM Roles:** Apply the principle of least privilege. Grant only the minimum necessary permissions to your function's execution role.
❌ BAD:
```json
{
"Effect": "Allow",
"Action": "s3:*", // Too broad
"Resource": "*"
}
```
✅ GOOD:
```json
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::my-specific-bucket/*" // Specific bucket and actions
}
```
**2. Lack of Input Validation:** Always validate and sanitize all incoming event data to prevent injection attacks and unexpected behavior. Use libraries like Pydantic or `aws-lambda-powertools` Parser utility.
**3. Recursive Invocations:** Avoid functions calling themselves directly or indirectly, as this can lead to infinite loops and escalated costs.
**4. Unhandled Errors:** Ensure all potential errors are caught and handled gracefully. Throw explicit exceptions for unrecoverable issues. Use `async/await` for asynchronous operations.
## Testing Approaches
**1. Unit Testing:** Focus on testing the core business logic of your function in isolation, mocking AWS service interactions.
**2. Integration Testing:** Test your function's interactions with actual AWS services. Use ephemeral resources provisioned by CDK.
**3. End-to-End Testing:** Simulate real-world scenarios, testing the entire flow from event source to final outcome.
**4. Local Development and Testing:** Utilize tools like AWS SAM CLI or LocalStack to test functions locally before deployment.
© sanjeed5 · CC0-1.0 · sanjeed5/awesome-cursor-rules-mdc