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

我有一个用.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"); 

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

在此处输入图像描述

我试过了:

 logger.Logger.Log($"RequestContext Authorizor: {request.RequestContext.Authorizer} \n"); 

包括它的不同属性( StringKeyPrincipleId等)

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

 event.requestContext.authorizer.customKey 

在C#中没有这样的东西?

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

  • C#通过.Net Core写入的Lambda函数访问$context$authorizer或任何其他custom variables是有限制的

正在为此AWS团队创建新的服务请求。

解释:

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

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

或者简而言之:

 public string Body { get; set; } public IDictionary Headers { get; set; } public string HttpMethod { get; set; } public bool IsBase64Encoded { get; set; } public string Path { get; set; } public IDictionary PathParameters { get; set; } public IDictionary QueryStringParameters { get; set; } public ProxyRequestContext RequestContext { get; set; } public string Resource { get; set; } public IDictionary StageVariables { get; set; } 

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

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

更新:

有一种方法可以访问进来的数据的整个有效负载:

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