【问题标题】:Fail AWS lambda in python without exception无一例外地在python中失败AWS lambda
【发布时间】:2021-01-22 05:31:53
【问题描述】:

我编写了一个小型 lambda 函数并将其连接到 API 网关。我添加了一个错误正则表达式来匹配 .*Error.* 并在 API 网关中返回状态 400。我面临的问题是,正则表达式似乎只有在 lambda 失败时才匹配,as this thread suggests

我的 lambda 函数:

import logging
import boto3
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    if int(event['event_id']) == 1:
        return {
            'statusCode': 200,
            "status": "success"
           }
    elif int(event['event_id']) == 2:
        return {
            'statusCode': 400,
            "status": "Error"
           }
    else:
        raise Exception("Error")

看起来案例 1 运行良好,默认返回状态 200。使用 event_id=3 它从 API Gateway 返回状态 400(数据中包含堆栈跟踪,我想避免这种情况),但使用 event_id=2 它返回状态 200 以及数据中的 Error 字符串。

如何在不引发异常的情况下将 lambda 标记为失败?

【问题讨论】:

  • 您不能人为地将 lambda 标记为失败。函数以任何方式干净地返回,都被认为是成功的。
  • @Marcin 谢谢。有没有办法让 api 网关不返回状态 200 而不会在 lambda 代码中引发异常?

标签: python amazon-web-services aws-lambda aws-api-gateway


【解决方案1】:

失败的 Lambda 意味着 Lambda 函数中的某些代码部分未能执行。在当前代码中只有第三条路径有这样的代码段(人为产生的异常)。

不可能在 Lambda 中执行所有代码部分并且仍然失败。

如果你想通过程序处理 API Gateway 返回状态码,你必须使用Lambda Integration。通过 Lambda 集成,您可能会返回如下响应:

{
    "statusCode": "400",
    body: json.dumps({ "error": "you messed up!" }),
    headers: {
        "Content-Type": "application/json",
    }
}

您将在 API 响应中获得 400。

【讨论】:

  • 它不起作用。我得到200 OK {"statusCode": "400", "body": "{\"error\": \"you messed up!\"}", "headers": {"Content-Type": "application/json"}}。即使我在 API Gateway 的集成响应中添加了 .*error.* 到 Lambda 错误正则表达式。我认为 API 网关甚至不会将其视为错误,除非引发异常,因此总是返回 200 OK
  • @Tomer,我已经测试过了,它按预期工作。您在创建方法时是否标记了Use Lambda Proxy integration
  • 你说得对,我错过了Use Lambda Proxy integration
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 2017-10-16
  • 2019-05-18
  • 1970-01-01
相关资源
最近更新 更多