【发布时间】:2021-11-26 10:08:47
【问题描述】:
我有一个简单的用例,我将消息插入标准 SQS 队列并通过 api 调用返回消息。 我向 sqs 队列发送了几条消息,触发了如下所示的 lambda 函数:
import json
import requests
def lambda_handler(event, context):
print('start')
resp = requests.get("http://fe35-103-210-33-254.ngrok.io/receive-message").json()
print(resp)
print('end')
return {
'status':200,
'message':resp
}
该函数调用一个api,它基本上接收消息并在返回后将其删除
@app.get('/receive-message')
def receive_message():
client = boto3.resource('sqs')
queue = client.get_queue_by_name(QueueName='transactions')
messages = queue.receive_messages(QueueUrl=queue.url, WaitTimeSeconds=10, MaxNumberOfMessages=10, VisibilityTimeout=60)
context = []
for message in messages:
context.append(message.body)
queue.delete_messages(QueueUrl=queue.url, Entries=[{'Id':message.message_id,'ReceiptHandle':message.receipt_handle}])
print(context)
return ','.join(context)
这是我在终端上返回的输出
←[33mWARNING←[0m: WatchGodReload detected file change in '['C:\\Work\\payments\\sqs_poc.py']'. Reloading...
←[32mINFO←[0m: Started server process [←[36m46472←[0m]
←[32mINFO←[0m: Waiting for application startup.
←[32mINFO←[0m: Application startup complete.
['hello']
[]
[]
[]
[]
[]
[]
[]
[]
[]
['pqr']
[]
[]
[]
[]
[]
['Testing']
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
['pqr']
←[32mINFO←[0m: 13.127.17.123:0 - "←[1mGET /receive-message HTTP/1.1←[0m" ←[32m200 OK←[0m
这是 lambda 测试执行的输出
Response
{
"errorMessage": "2021-10-06T08:12:36.466Z aff8f3ac-683d-40cc-b80e-92d18ec2c9f1 Task timed out after 10.01 seconds"
}
Function Logs
START RequestId: aff8f3ac-683d-40cc-b80e-92d18ec2c9f1 Version: $LATEST
start
END RequestId: aff8f3ac-683d-40cc-b80e-92d18ec2c9f1
REPORT RequestId: aff8f3ac-683d-40cc-b80e-92d18ec2c9f1 Duration: 10010.58 ms Billed Duration: 10000 ms Memory Size: 128 MB Max Memory Used: 19 MB
2021-10-06T08:12:36.466Z aff8f3ac-683d-40cc-b80e-92d18ec2c9f1 Task timed out after 10.01 seconds
另外,有没有一种方法可以让我在队列为空时获取整个队列并停止轮询?
【问题讨论】:
-
为什么不延长超时时间?
-
@Marcin 我添加了 20 秒的超时。还是一样
-
我认为将超时设置为 20 秒会导致 20 秒后超时?如果是这样,听起来 Lambda 函数无法到达网络位置并且在等待响应时超时。例如,它可能无法访问
ngrok.io站点。您可以添加一些调试print()语句来确认这是挂起的位置。如果是这样,您的函数可能无法访问 Internet。 问题:您的函数是否连接到 VPC?如果是这样,为什么? (尝试断开它,看看是否有帮助!)
标签: amazon-web-services aws-lambda amazon-sqs fastapi