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

AWS Lambda C#-访问自定义上下文,c#,amazon-web-services,aws-lambda,aws-api-gateway,C#,Amazon Web Services,Aws Lambda,Aws Api Gateway,我有一个用.NET内核(C#)编写的简单Lambda函数,它使用APIGatewayProxyRequest对象遍历所有请求属性 如果我测试此lambda函数(来自AWS lambda),并向其传递包含基本信息的示例事件配置: 我可以这样得到这些信息: public string FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) logger.Logger.Log($"Body: {r

我有一个用.NET内核(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工程师的帮助下,我发现了这一点

  • 从Lambda函数中访问
    $context
    $authorizer
    或任何其他
    自定义变量
    (通过.Net Core写入
    C
正在为此为AWS团队创建新的服务请求。

解释:

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

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

简言之:

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; }
公共字符串体{get;set;}
公共IDictionary头{get;set;}
公共字符串HttpMethod{get;set;}
公共bool IsBase64Encoded{get;set;}
公共字符串路径{get;set;}
公共IDictionary路径参数{get;set;}
公共IDictionary QueryStringParameters{get;set;}
公共ProxyRequestContext请求上下文{get;set;}
公共字符串资源{get;set;}
公共IDictionary阶段变量{get;set;}
基于对象,这将不允许访问自定义或“未知”属性,即使它们是有效负载的一部分

长话短说,从现在开始:如果您希望使用任何类型的自定义变量,您需要通过node(event)/python对其进行编码,或者可能覆盖对象中的现有属性

更新:

访问传入数据的整个有效负载有一个变通方法:

在此之前的一个解决办法是让Lambda函数接收System.IO.Stream而不是APIGatewayProxyRequest。然后您可以访问原始JSON,您可以自己解析。您可以从该JSON获取所需信息,然后将JSON反序列化为APIGatewayProxyRequest


我不知道今天人们是否还在想这个问题(在将近三年后,我是),我已经想出了一个办法。可能会有所帮助

注意:这仅适用于使用DotNet SDK构建的lambda

在AWS API G/W映射模板中,您需要创建一个与匹配的JSON模板,以便对其进行反序列化

{
    "Body": "$util.escapeJavaScript($input.body)",
    "RequestContext" : {
    "Identity" : {
        "SourceIp" : "$context.identity.sourceIp",
        "UserAgent" :  "$context.identity.userAgent"
    },
    "RequestId" : "$context.requestId"
}
}

现在,要在lambda中访问这些值,可以执行以下操作:

public async Task<SomeResponse> FunctionHandler(APIGatewayProxyRequest gatewayProxyRequest, ILambdaContext context)
    {
        var requestContext = gatewayProxyRequest.RequestContext;
        var sourceIP = requestContext?.Identity?.SourceIp;
        var body = gatewayProxyRequest.Body;
        .
        .
        .
    }
公共异步任务FunctionHandler(APIGatewayProxyRequest网关ProxyRequest,ILambdaContext上下文)
{
var requestContext=gatewayProxyRequest.requestContext;
var sourceIP=requestContext?.Identity?.sourceIP;
var body=gatewayProxyRequest.body;
.
.
.
}

Hmm这很奇怪,是的,所以在nodeJS中我只是简单地做了。event.requestContext.authorizer-你知道它是小写的“a”对-authorizer吗?是的,我理解,当使用node时。当使用APIGatewayProxyRequest对象时,根据名称空间和对象属性,它是大写的。似乎有一种非常不同的方法f根据使用的语言访问三个。仍然找不到通过C的方法#你看到了吗:-在这里吐痰,你能把requestContext转换成字符串并记录下来吗?是的,看到了,并且已经在项目中记录了一条评论。理想情况下我不想使用“temp”和自我声明的“dirty”获取这些信息的方法。我不明白为什么你可以简单地为node获取这些信息,但不是.Net core C#是的,这看起来很奇怪,但是AWS堆栈上很少有这样的信息,例如,我认为Cognito标识池中缺少了一些我认为即将出现的信息。很抱歉,我不能提供更多帮助-只在La上使用JSmbda!很高兴知道,这是令人惊讶的,它实际上不起作用!更新做得好。Java也有同样的问题:(