从 .net lambda 返回非 200 Http 状态 - 不使用 API 网关

Return a non-200 Http Status from a .net lambda - without an API Gateway

提问人:Darren Oakey 提问时间:9/7/2023 最后编辑:Jeremy ThompsonDarren Oakey 更新时间:9/8/2023 访问量:73

问:

我正在尝试使用 amazon.lambda.core 从 .net 返回其他 http 状态代码 - 我尝试将其作为处理程序:

    public async Task<string> Handler(string input, ILambdaContext context)
    {
        await Task.FromResult(0);
        throw new AmazonLambdaException(Json.Serialize(new { error = "Your specific error message" }), ErrorType.Sender,
            "Bad Request", "abc", HttpStatusCode.BadRequest);
    }

但是当我从例如python客户端应用程序调用它时 - 我得到:

响应 =

 {'RequestId': 'xxx', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Thu, 07 Sep 2023 07:29:09 GMT', 'content-type': 'application/json', 'content-length': '1053', 'connection': 'keep-alive', 'x-amzn-requestid': 'xxxx', 'x-amz-function-error': 'Unhandled', 'x-amzn-remapped-content-length': '0', 'x-amz-executed-version': '$LATEST', 'x-amzn-trace-id': 'root=xxx;sampled=1;lineage=xxx:0'}, 'RetryAttempts': 0}, 'StatusCode': 200, 'FunctionError': 'Unhandled', 'ExecutedVersion': '$LATEST', 'Payload': <botocore.response.StreamingBody object at 0x0000021A6B813100>}

我想改变的关键是状态码 200 - 可能吗?

注意 - 这张图片中不涉及 api 网关 - 只有一件事直接对 lambda 函数进行 http 调用(尽管在这种情况下我从 boto3 调用它)

C# .NET aws-lambda http-status-codes

评论


答:

0赞 Jeremy Thompson 9/7/2023 #1

我认为正在发生的事情是,从客户端的角度来看,调用执行正常,但在内部失败,您实际上没有返回任何东西!您只需在运行在小型容器中的 Lambda 中抛出一个错误。

查看文档 APIGatewayProxyResponse,他们返回以下内容:

var response = new APIGatewayHttpApiV2ProxyResponse
        {
            StatusCode = (int)HttpStatusCode.OK,
            Body = "Hello AWS Serverless",
            Headers = new Dictionary<string, string> { { "Content-Type",
"text/plain" } }
            };
            
            return response;
    }

所以你可以做这样的事情:

public async Task<APIGatewayProxyResponse> Handler(APIGatewayProxyRequest request, ILambdaContext context)
{
    if (1 == 1) 
    {
        return new APIGatewayProxyResponse
        {
            StatusCode = 400,
            Body = "Something Bad happened with the request",
            Headers = new Dictionary<string, string> { { "Content-Type", "application/json" } }
        };
    }
}

您应该会在 Lambda 的 CloudWatch 日志中获得一些提示(即您抛出的异常)。

更新

如果没有涉及 API GW(我一开始没有完全注意到),并且您返回了一个 ,那么只需执行 Python 或 Node 所做的操作:string

import json

def lambda_handler(event, context):
    return {
        'statusCode': 400,
        'body': json.dumps('BadRequest')
    }

enter image description here

控制台有点误导,看看它在这里是如何失败的,并且没有返回 400。状态显示只有两种状态:“成功”和“失败”。有了 API,GW HTTP 概念就发挥了更大的作用。

enter image description here

评论

0赞 Darren Oakey 9/8/2023
很酷 - 会尝试 - 谢谢!
0赞 Darren Oakey 9/8/2023
是的 - 不幸的是 - 没有全部工作 - 它只是附带了序列化 APIGonegentialProxyResponse 的有效负载......但状态代码为 200。注意 - 我直接调用 lambda - 不使用 api 网关。在这种情况下,API 网关不是一个选项
0赞 Jeremy Thompson 9/8/2023
我试了一下,我想我理解了这个问题 - 从另一个服务调用 Lambda,你想知道它是否失败,要回答你原来的问题,如果没有 API GW,就不可能从 200 更改状态码,你必须根据屏幕截图解析文本/json 响应。不是理想的解决方案。
0赞 Darren Oakey 9/9/2023
是的 - 不幸的是 - 问题是 - 我们控制 lambda - 但我们控制消费者 - 他们只是直接对我们进行 lambda 调用 - 他们总是说“哦,你成功了吗?