python - 使用 2 个 SQS 订阅(每个订阅都有一个 lambda 触发器)向 SNS 主题发送消息会导致空队列

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

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

当我通过 SNS.publish 发送消息时,如下所示将消息发送到第二个 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 中何处发生静默错误,这令人沮丧。

最佳答案

我也遇到了同样的问题。请检查您是否在 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 上不会出现错误消息。 希望有帮助!

关于python - 使用 2 个 SQS 订阅(每个订阅都有一个 lambda 触发器)向 SNS 主题发送消息会导致空队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56487887/

相关文章:

python - 在 Windows 中显示资源管理器的文件属性对话框

node.js - 如何使用带有lambda函数的nodejs在aws s3存储桶中创建嵌套文件夹?

Python boto3-如何跨区域工作

python - 导入错误 : No module named 'boto3' : Ubuntu 14. 04

python - boto3 改变 AWS ec2 实例状态

python - 在 Python 数组中寻找最小值

Python:将嵌套列表转换为具有坐标位置的简单列表

python - 如何将从 csv 文件导入 python 的数据转换为时间序列?

python - modify_instance_attribute() 只接受关键字参数

python - 尝试从 s3 获取图像并打开图像时出现 OSError : cannot identify image file <_io. BytesIO 对象位于 0x00000198001B9E08>