【问题标题】:SQS Lambda function returns "Task timed out after 10.01s"SQS Lambda 函数返回“任务在 10.01 秒后超时”
【发布时间】: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


【解决方案1】:

检查 lambda 角色是否有权从 SQS 队列中读取。 Task timed out error 主要来自缺少访问权限。

【讨论】:

  • 我已将 - AmazonSQSFullAccess、AmazonSQSReadOnlyAccess、CloudWatchLogsFullAccess、AWSLambdaBasicExecutionRole 添加到策略中
  • SQS 队列中的访问策略呢?
  • 我猜它设置为默认策略。
  • 您应该编辑它以允许 lambda 函数的角色访问 SQS 队列。
猜你喜欢
  • 2022-01-24
  • 2021-05-30
  • 2021-05-14
  • 2020-06-18
  • 2018-05-15
  • 2018-08-08
  • 2020-11-06
  • 2020-10-11
  • 2018-02-15
相关资源
最近更新 更多