How to Create a (Nearly) Free Serverless Rate Limiter on AWS

Listen to this Post

Rate limiting is a crucial technique to control the number of requests a user can make to an API or service within a given timeframe. AWS DynamoDB offers a scalable, serverless solution for implementing rate limiting without managing infrastructure. Below is a detailed guide with practical steps, code snippets, and commands.

You Should Know:

1. Setting Up DynamoDB for Rate Limiting

First, create a DynamoDB table to track request counts:

aws dynamodb create-table \
--table-name RateLimiter \
--attribute-definitions AttributeName=UserID,AttributeType=S \
--key-schema AttributeName=UserID,KeyType=HASH \
--billing-mode PAY_PER_REQUEST

2. Implementing the Rate Limiter Logic (Python)

Use AWS Lambda to check and update request counts:

import boto3
import time

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('RateLimiter')

def lambda_handler(event, context):
user_id = event['user_id']
limit = 100  Max requests per hour
window = 3600  Time window in seconds (1 hour)

response = table.get_item(Key={'UserID': user_id})
item = response.get('Item', None)

current_time = int(time.time())

if not item or (current_time - item['Timestamp'] > window):
 Reset count if window expired or new user
table.put_item(
Item={
'UserID': user_id,
'Count': 1,
'Timestamp': current_time
}
)
return {'status': 'OK', 'remaining': limit - 1}
elif item['Count'] < limit:
 Increment count
table.update_item(
Key={'UserID': user_id},
UpdateExpression='SET C = C + :incr, T = :time',
ExpressionAttributeNames={'C': 'Count', 'T': 'Timestamp'},
ExpressionAttributeValues={':incr': 1, ':time': current_time}
)
return {'status': 'OK', 'remaining': limit - item['Count'] - 1}
else:
return {'status': 'Rate limit exceeded', 'remaining': 0}

3. Deploying the Lambda Function

Package and deploy the Lambda function using AWS CLI:

zip lambda_function.zip lambda_function.py
aws lambda create-function \
--function-name RateLimiter \
--runtime python3.8 \
--handler lambda_function.lambda_handler \
--role arn:aws:iam::123456789012:role/lambda-execution-role \
--zip-file fileb://lambda_function.zip

4. Testing the Rate Limiter

Invoke the Lambda function to test:

aws lambda invoke \
--function-name RateLimiter \
--payload '{"user_id": "test_user"}' \
output.json
cat output.json

What Undercode Say:

DynamoDB’s serverless nature makes it ideal for scalable rate-limiting solutions. Key takeaways:
– No server management – DynamoDB scales automatically.
– Cost-effective – Pay only for what you use.
– High performance – Single-digit millisecond latency.

Additional useful commands:

  • Check DynamoDB table metrics:
    aws cloudwatch get-metric-statistics \
    --namespace AWS/DynamoDB \
    --metric-name ConsumedReadCapacityUnits \
    --dimensions Name=TableName,Value=RateLimiter \
    --start-time $(date -u +"%Y-%m-%dT%H:%M:%SZ" --date '-5 min') \
    --end-time $(date -u +"%Y-%m-%dT%H:%M:%SZ") \
    --period 60 \
    --statistics Sum
    
  • Force-delete a DynamoDB table:
    aws dynamodb delete-table --table-name RateLimiter
    

Expected Output:

A fully functional serverless rate limiter on AWS, scalable and cost-efficient.

Reference URL: How to Create a (Nearly) Free Serverless Rate Limiter on AWS

References:

Reported By: Darryl Ruggles – Hackers Feeds
Extra Hub: Undercode MoN
Basic Verification: Pass ✅

Join Our Cyber World:

💬 Whatsapp | 💬 TelegramFeatured Image