Kinesis Firehose лямбда-трансформация - PullRequest
0 голосов
/ 15 мая 2018

У меня есть следующая лямбда-функция как часть преобразования записи пожарного шланга Kinesis, которое преобразует запись msgpack из входного потока кинезиса в json.

Lambda Runtime: python 3.6

from __future__ import print_function

import base64
import msgpack
import json
print('Loading function')


def lambda_handler(event, context):
  output = []

  for record in event['records']:
    payload = msgpack.unpackb(base64.b64decode(record['data']), raw=False)

    # Do custom processing on the payload here
    output_record = {
        'recordId': record['recordId'],
        'result': 'Ok',
        'data': json.dumps(payload, ensure_ascii=False).encode('utf8')
    }
    output.append(output_record)

  print('Successfully processed {} records.'.format(len(event['records'])))
  return {'records': output}

Но лямбдавыдает следующую ошибку:

An error occurred during JSON serialization of response: b'
{
   "id": "d23fd47f-3a62-4383-bcb3-abdb913ea572",
   "timestamp": 1526358140730,
   "message": "Hello World"
}
' is not JSON serializable
Traceback (most recent call last):
File "/var/lang/lib/python3.6/json/__init__.py", line 238, in dumps
**kw).encode(obj)
File "/var/lang/lib/python3.6/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/var/lang/lib/python3.6/json/encoder.py", line 257, in iterencode
 return _iterencode(o, 0)
File "/var/runtime/awslambda/bootstrap.py", line 110, in 
decimal_serializer
raise TypeError(repr(o) + " is not JSON serializable")

Я что-то не так делаю?

Ответы [ 3 ]

0 голосов
/ 26 июля 2018

У меня есть лямбда-функция go-версии, выполняющая работу по преобразованию.

https://github.com/hixichen/golang_lamda_decode_protobuf_firehose

0 голосов
/ 19 декабря 2018

Мне удалось исправить это следующим образом:

import base64
import gzip
import io
import json
import zlib
def cloudwatch_handler(event, context):
  output = []
  for record in event['records']:
    compressed_payload = base64.b64decode(record['data'])
    uncompressed_payload = gzip.decompress(compressed_payload)
    print('uncompressed_payload',uncompressed_payload)
    payload = json.loads(uncompressed_payload)
    output_record = {
        'recordId': record['recordId'],
        'result': 'Ok',
        'data': base64.b64encode(json.dumps(payload).encode('utf-8')).decode('utf-8')
    }
    output.append(output_record)
  print('Successfully processed {} records.'.format(len(event['records'])))
  return {'records': output}

Это решение не требует включения модулей извне Python, таких как msgpack

0 голосов
/ 15 мая 2018

Мне удалось решить проблему.

Вот код, который работал для меня.

from __future__ import print_function

import base64
import msgpack
import json

print('Loading function')


def lambda_handler(event, context):
  output = []

  for record in event['records']:
    payload = msgpack.unpackb(base64.b64decode(record['data']), raw=False)

    # Do custom processing on the payload here
    output_record = {
       'recordId': record['recordId'],
       'result': 'Ok',
       'data': base64.b64encode(json.dumps(payload).encode('utf-8') + b'\n').decode('utf-8')
    }
    output.append(output_record)

    print('Successfully processed {} records.'.format(len(event['records'])))
    return {'records': output}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...