【发布时间】:2021-07-28 14:05:32
【问题描述】:
我正在尝试从不同区域的 lambda 向 SQS 队列发送消息。队列 url 确实有区域信息,所以我只是想这样做:
import boto3
sqs = boto3.client('sqs')
response = sqs.send_message(
QueueUrl="https://sqs.us-west-1.amazonaws.com/ACCOUNT_ID/OtherRegionQueue",
MessageBody=msg_str
)
我的 lambda 在“us-east-1”中,我发现它正在尝试访问该区域中的 SQS,而不是 QueueUrl 参数中指定的“us-west-1”,可能是因为客户端( ) 如果未指定,则从配置中获取区域。
经过一些小测试后,send_message() 似乎完全忽略了 QueueUrl 部分,除了协议和队列名称。
我成功地将消息发送到与 lambda 相同区域的另一个队列,其 url 如下:
QueueUrl="https:SameRegionQueue"
是否可以将消息发送到其他区域的队列而无需创建每个区域的客户端?
【问题讨论】:
-
您能分享一下您的 SQS 政策吗?
-
起初我只允许 sqs 区域,错误是因为它试图访问 lambda 区域而不是 url 中的区域。我的资源政策是:
Resource: "arn:aws:sqs:*" -
您想创建一个适用于每个地区的单一客户端吗?
-
是的,我希望从文档中 send_message 将使用完整的 QueryUrl 参数,而不仅仅是队列的名称。我现在的解决方法是向客户端添加 'region_name' kwarg,使用正则表达式从 url 中提取区域...
-
您是否使用了 lambda 函数,如果是,您也可以在 lambda 处理程序中创建客户端,在此之前您可以从 url 中提取区域并在创建客户端时传递它。
标签: python amazon-web-services aws-lambda boto3 amazon-sqs