繁体   English   中英

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

[英]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");

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

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

event.requestContext.authorizer.customKey

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

因此,在花了 3 天的时间对此进行故障排除并在 AWS 工程师的帮助下,这就是我的发现;

  • 从 Lambda 函数访问$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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM