将消息发送到具有2个SQS订阅的SNS主题,每个订阅都有一个lambda触发器,将导致空队列

时间:2019-06-07 04:17:53

标签: python aws-lambda boto3 amazon-sqs amazon-sns

到目前为止,我已经设置了2个SQS订阅的SNS主题。每个SQS都有一个关联的Lambda触发器。

当我通过SNS发送消息时,请像这样发布以将消息发送到第二个SQS订阅:

response = sns.publish(
    TopicArn='arn:aws:sns:us-west-2:234723472:test',
    Message=json.dumps({'default': json.dumps({"c": code, "event_type": queuename})}),
    MessageAttributes={'event_type':{'DataType':'String', 'StringValue':queuename}
)

队列保持为空。

但是,当我直接向队列发送消息时,lambda触发器起作用。但是,一旦发送到SNS,消息似乎并不会越过。没有错误被触发。令人沮丧的是,SNS没有显示收到的消息日志,因此我不能在这里真正调试东西。

我可能会缺少什么?

我也尝试了是否使用上面的MessageStructure='json',没有什么区别。

不知道AWS中发生静默错误的地方令人沮丧。

1 个答案:

答案 0 :(得分:1)

我有同样的问题。请检查您是否在SQS上设置了权限,以便它可以接受来自SNS的消息。

示例:

# SQS Queue
MyQueue: 
  Type: AWS::SQS::Queue 
    Properties: 
      QueueName: MyQueue

# SNS Topic
MyTopic: 
  Type: AWS::SNS::Topic 
  Properties: 
    TopicName: MyTopic

# Topic Subscription 
MyTypicSubscription: 
  Type: AWS::SNS::Subscription 
    Properties: 
      Endpoint: !GetAtt MyQueue.Arn 
      Protocol: sqs 
      RawMessageDelivery: true 
      TopicArn: !Ref MyTopic 

#Permissions for SQS to receive SNS notifications 
MyQueuePermissions: 
  Type: AWS::SQS::QueuePolicy 
  Properties:  
    PolicyDocument: 
      Statement: 
        Effect: Allow 
        Principal: 
          AWS: '*' 
        Action: SQS:SendMessage 
        Resource: 
        - !GetAtt MyQueue.Arn 
        Condition: 
          ArnEquals:  
            aws:SourceArn: !Ref MyTopic 
    Queues:  
    - !Ref MyQueue 

在控制台中,它看起来像这样:

enter image description here

SNS服务通知其订户,但“不在乎”订户是否可用,因此SNS上没有错误消息。 希望有帮助!