AWS Lambda C# - 访问自定义上下文

Hex*_*xie 4 c# amazon-web-services aws-lambda aws-api-gateway

我有一个用.NET Core(C#)编写的简单Lambda函数,它使用该APIGatewayProxyRequest对象遍历所有请求属性.

如果我测试这个lambda函数(来自AWS Lambda),并传递一个包含基本信息的示例事件配置:

在此输入图像描述

我可以这样得到这样的信息:

public string FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)
        logger.Logger.Log($"Body: {request.Body}  \n");
        logger.Logger.Log($"Path: {request.Path}  \n");
        logger.Logger.Log($"Resource: {request.Resource}  \n");
Run Code Online (Sandbox Code Playgroud)

我怎么能从相同的数据访问自定义上下文或授权者值:

在此输入图像描述

我试过了:

logger.Logger.Log($"RequestContext Authorizor: {request.RequestContext.Authorizer}  \n");
Run Code Online (Sandbox Code Playgroud)

包括它的不同特性(StringKey,PrincipleId等等)

从Node.js看来,这可以通过使用这个简单地实现:

event.requestContext.authorizer.customKey
Run Code Online (Sandbox Code Playgroud)

C#中没有这样的东西?

Hex*_*xie 7

因此,经过3天的故障排除并在AWS工程师的帮助下,这就是我发现的;

  • 存在与访问的限制$context,$authorizer或任何其它custom variables从lambda函数,通过净核心在书面C#

正在为AWS团队创建一个新的服务请求.

解释:

目前,在node.js中,您可以访问传递给Lambda函数(在event参数内)的整个数据有效负载,其中包括所有自定义变量(您可以直接访问它 - 对于问题示例,如下所示:event.requestContext.authorizer.customKey.

这与C#等价物不同 - 它在Lambda函数中使用APIGatewayProxyRequest请求对象.因此,尽管您可以在C#中访问节点内的整个有效负载(包括所有自定义变量),但您只能访问APIGatewayProxyRequest对象.其属性可在此处找到:

或者简而言之:

public string Body { get; set; }
public IDictionary<string, string> Headers { get; set; }
public string HttpMethod { get; set; }
public bool IsBase64Encoded { get; set; }
public string Path { get; set; }
public IDictionary<string, string> PathParameters { get; set; }
public IDictionary<string, string> QueryStringParameters { get; set; }
public ProxyRequestContext RequestContext { get; set; }
public string Resource { get; set; }
public IDictionary<string, string> StageVariables { get; set; }
Run Code Online (Sandbox Code Playgroud)

基于对象,这将不允许访问自定义或"未知"属性,即使它们是有效载荷的一部分.

简而言之,截至目前:如果您希望使用任何类型的自定义变量,您可能需要通过node(event)/ python编写代码,或者可能覆盖APIGatewayProxyRequest对象中的现有属性.

更新:

有一种方法可以访问所有数据的有效负载:

到目前为止,解决方法是让Lambda函数接受System.IO.Stream而不是APIGatewayProxyRequest.然后您可以访问您可以自己解析的原始JSON.您可以从该JSON获取所需的信息,然后将JSON反序列化为APIGatewayProxyRequest.