Amazon web services 自动删除SQS队列

Amazon web services 自动删除SQS队列,amazon-web-services,amazon-sqs,Amazon Web Services,Amazon Sqs,是否有一种方法可以完全自动删除SQS队列。我有一个解决方案,服务器在启动时创建一个SQS并订阅SNS主题 但是,可能存在服务器崩溃且无法恢复的情况。在这种情况下,我将用另一台服务器替换服务器,该服务器将在启动时创建自己的队列。现在,前面的队列将不再使用 有没有一种方法可以让队列自动删除,同时我去显式删除它(可能像队列保持空5天,它会自动删除或其他替代方法)?目前,AWS SQS没有提供一种机制,在队列空了一定天数时自动删除队列。甚至我都觉得这是一个必要的功能。但有办法解决这个问题 下面提到的是根

是否有一种方法可以完全自动删除SQS队列。我有一个解决方案,服务器在启动时创建一个SQS并订阅SNS主题

但是,可能存在服务器崩溃且无法恢复的情况。在这种情况下,我将用另一台服务器替换服务器,该服务器将在启动时创建自己的队列。现在,前面的队列将不再使用


有没有一种方法可以让队列自动删除,同时我去显式删除它(可能像队列保持空5天,它会自动删除或其他替代方法)?

目前,AWS SQS没有提供一种机制,在队列空了一定天数时自动删除队列。甚至我都觉得这是一个必要的功能。但有办法解决这个问题

下面提到的是根据您问题中的场景删除AWS SQ的几种方法。你可以选择最适合你的

  • 维护一个小的数据库表,该表保持服务器IP和队列URL之间的映射。当服务器自行启动时,可以在此表中插入值。维护一个Cloudwatch规则,该规则将调用Lambda,该规则将遍历表中的值,以查看服务器是否正在运行(可能是通过心跳)。如果某个特定服务器没有运行,只需获取相关的SQS URL,然后删除该特定队列即可。(我在这里推荐Lambda是因为它很便宜)
  • deleteQueue(新的DeleteQueueRequest(myQueueUrl))

  • 每当服务器启动时,它都可以使用SNS向具有服务器IP和SQS URL的人发送电子邮件。使用CloudWatch规则,不时调用Lambda,获取所有实例,并检查是否有实例关闭。如果某个实例已关闭,请使用SNS向相关人员发送电子邮件,并通过电子邮件告知此服务器已关闭。它是半自动的,用户可以在看到电子邮件后手动删除队列

  • 只需让空队列独立运行即可。AWS中可以生成的队列数量没有限制。那么,如果这个过程很困难,为什么还要费心删除它们呢。只需在进行过程中创建新队列。(见:)


  • 没有自动删除队列的方法。您可以使用标记来标记已连接的资源(即,在创建时标记队列或具有各自实例id的其他资源),并使用一个简单的脚本来读取所述标记,如果该实例id不存在,则将其删除

    以下是如何在cli上执行此操作:


    (我假设服务器指的是EC2实例。也可以使用Ip)

    考虑使用CloudFormation部署SQS队列、SNS主题、EC2实例以及此工作负载所需的任何其他内容。当您决定启动新服务器时,因为您已检测到旧服务器存在问题,只需删除旧的CloudFormation堆栈并创建一个新的堆栈。如果我正确理解了您的答案:在这种情况下,我甚至不需要手动删除旧的CloudFormation堆栈。您已指示必须替换现有服务器。这大概是一个有人工干预的明确决定。我的意思是用一个删除旧堆栈并创建新堆栈的过程(在一个步骤中)替换该过程。如果你真的不想这样做,那么你可以在新的EC2实例上放置一个启动时脚本(在userdata中),它可以删除旧部署的剩余部分(基于标记,或者其他一些确定需要删除的内容的方法)。另一种选择是使用自动缩放来确保你总是有一个,并且只有一个,健康的服务器。正确设置运行状况检查,自动伸缩将杀死不健康的服务器,并启动一个新服务器(使用相同的SQS队列和SNS主题)。将其包装在CloudFormation模板中以便于部署。不确定为什么每次启动EC2实例时都要创建一个新队列——难道不会有丢失消息的风险吗?自动集成测试就是一个队列清理有用的例子。我的测试希望在自己的沙箱中工作,但由于各种原因,测试结束时的清理代码并不总是运行。理想情况下,队列的配置会导致它们在一段合理的时间后过期,正如OP所建议的那样。