在AWS SNS中,当两个Lambda订阅同一个主题时,可能会导致重复消息的发送。解决此问题的方法是使用SNS提供的过滤器功能,对订阅进行过滤,确保每个Lambda只收到它所需的消息。
示例代码:
import boto3
sns = boto3.client('sns')
response = sns.create_topic(Name='test-topic')
topic_arn = response['TopicArn']
response = sns.publish( TopicArn= topic_arn, Message='Hello World!' )
import boto3
lambda_client = boto3.client('lambda') sns_client = boto3.client('sns')
def create_subscription(filter_policy):
lambda_name = 'lambda-test'
topic_arn = sns_client.create_topic(Name='test-topic')['TopicArn']
lambda_arn = lambda_client.get_function(FunctionName=lambda_name)['Configuration']['FunctionArn']
# Create Lambda subscription with filter policy
subscription = sns_client.subscribe(
TopicArn= topic_arn,
Protocol='lambda',
Endpoint= lambda_arn,
Attributes={
'FilterPolicy': filter_policy
}
)
print('Subscription created with filter policy:', filter_policy)
return subscription['SubscriptionArn']
lambda_1_filter_policy = {'test-path': ['foo']} lambda_1_subscription_arn = create_subscription(lambda_1_filter_policy)
lambda_2_filter_policy = {'test-path': ['bar']} lambda_2_subscription_arn = create_subscription(lambda_2_filter_policy)
import json
def lambda_handler(event, context): print('Lambda-1:', event) message = json.loads(event['Records'][0]['Sns']['Message'])
# Process only messages that match the filter policy
if message.get('test-path') == ['foo']:
print('Processing message:', message)
else:
print('Ignoring message:', message)