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");
包括它的不同属性( StringKey
, PrincipleId
等)
从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。