从ARN获取SQS队列名称或URL,或检查ARN是否存在队列

时间:2018-09-10 13:15:21

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

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

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

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

(实际上,公平地说,有一种方法可以遵循“不以编程方式解析ARN”的规则,该规则包括调用ListQueues,然后遍历每个URL上调用GetQueueAttributes的URL,但这听起来像是一件愚蠢的工作,并且如果帐户上的队列超过1000个,可能会失败,所以我不这样做。

当前正在寻找使用C#的解决方案,但该问题与语言无关。

2 个答案:

答案 0 :(得分:0)

这是使用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!")

答案 1 :(得分:0)

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

它似乎是在 19 年 12 月的 3.3.104 版软件包周围添加的(来源 here)。因此,即使 ARN 不打算以编程方式构建,这似乎也确定了格式。

现在了解名称,知道 ARN 是队列的名称,可以执行 Arn.Parse(queueArn).Resource

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

这当然可以针对随机 ARN 进行改进({​​{1}} 对象包含的信息比作为服务的资源 sur 多),并且对于任何资源类型(例如 Arn将为 SQS 订阅返回 Resource,或为 EventBridge 规则返回 queue-name:some-guid

可以找到有关 ARN here 的更多信息。