[英]AWS Lambda C# - Accessing custom context
我有一个用 .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 工程师的帮助下,这就是我的发现;
$context
、 $authorizer
或任何其他custom variables
存在限制,这些custom variables
是通过C#
.Net Core 编写的为此,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; }
基于对象,这将不允许访问自定义或“未知”属性,即使它们是有效负载的一部分。
长话短说,截至目前:如果您希望使用任何类型的自定义变量,则需要通过 node(event) / python 对其进行编码,或者可能覆盖APIGatewayProxyRequest对象中的现有属性。
更新:
有一种解决方法可以访问传入数据的整个有效负载:
在此之前的解决方法是让您的 Lambda 函数接收 System.IO.Stream 而不是 APIGatewayProxyRequest。 然后您可以访问您可以自己解析的原始 JSON。 您可以从该 JSON 中获取所需的信息,然后也可以将 JSON 反序列化为 APIGatewayProxyRequest。
我不知道人们是否在今天(在将近 3 年后 - 我是)想知道这个问题,我想出了一个方法。 可能会有所帮助。
注意:这仅适用于使用 DotNet SDK 构建的 lambda。
在 AWS API G/W 映射模板中,您需要创建一个与ApiGatewayProxyRequest 类匹配的 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;
.
.
.
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.