You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

发送消息至AWS SQS FIFO队列后无法接收,请求排查问题

排查AWS SQS FIFO队列消息接收失败问题

问题描述

学习AWS SQS时,已向FIFO队列发送1条消息,但接收端Lambda函数无法获取到消息,执行日志显示无消息返回。

发送端Lambda代码

XURL=quote(URL)
client = boto3.client('sqs')
url_fifo = 'https://sqs.xxxxxx.com/xxxxxx/que.fifo'
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
response = client.send_message(
    QueueUrl=url_fifo,
    MessageBody=f'URL: {XURL}, EventTime: {now}',
    MessageDeduplicationId=str(time.time_ns()),
    MessageGroupId='Group1'
)

接收端Lambda代码

name = 'que.fifo'
sqs = boto3.resource('sqs')
url_fifo = 'https://sqs.xxxxxx.amazonaws.com/xxxxxxx/que.fifo'
queue = sqs.get_queue_by_name(QueueName=name)
msg_list = queue.receive_messages(QueueUrl=url_fifo, MaxNumberOfMessages=1)
print(msg_list)

if msg_list:
    for message in msg_list:
        print(message.body)
        URL=message.body
        message.delete()
else:
    print("no message")

执行日志

2023-02-07T13:47:50.326+09:00   []
2023-02-07T13:47:50.326+09:00   no message

错误原因分析

  1. 队列URL不匹配:发送端使用的队列URL是https://sqs.xxxxxx.com/xxxxxx/que.fifo,接收端使用的是https://sqs.xxxxxx.amazonaws.com/xxxxxxx/que.fifo,两者域名、账号ID部分均不一致,说明发送和接收操作的是两个不同队列,自然无法接收到消息。
  2. 接收端方法参数错误:使用boto3.resource('sqs')获取队列对象后,调用receive_messages不需要传入QueueUrl参数——队列对象已经关联目标队列,额外传入该参数会导致逻辑冲突。

修复方案

方案1:统一队列URL并修正接收端参数

确保发送端和接收端使用完全一致的队列URL,同时移除receive_messages的QueueUrl参数:

name = 'que.fifo'
sqs = boto3.resource('sqs')
queue = sqs.get_queue_by_name(QueueName=name)
# 移除多余的QueueUrl参数
msg_list = queue.receive_messages(MaxNumberOfMessages=1)
print(msg_list)

if msg_list:
    for message in msg_list:
        print(message.body)
        URL=message.body
        message.delete()
else:
    print("no message")

方案2:改用boto3.client接收消息

若倾向客户端模式,可调整接收端代码如下:

sqs = boto3.client('sqs')
# 使用与发送端一致的队列URL
url_fifo = 'https://sqs.xxxxxx.com/xxxxxx/que.fifo'
response = sqs.receive_message(
    QueueUrl=url_fifo,
    MaxNumberOfMessages=1
)
msg_list = response.get('Messages', [])
print(msg_list)

if msg_list:
    for message in msg_list:
        print(message['Body'])
        # 删除消息需传入ReceiptHandle
        sqs.delete_message(
            QueueUrl=url_fifo,
            ReceiptHandle=message['ReceiptHandle']
        )
else:
    print("no message")

内容的提问来源于stack exchange,提问作者dlis168

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:40:30