API Gateway 中 AWS Firehose PutRecordBatch 的映射模板应该是啥样的?

Posted

技术标签:

【中文标题】API Gateway 中 AWS Firehose PutRecordBatch 的映射模板应该是啥样的?【英文标题】: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"
    ]

【问题讨论】:

【参考方案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
     ]

【讨论】:

以上是关于API Gateway 中 AWS Firehose PutRecordBatch 的映射模板应该是啥样的?的主要内容,如果未能解决你的问题,请参考以下文章

AWS API Gateway:用户匿名无权执行 API

在 AWS 中运行 spring boot 应用程序并且只允许通过 AWS API Gateway 访问

从 API Gateway 获取 terraform 中 AWS lambda 的端点

AWS API Gateway + AWS Lambda 中的 CORS

AWS API Gateway:API 密钥的最佳实践

响应未定义 - aws-api-gateway-client