代码之家  ›  专栏  ›  技术社区  ›  Pavel Ryvintsev

如何找出哪台机器继续从SQS队列读取和删除消息

  •  3
  • Pavel Ryvintsev  · 技术社区  · 9 年前

    我有一个SQS队列和几个从中读取数据的机器。尽管我已经关闭了所有这些消息,但仍有人在读消息并从队列中删除消息。

    有没有办法找到从SQS队列读取消息的机器的ip号。

    谢谢

    2 回复  |  直到 9 年前
        1
  •  2
  •   JaredHatfield    9 年前

    不,您无法获取正在执行这些操作的IP或EC2实例,但您可以采取一些步骤来尝试缩小消耗消息的范围。


    CloudTrail仅将以下操作记录到SQS:

    • 添加权限
    • 创建队列
    • 删除队列
    • 清除队列
    • 删除权限
    • 设置队列属性

    这意味着消息的消费者没有被记录,这意味着CloudTrail无法为您回答这个问题。

    您可以做的是使用IAM控制台尝试并隔离哪个用户或角色正在访问SQS服务。这不会将其缩小到单个队列,但总比什么都没有要好。你可以在 Access Advisor 选项卡检查每个用户/角色是否使用SQS。

    如果这不足以缩小范围,那么您可能不得不向SQS队列添加策略,以开始阻止用户/角色从该特定队列获取消息。这将是一场猜测和检查的游戏。或者,您可以锁定队列,以便只有特定用户或角色可以从队列中读取。

    如果您使用此队列的跨帐户访问,则上述步骤将没有那么有用,因为您将没有相同级别的可见性。此外,如果您具有由许多不同的服务器或应用程序使用的相同角色或用户,则此方法也将不起作用。如果是这样的话,这将是开始应用最小特权的好时机,因为它可以帮助解决这些类型的问题。

        2
  •  0
  •   Misha Bruml    5 年前

    您可以在消息消费应用程序中编写一个程序来运行此处的一些查询 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html 然后将实例ID记录到某个您知道可以获取的位置。

    但是,如果您不知道在哪里部署此代码(因为您不知道使用消息的机器/组),这是多余的。

    我可以建议在SQS管理控制台中手动创建一条消息(队列操作>发送消息),并创建该消息,以便您知道消费者应用程序将抛出错误(即格式错误或其他错误)。然后搜索错误的相关位置-这将有望让您检测出是哪台机器抛出了错误。