You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Amazon SNS按时间间隔发短信并限制用户发送频率?

AWS SNS Rate Limiting for SMS: What You Need to Know

Great question—you’re totally right to be skeptical of client-side restrictions since they’re trivial to bypass. Let’s break this down clearly:

Does AWS SNS have built-in API support for send intervals?

Nope, AWS SNS doesn’t include native rate-limiting for individual phone numbers or users. SNS is built as a reliable message delivery service, not a tool that tracks user-specific send history or enforces frequency constraints. Its publish API will process your requests as long as you call them, with no built-in checks for repeat sends to the same number.

So what’s the secure solution?

You’ll need to add a backend layer that tracks send times, using a database or cache to enforce your desired interval. This is the only way to guarantee the restriction can’t be worked around. Here are two solid approaches:

Option 1: Use a cache (like Redis) for fast, lightweight checks

Redis is ideal here because it’s blazingly fast and supports TTL (time-to-live) keys that automatically expire after your cooldown window. Here’s the workflow:

  • When a user requests to send an SMS, first check if a key exists in Redis for their phone number (e.g., sns_cooldown:+11234567890).
  • If the key exists, reject the request—they’re still in the cooldown period.
  • If the key doesn’t exist, call SNS’s publish API, then create the Redis key with a TTL equal to your desired interval (e.g., 60 seconds).

Option 2: Use a database (like DynamoDB or PostgreSQL) for persistent tracking

If you need to keep a long-term record of send history, a database works perfectly. The steps are:

  • Before sending, query the database for the user’s most recent send timestamp.
  • Calculate the time difference between now and that timestamp. If it’s less than your interval, reject the request.
  • If the interval is satisfied, send the SMS via SNS, then insert/update the user’s send timestamp in the database.

Example Python snippet (DynamoDB + SNS)

import boto3
from datetime import datetime, timedelta

# Initialize AWS clients
dynamodb = boto3.resource('dynamodb')
sns_client = boto3.client('sns')
sent_history_table = dynamodb.Table('sms_send_history')

def send_sms_safely(phone_number, message, cooldown_seconds=60):
    # Check if user is within cooldown
    response = sent_history_table.get_item(Key={'phone_number': phone_number})
    if 'Item' in response:
        last_sent = response['Item']['last_sent']
        if datetime.now() - last_sent < timedelta(seconds=cooldown_seconds):
            raise ValueError("Please wait before sending another message.")
    
    # Send the SMS via SNS
    sns_client.publish(
        PhoneNumber=phone_number,
        Message=message
    )
    
    # Update the send history in DynamoDB
    sent_history_table.put_item(
        Item={
            'phone_number': phone_number,
            'last_sent': datetime.now()
        }
    )

A quick note on client-side restrictions

Disabling buttons on the frontend is fine as a UX touch to guide users, but never rely on it for security. All rate-limiting logic must live on your backend (or a serverless function like AWS Lambda) where users can’t tamper with it.

内容的提问来源于stack exchange,提问作者Tiancheng Liu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:59:18