【问题标题】:What should the mapping template look like for AWS Firehose PutRecordBatch in API Gateway?API Gateway 中 AWS Firehose PutRecordBatch 的映射模板应该是什么样的?
【发布时间】:2019-08-02 11:30:46
【问题描述】:

我已经成功设置了一个 API,它使用 PutRecord 使用这些说明(https://aws.mannem.me/?p=1152 - 注意:它说不安全但我仍然点击了,因为我需要它)。

我正在尝试为 PutRecordBatch 设置一个 API(基本上允许一次写入多个记录),但我不断收到

{ "__type": "序列化异常" }

根据数小时的研究,当传入的 API 调用格式与集成请求中注明的映射模板不匹配时,API 网关会引发该错误。我正在努力弄清楚如何修复我的映射模板。

这是我的映射模板:

{
    "StreamName": "$input.path('DeliveryStreamName')",
    "Records": [
           #foreach($elem in $input.path('$.Records'))
              {
                "Data": "$util.base64Encode($elem.Data)",
              }#if($foreach.hasNext),#end
            #end
        ]
}

这是我要发送的测试数据:

{
    "DeliveryStreamName": "test",
    "Records": [{
        "Data": "SampleDataStringToFirehose"
    },
    {
        "Data": "SampleDataStringToFirehose2"
    }]
}

【问题讨论】:

    标签: amazon-web-services aws-api-gateway amazon-kinesis-firehose


    【解决方案1】:

    太笨了,但是映射模板有一个错误:末尾有一个额外的逗号

    "数据": "$util.base64Encode($elem.Data)",

    这是导致问题的原因。下面是正确的版本:

    {
        "DeliveryStreamName": "$input.path('$.DeliveryStreamName')",
        "Records": [
               #foreach($elem in $input.path('$.Records'))
                  {
                    "Data": "$util.base64Encode($elem.Data)"
                  }#if($foreach.hasNext),#end
                #end
            ]
    }
    

    【讨论】:

      【解决方案2】:

      你的例子对我帮助很大,所以我想补充它,以防万一其他人遇到我的具体情况。

      在我的例子中,我需要发送一个 JSON 对象而不是一个简单的字符串,类似于:

      {
         "DeliveryStreamName": "test",
         "Records": [{
             "Data": {"foo": "bar", "count": 321}
          },
          {
             "Data": {"foo1": "bar1", "count": 10}
          }]
      }
      

      在这种情况下,我在您的示例中使用模板时发生的情况是对象以非 JSON 格式存储,不适合进一步分析。

      通过对模板的简单调整,您可以存储格式正确的 JSON 对象:

      {
          "StreamName": "$input.path('DeliveryStreamName')",
          "Records": [
                 #foreach($elem in $input.path('$.Records'))
                    {
                      #set($jsonPath = "$.Records[$foreach.index].Data")
                      "Data": "$util.base64Encode($input.json($jsonPath))"
                    }#if($foreach.hasNext),#end
                  #end
           ]
      }
      

      【讨论】:

        猜你喜欢
        • 2021-04-20
        • 2020-09-28
        • 2017-11-30
        • 1970-01-01
        • 2018-12-04
        • 2018-02-03
        • 1970-01-01
        • 2018-01-20
        • 2016-01-21
        相关资源
        最近更新 更多