Lambda中与API Gateway代理集成的错误处理

4
据我所知,当使用Lambda代理集成时,必须返回statusCodebody才能向HTTP客户端返回任何有意义的错误信息。
以下是我的Python代码:
import json
import traceback

def lambda_handler(event, context):

    try:
        result = business_logic()        
        return {
            'statusCode': 200,
            'body': json.dumps(result)    
        }

    except Exception as e:
        error = {
            "type": e.__class__.__name__,
            "message": str(e),
            "traceback": traceback.format_exc()
        }
        return {
            'statusCode': 502,
            'body': json.dumps(error)
        }

我的问题是,我想利用Lambda和Cloudwatch的便捷监控界面(例如,能够触发Lambda错误),但由于Lambda在此代码中处理所有错误并返回值,因此我认为Lambda的错误率为0%。

是否有另一种方法仍然使用代理集成并传递错误信息?

2个回答

0

这有点混乱,但由于Lambda负责代码中的错误处理(响应代码/等等),它可能还必须负责创建指标。

您可以通过SDK简单生成指标,例如:

def handler(event: Dict[str, Any], context: LambdaContext) -> Dict:
    try:
        raise Exception( "")
    except Exception:
        client = boto3.client('cloudwatch')
        response = client.put_metric_data(Namespace=‘my_namespace’, MetricData=[
            {
                'MetricName': f”my_metric",
                'Value': 1,
                'Timestamp': time.time()
            }
        ])
        return ResponseUtil.build_exception_response(logger)

0

我认为如果你想检查指标,最好检查API Gateway的CloudWatch而不是Lambda的。

除非你真的非常想要使用Lambda的CloudWatch来监视错误,否则你可能需要通过非代理集成来实现。


1
API Gateway 的 Cloudwatch 的问题在于,据我所知它没有区分资源级别性能的细粒度。似乎您只能获得整个 API 的错误率,因此如果没有将第三方解决方案(例如 Sentry.io)集成到您的 lambda 函数中,您就没有简单的方法来知道哪些 API 资源具有升高的故障率。 - davegravy
这很有道理。您可以选择不使用代理集成,使用正常的集成并调整映射模板,以便至少对那些讨厌的2xx http状态进行控制。 - Francis Zabala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接