AWS Lambda Python Integration
Patterns for creating high-performance AWS Lambda functions in Python with optimized cold starts and clean architecture.
Overview
This skill provides complete patterns for AWS Lambda Python development, covering two main approaches:
-
AWS Chalice Framework - Full-featured framework with built-in routing, dependency injection, and local testing server
-
Raw Python - Minimal overhead approach with maximum flexibility and control
Both approaches support API Gateway and ALB integration with production-ready configurations.
When to Use
Use this skill when:
-
Creating new Lambda functions in Python
-
Migrating existing Python applications to Lambda
-
Optimizing cold start performance for Python Lambda
-
Choosing between framework-based and minimal Python approaches
-
Configuring API Gateway or ALB integration
-
Setting up deployment pipelines for Python Lambda
Instructions
- Choose Your Approach
Approach Cold Start Best For Complexity
AWS Chalice < 200ms REST APIs, rapid development, built-in routing Low
Raw Python < 100ms Simple handlers, maximum control, minimal dependencies Low
- Project Structure
AWS Chalice Structure
my-chalice-app/ ├── app.py # Main application with routes ├── requirements.txt # Dependencies ├── .chalice/ │ ├── config.json # Chalice configuration │ └── deploy/ # Deployment artifacts ├── chalicelib/ # Additional modules │ ├── init.py │ └── services.py └── tests/ └── test_app.py
Raw Python Structure
my-lambda-function/ ├── lambda_function.py # Handler entry point ├── requirements.txt # Dependencies ├── template.yaml # SAM/CloudFormation template └── src/ # Additional modules ├── init.py ├── handlers.py └── utils.py
- Implementation Examples
See the References section for detailed implementation guides. Quick examples:
AWS Chalice:
from chalice import Chalice app = Chalice(app_name='my-api')
@app.route('/') def index(): return {'message': 'Hello from Chalice!'}
Raw Python:
def lambda_handler(event, context): return { 'statusCode': 200, 'body': json.dumps({'message': 'Hello from Lambda!'}) }
Core Concepts
Cold Start Optimization
Python has excellent cold start performance. Key strategies:
-
Initialize at module level - Persists across warm invocations
-
Use lazy loading - Defer heavy imports until needed
-
Cache boto3 clients - Reuse connections between invocations
See Raw Python Lambda for detailed patterns.
Connection Management
Create clients at module level and reuse:
_dynamodb = None
def get_table(): global _dynamodb if _dynamodb is None: _dynamodb = boto3.resource('dynamodb').Table('my-table') return _dynamodb
Environment Configuration
class Config: TABLE_NAME = os.environ.get('TABLE_NAME') DEBUG = os.environ.get('DEBUG', 'false').lower() == 'true'
@classmethod
def validate(cls):
if not cls.TABLE_NAME:
raise ValueError("TABLE_NAME required")
Best Practices
Memory and Timeout Configuration
-
Memory: Start with 256MB for simple handlers, 512MB for complex operations
-
Timeout: Set based on expected processing time
-
Simple handlers: 3-5 seconds
-
API with DB calls: 10-15 seconds
-
Data processing: 30-60 seconds
Dependencies
Keep requirements.txt minimal:
Core AWS SDK - always needed
boto3>=1.35.0
Only add what you need
requests>=2.32.0 # If calling external APIs pydantic>=2.5.0 # If using data validation
Error Handling
Return proper HTTP codes with request ID:
def lambda_handler(event, context): try: result = process_event(event) return {'statusCode': 200, 'body': json.dumps(result)} except ValueError as e: return {'statusCode': 400, 'body': json.dumps({'error': str(e)})} except Exception as e: print(f"Error: {str(e)}") # Log to CloudWatch return {'statusCode': 500, 'body': json.dumps({'error': 'Internal error'})}
See Raw Python Lambda for structured error patterns.
Logging
Use structured logging for CloudWatch Insights:
import logging, json logger = logging.getLogger() logger.setLevel(logging.INFO)
Structured log
logger.info(json.dumps({ 'eventType': 'REQUEST', 'requestId': context.aws_request_id, 'path': event.get('path') }))
See Raw Python Lambda for advanced patterns.
Deployment Options
Quick Start
Serverless Framework:
serverless.yml
service: my-python-api provider: name: aws runtime: python3.12 # or python3.11 functions: api: handler: lambda_function.lambda_handler events: - http: path: /{proxy+} method: ANY
AWS SAM:
template.yaml
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31
Resources: ApiFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./ Handler: lambda_function.lambda_handler Runtime: python3.12 # or python3.11 Events: ApiEvent: Type: Api Properties: Path: /{proxy+} Method: ANY
AWS Chalice:
chalice new-project my-api cd my-api chalice deploy --stage dev
For complete deployment configurations including CI/CD, environment-specific settings, and advanced SAM/Serverless patterns, see Serverless Deployment.
Constraints and Warnings
Lambda Limits
-
Deployment package: 250MB unzipped maximum (50MB zipped)
-
Memory: 128MB to 10GB
-
Timeout: 15 minutes maximum
-
Concurrent executions: 1000 default (adjustable)
-
Environment variables: 4KB total size
Python-Specific Considerations
-
Cold start: Python has excellent cold start performance, but avoid heavy imports at module level
-
Dependencies: Keep requirements.txt minimal; use Lambda Layers for shared dependencies
-
Native dependencies: Must be compiled for Amazon Linux 2 (x86_64 or arm64)
Common Pitfalls
-
Importing heavy libraries at module level - Defer to function level if not always needed
-
Not handling Lambda context - Use context.get_remaining_time_in_millis() for timeout awareness
-
Not validating input - Always validate and sanitize event data
-
Printing sensitive data - Be careful with logs and CloudWatch
Security Considerations
-
Never hardcode credentials; use IAM roles and environment variables
-
Validate all input data
-
Use least privilege IAM policies
-
Enable CloudTrail for audit logging
References
For detailed guidance on specific topics:
-
AWS Chalice - Complete Chalice setup, routing, middleware, deployment
-
Raw Python Lambda - Minimal handler patterns, module caching, packaging
-
Serverless Deployment - Serverless Framework, SAM, CI/CD pipelines
-
Testing Lambda - pytest, moto, SAM Local, localstack
Examples
Example 1: Create an AWS Chalice REST API
Input:
Create a Python Lambda REST API using AWS Chalice for a todo application
Process:
-
Initialize Chalice project with chalice new-project
-
Configure routes for CRUD operations
-
Set up DynamoDB integration
-
Configure deployment stages
-
Deploy with chalice deploy
Output:
-
Complete Chalice project structure
-
REST API with CRUD endpoints
-
DynamoDB table configuration
-
Deployment configuration
Example 2: Optimize Cold Start for Raw Python
Input:
My Python Lambda has slow cold start, how do I optimize it?
Process:
-
Analyze imports and initialization code
-
Move heavy imports inside functions (lazy loading)
-
Cache boto3 clients at module level
-
Remove unnecessary dependencies
-
Use provisioned concurrency if needed
Output:
-
Refactored code with lazy loading
-
Optimized cold start < 100ms
-
Dependency analysis
Example 3: Deploy with GitHub Actions
Input:
Configure CI/CD for Python Lambda with SAM
Process:
-
Create GitHub Actions workflow
-
Set up Python environment and dependencies
-
Run pytest with coverage
-
Package with SAM
-
Deploy to dev/prod stages
Output:
-
Complete .github/workflows/deploy.yml
-
Multi-stage pipeline
-
Integrated test automation
Version
Version: 1.0.0