Firehose转换输出的格式

时间:2017-08-29 18:34:50

标签: amazon-web-services amazon-kinesis amazon-kinesis-firehose

我正在使用AWS Kinesis Firehose进行自定义数据转换。 Lambda用Python 3.6编写并返回如下所示的字符串:

{
    "records": [
        {
            "recordId": "...",
            "result": "Ok",
            "data": "..."
        },
        {
            "recordId": "...",
            "result": "Ok",
            "data": "..."
        },
        {
            "recordId": "...",
            "result": "Ok",
            "data": "..."
        }
    ]
}

这个Lambda非常高兴,在将它们返回到Firehose之前记录上面的输出。但是,Firehose的S3 Logs会显示错误:

Invalid output structure: Please check your function and make sure the processed records contain valid result status of Dropped, Ok, or ProcessingFailed.

看一下JS和Java在网络上传播的例子,我不清楚我需要采取哪些不同的做法;我很困惑。

3 个答案:

答案 0 :(得分:5)

如果您的数据是json对象,可以尝试按照

import base64
import json
def lambda_handler(event, context):
    output = []
    for record in event['records']:
        # your own business logic.
        json_object = {...} 
        output_record = {
            'recordId': record['recordId'],
            'result': 'Ok',
            'data': base64.b64encode(json.dumps(json_object).encode('utf-8')).decode('utf-8')
        }
        output.append(output_record)
    return {'records': output}

base64.b64encode函数仅适用于b'xxx'字符串,而output_record的'data'属性需要正常的'xxx'字符串。

答案 1 :(得分:4)

我使用Node.js发现了同样的错误。

阅读文档http://docs.aws.amazon.com/firehose/latest/dev/data-transformation.html我的错误不是每条记录的数据字段的base64编码。

我决定这样做:

{
    recordId: record.recordId,
    result: 'Ok',
    data: new Buffer(JSON.stringify(data)).toString('base64')
}

答案 2 :(得分:0)

您可以在我的仓库中查看代码。 https://github.com/hixichen/golang_lamda_decode_protobuf_firehose