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

时间:2017-05-15 23:41:54

标签: c# amazon-web-services aws-lambda aws-api-gateway

我有一个用.NET Core(C#)编写的简单Lambda函数,它使用APIGatewayProxyRequest对象来遍历所有请求属性。

如果我测试这个lambda函数(来自AWS Lambda),并传递一个包含基本信息的示例事件配置:

enter image description here

我可以这样得到这样的信息:

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");

如何从同一数据访问自定义上下文或授权者值:

enter image description here

我试过了:

logger.Logger.Log($"RequestContext Authorizor: {request.RequestContext.Authorizer}  \n");

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

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

event.requestContext.authorizer.customKey

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

2 个答案:

答案 0 :(得分:5)

所以,经过3天的故障排除并在AWS工程师的帮助下,这就是我发现的;

  • $context
  • 中通过.Net Core写入的Lambda函数访问$authorizercustom 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;
        .
        .
        .
    }