AWS文档一致指出,不应通过名称或URL来以编程方式构造ARN,因为不能保证这些字符串的构造方式在时间上是恒定的。
我的问题是,在SQS上,GetQueueAttributes返回的RedrivePolicy属性仅通过ARN引用死信队列。
我当前正在编写服务来创建队列并进行设置,或者如果队列已经存在,请验证其设置是否正确。但是我看不到验证死信队列ARN与现有队列匹配的方法,除非我进行解析以获取名称。有办法解决吗?
(实际上,公平地说,有一种方法可以遵循“不以编程方式解析ARN”的规则,该规则包括调用ListQueues,然后遍历每个URL上调用GetQueueAttributes的URL,但这听起来像是一件愚蠢的工作,并且如果帐户上的队列超过1000个,可能会失败,所以我不这样做。
当前正在寻找使用C#的解决方案,但该问题与语言无关。
答案 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 的更多信息。