【问题标题】:Getting SQS queue name or URL from ARN, or check a queue exists by ARN从 ARN 获取 SQS 队列名称或 URL,或通过 ARN 检查队列是否存在
【发布时间】:2018-09-10 13:15:20
【问题描述】:

AWS 文档一致指出,ARN 不应通过名称或 URL 以编程方式构建,因为这些字符串的构建方式不能保证在时间上保持不变。

我的问题是,在 SQS 上,GetQueueAttributes 返回的 RedrivePolicy 属性仅引用 ARN 的死信队列。

我目前正在编写一个服务来创建队列并设置它们,或者验证它们的设置是否正确(如果它们已经存在)。但我看不到如何验证死信队列 ARN 是否与现有队列匹配,除非我解析它以获取名称。有办法解决吗?

(实际上,公平地说,有一种方法可以尊重“不要以编程方式解析 ARN”规则,它包括调用 ListQueues 然后遍历生成的 URL,在每个 URL 上调用 GetQueueAttributes,但这听起来像大量的工作,如果帐户中有超过 1000 个队列,可能会失败,所以我不这样做)。

目前正在寻找 C# 中的解决方案,但问题与语言无关。

【问题讨论】:

    标签: c# amazon-web-services amazon-sqs


    【解决方案1】:

    在 C# 中,AWSSDK.Core 包中有一个解析器类,名为 Amazon.Arn

    它似乎是在 19 年 12 月的包的 3.3.104 版本周围添加的(来源 here)。因此,即使 ARN 并不意味着以编程方式构建,这似乎是在确定格式。

    现在要获取名称,知道 ARN 是队列的名称,可以使用 Arn.Parse(queueArn).Resource

    相反,可以创建一个新的 Arn 对象,然后对其调用 ToString() 以获取完整的 ARN。

    这当然可以针对随机 ARN 进行改进(Arn 对象包含的信息比作为服务的资源 sur 更多),并且对于任何资源类型都无法正常工作(例如,Resource 将返回 @987654329 @ 用于 SQS 订阅,rule/rule-name 用于 EventBridge 规则。

    有关 ARN 的更多信息here

    【讨论】:

      【解决方案2】:

      这是使用 ARN 获取队列 URL,

      queue_name = queue_arn.split(':')[-1]
      account_id = queue_arn.split(':')[-2]
      sqs_client = boto3.client('sqs')
      url = sqs_client.get_queue_url(
              QueueName=queue_name,
              QueueOwnerAWSAccountId=account_id
          )
      

      如果队列存在:

      try:
          queue = sqs_client.get_queue_by_name(QueueName=queue_name)
      except:
          print("Queue doesn't exist!")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-06
        • 2022-11-21
        • 2012-11-15
        • 1970-01-01
        • 2014-10-27
        • 1970-01-01
        • 1970-01-01
        • 2021-10-16
        相关资源
        最近更新 更多