Amazon dynamodb API网关作为DynamoDB非代理集成,具有针对变量映射返回的集成响应

Amazon dynamodb API网关作为DynamoDB非代理集成,具有针对变量映射返回的集成响应,amazon-dynamodb,aws-api-gateway,api-gateway,vtl,Amazon Dynamodb,Aws Api Gateway,Api Gateway,Vtl,给定API网关中的AWS服务集成(DynamoDB),我想知道是否有一种方法可以动态解析DynamoDB结构化JSON并以标准JSON格式返回它,而无需独立的Lambda函数映射器?为了便于演示,这里有一个示例,其中两个可能的数据元素存在于我的DynamoDB表中,如果可能的话,我希望使用单个集成响应映射模板以标准JSON格式返回: 例1 例2 基于这两个示例,我们可以看到这些是嵌套的数据结构,它们共享顶级键,但嵌套层的数量可变 我在回答有关集成映射模板的所有问题时都注意到了以下内容,而不使用单

给定API网关中的AWS服务集成(DynamoDB),我想知道是否有一种方法可以动态解析DynamoDB结构化JSON并以标准JSON格式返回它,而无需独立的Lambda函数映射器?为了便于演示,这里有一个示例,其中两个可能的数据元素存在于我的DynamoDB表中,如果可能的话,我希望使用单个集成响应映射模板以标准JSON格式返回:

例1

例2

基于这两个示例,我们可以看到这些是嵌套的数据结构,它们共享顶级键,但嵌套层的数量可变

我在回答有关集成映射模板的所有问题时都注意到了以下内容,而不使用单独的Lambda函数来解析映射:

  • 解析“平面”DynamoDB数据的集成响应映射模板——例如,类似这样的情况,其中数据深度实际上为1,因为数据中的所有元素都是基本类型,如
    s
    N
  • 任何涉及更复杂数据类型(如
    M
    )的答案都假定问题作者毫无疑问知道DynamoDB表元素的确切外观。因此,他们会说“为每个层创建映射模板,并为该字段创建适当的预期返回类型。”使用示例1演示解决方案集成响应映射模板:
  • 现在,如果我们确实知道每个深度的预期DynamoDB结果字段是什么,以及每个表元素有多少层,也就是说,NoSQL表中的数据应该是结构化的,那么这是可行的?除非有某种版本的AppSync VTL解析器
    $util.dynamodb.toJSON
    方法可以有效地展开动态成形的dynamodb返回,否则有没有一种方法可以直接执行此操作而不必使用独立的Lambda函数?是否有一种方法可以概括响应映射模板,以考虑可变嵌套的
    M
    类型数据

    我的一个想法是循环所有键,并将
    M
    类型发送到第二个循环,但考虑到:

  • 理论上,展开深度嵌套对象所需的迭代次数(DynamoDB最多可支持32层,上次我检查过),以及
  • 表中元素之间嵌套的可变性
  • 对于第1点,
    #foreach
    对迭代次数有一个严格的限制:1000次


    我对非Lambda解决方案的前景表示怀疑,但仍然很好奇。想法?

    如果AWS不添加某种类型的util函数来提供帮助,它似乎是行不通的。任何你可能想到的东西,如果可能的话,都可能比lambda解决方案复杂得多。@JasonWadsworth我有点这样想,但仍然很好奇。我已经开始尝试两种不同的方法(每种方法都有缺点):1。在API网关中创建一个
    模型
    类型,然后让集成响应强制执行该类型——仍然有些不灵活,但如果我想避免Lambda调用或2,这是一个解决方案。让API网关调用一个AppSync端点,在该端点中可以强制执行flexbile模式,并且所有集成响应都只是在正确的JSON中传递——需要维护一个AppSync端点,并为所有调用增加一点周转时间。我问你为什么不想调用lambda?@JasonWadsworth当然。我正试图为我的初创公司创建一个开发者API,为批量用户提供付费墙,而AppSync并没有让这变得容易(额外的Lambda层需要考虑身份验证)。我想我应该使用API网关,并将其作为网关服务直接连接到我们的DynamoDB表。在某些情况下,返回是可变嵌套的,尽管DynamoDB集成太有限(因此
    util
    引用)。如果我不能使用集成服务,我只能使用Lambda集成,这对我来说,使得整个DynamoDB集成变得毫无意义。@JasonWadsworth老实说,我可能会把所有这些都复杂化了。如果AWS不添加某种util函数来帮助,这似乎是行不通的。任何你可能想到的东西,如果可能的话,都可能比lambda解决方案复杂得多。@JasonWadsworth我有点这样想,但仍然很好奇。我已经开始尝试两种不同的方法(每种方法都有缺点):1。在API网关中创建一个
    模型
    类型,然后让集成响应强制执行该类型——仍然有些不灵活,但如果我想避免Lambda调用或2,这是一个解决方案。让API网关调用一个AppSync端点,在该端点中可以强制执行flexbile模式,并且所有集成响应都只是在正确的JSON中传递——需要维护一个AppSync端点,并为所有调用增加一点周转时间。我问你为什么不想调用lambda?@JasonWadsworth当然。我正试图为我的初创公司创建一个开发者API,为批量用户提供付费墙,而AppSync并没有让这变得容易(额外的Lambda层需要考虑身份验证)。我想我应该使用API网关,并将其作为网关服务直接连接到我们的DynamoDB表。在某些情况下,返回是可变嵌套的,尽管DynamoDB集成太有限(因此
    util
    引用)。如果我不能使用集成服务,我就只能使用Lambda集成,对我来说,这使得整个DynamoDB集成变得毫无意义。@JasonWadsworth老实说,我可能会把这一切都复杂化了
    {
        "id": "1",
        "desc": "here's a string type at depth 1",
        "info": {
            "key1": "a string at depth 2"
        }
    }
    
    {
        "id": "2",
        "desc": "here's a string type at depth 1",
        "info": {
            "key1": "a string at depth 2"
            "key2": {
                "subkey1": "look, a string at depth 3"
            }
        }
    }
    
    {
        "param1": "some stuff",
        "param2": "other stuff"
    }
    
    #set($inputRoot = $input.path('$'))
    {
        "id": "$input.Item.id.S",
        "desc": "$input.Item.desc.S",
        "info": {
            "key1": "$input.Item.info.M.key1.S"
        }
    }