我有一个用.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#中没有这样的东西吗?
答案 0 :(得分:5)
所以,经过3天的故障排除并在AWS工程师的帮助下,这就是我发现的;
$context
$authorizer
,custom variables
或任何其他C#
是有限制的
正在为此AWS团队创建新的服务请求。
解释:
目前,在node.js中,您可以访问传递给Lambda函数的整个数据有效负载(在event
参数内),其中包括所有自定义变量(您可以直接访问它 - 用于问题示例,如下所示:event.requestContext.authorizer.customKey
。
这与C#等价物不同 - 它使用Lambda函数中的APIGatewayProxyRequest请求对象。因此,尽管您可以在C#中访问节点内的整个有效负载(包括所有自定义变量),但您只能访问APIGatewayProxyRequest对象。可以找到here的属性:
或简而言之:
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; }
基于对象,这将不允许访问自定义或“未知”属性,即使它们是有效负载的一部分。
长话短说,截至目前:如果您希望使用任何类型的自定义变量,您可能需要通过node(event)/ python编写代码,或者可能覆盖{{3}中的现有属性对象。
<强>更新强>
有一种方法可以访问所有数据的有效负载:
到目前为止,解决方法是让您的Lambda函数接受System.IO.Stream而不是APIGatewayProxyRequest。然后您可以访问您可以自己解析的原始JSON。您可以从该JSON中获取所需的信息,然后将JSON反序列化为APIGatewayProxyRequest。
答案 1 :(得分:0)
我不知道人们是否还在想知道这一点,即使在今天(近三年后-我当时),我也想出了办法。可能会有帮助。
注意:这仅适用于使用DotNet SDK构建的lambda。
在AWS API G / W映射模板中,您需要创建一个与ApiGatewayProxyRequest class匹配的JSON模板,以便可以对其进行反序列化。在下面的示例中,我尝试从请求中提取主体,并从请求的上下文中提取源ip和用户代理。
{
"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;
.
.
.
}