【问题标题】:AWS Lambda function Python script Task timed out errorAWS Lambda 函数 Python 脚本任务超时错误
【发布时间】:2021-12-06 19:58:42
【问题描述】:

我尝试使用 Lambda 函数连接到 RDS postgresql 数据库。 Lambda 函数返回超时错误。 这是源代码。

postgres_test.py:

import sys
import logging
import psycopg2

from db_util import make_conn, fetch_data
def lambda_handler(event, context):
    query_cmd = "SELECT COUNT(*) FROM users"
    # print query_cmd

    # get a connection, if a connect cannot be made an exception will be raised here
    conn = make_conn()

    result = fetch_data(conn, query_cmd)
    conn.close()

    return result

db_util.py:

import psycopg2

db_host = "db_host"
db_port = 5432
db_name = "db_name"
db_user = "db_user"
db_pass = "db_pass"
db_table = "db_table"


def make_conn():
    conn = None
    try:
        conn = psycopg2.connect("dbname='%s' user='%s' host='%s' password='%s'" % (db_name, db_user, db_host, db_pass))
    except:
        print ("I am unable to connect to the database")
    return conn


def fetch_data(conn, query):
    result = []
    print ("Now executing: " + query)
    cursor = conn.cursor()
    cursor.execute(query)

    raw = cursor.fetchall()
    for line in raw:
        result.append(line)

    return result

这里是执行结果:

Test Event Name
triggers3event

Response
{
  "errorMessage": "2021-10-19T22:55:12.543Z 207db48f-eb82-4bbd-afd5-1836b63874cf Task timed out after 3.00 seconds"
}

Function Logs
START RequestId: 207db48f-eb82-4bbd-afd5-1836b63874cf Version: $LATEST
END RequestId: 207db48f-eb82-4bbd-afd5-1836b63874cf
REPORT RequestId: 207db48f-eb82-4bbd-afd5-1836b63874cf  Duration: 3003.71 ms    Billed     Duration: 3000 ms    Memory Size: 128 MB Max Memory Used: 12 MB  
2021-10-19T22:55:12.543Z 207db48f-eb82-4bbd-afd5-1836b63874cf Task timed out after 3.00 seconds

Request ID
207db48f-eb82-4bbd-afd5-1836b63874cf

请帮助我解决以下问题。 我不确定上面的代码出了什么问题。

【问题讨论】:

    标签: python postgresql aws-lambda amazon-rds


    【解决方案1】:

    通常 Lambda 函数超时的原因是安全组的配置。

    为了纠正,请遵循以下建议:

    1. 检查Lambda和对应的db服务是否在同一个VPC

    2. 检查安全组是否允许连接

    3. 如果您通过互联网连接数据库,请检查连接。 (如果您在 VPC 中,请查看您正在通过 NAT 和 IG 进行路由)

    再次重申一次,那么多次,超时问题是由于网络允许/拒绝,所以在 Lambda 的情况下,安全组问题。

    【讨论】:

    • 听起来不错。 db 和 lambda 不在同一个 VPC 中,在这种情况下,如何使用我的 lambda 函数访问 db? @Shashikant
    • 您好,一种连接方式是使用 VPC 对等互连,这样两个 VPC 都已连接,您的 Lambda 可以访问您的数据库,这是 AWS 关于 VPC 对等互连的文档 (docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html) 第二种方法,(它会有点贵)是,通过在 Lambda 中使用 NAT 和 IG 将数据库公开并通过互联网访问。
    【解决方案2】:

    您的代码连接和检索数据可能只需 3 秒以上,因此您的 Lambda 函数会超时。您的默认设置为 3 秒,您可以在 CloudWatch Logs 中看到):

    任务在 3.00 秒后超时

    增加 Lambda 的超时时间和配置的 RAM 大小(这将按比例为 Lambda 函数提供更多 CPU 并使其运行更快)并重试。

    如果这也失败了,那么问题可能是您的 Lambda 函数没有到 RDS 数据库的网络路由。没有路由会导致数据库连接尝试挂起和 Lambda 函数超时。

    根据您在下面的 cmets 中提供的信息,看起来 RDS 数据库实际上是在不同的 AWS 账户中运行,但可以公开访问。这表明您的 Lambda 函数可能配置不正确。如果您不需要 Lambda 函数在 VPC 中运行,则不要将其配置为在 VPC 中运行 - 请参阅 Lambda 函数 VPC configuration options 并删除子网分配。

    【讨论】:

    • 在哪里可以增加超时和 RAM 大小?
    • 他们是 Lambda 函数上的configured。如果您在 Lambda 控制台中手动创建它,则在此处更改配置。如果您使用了无服务器部署工具,则返回到您的 Lambda 函数模板,对其进行修改并重新部署。
    • lambda 函数似乎默认为如此低的超时时间(3 秒)有点烦人,但我绝对理解它背后的原因。在大多数实际情况下,您可能希望设置 1-2 分钟的超时时间,并注意这不会影响您的计费金额(当然,除非您的任务运行那么长时间)。
    • 错误编写或配置的 Lambda 函数将需要更长的时间才能失败,花费更多的钱,并且可能会让平台的新手更加恼火。也就是说,真正的解决方案是自动化。您可以在无服务器部署工具配置中自动执行所需的设置。
    • @rv.kvetch Lambdas 的初衷是快速且非常快速地触发函数。尽管它们能够在多核的情况下运行长达 15 分钟,但它们最初的设计意图是快速启动和低开销/成本。因此默认设置以这种方式排列。您应该不再使用控制台来创建资源,而是开始使用 SAM、Cloudformation 或 CDK,以便更好、更精细地控制您的资源 - 并能够在启动时定义所有这些设置跨度>
    猜你喜欢
    • 2021-10-17
    • 2017-09-20
    • 2019-11-06
    • 2017-10-05
    • 2019-06-02
    • 2018-07-11
    • 2017-07-22
    • 1970-01-01
    相关资源
    最近更新 更多