Я отправляю данные из Kinesis Firehose в функцию Lambda (которая в своей текущей тестовой форме не выполняет ничего, кроме декодирования и перекодирования полезной нагрузки), которая затем направляется на S3. Поток работает нормально, но файлы в S3 содержат только двоичный код в кодировке base64.
Вот толчок:
import boto3
import base64
client = boto3.client(
'firehose',
region_name = 'us-east-2'
)
push = {'id': '0142c979-e521-4e53-8bbe-1ac3281f0906', 'appId': 'b1fce1e293e4d0620041a76c6a70813c', 'deviceId': 'NEGL4CB15141K525', 'msgCode': 'location', 'type': 'keep', 'timestamp': 1561812470273, 'fields': {'location': [-73.9066, 40.682915]}}
string = json.dumps(push).encode()
payload = base64.b64encode(string)
client.put_record(
DeliveryStreamName='test'
,Record = {
'Data': payload
})
А вот и лямбда:
from __future__ import print_function
import json
import base64
def lambda_handler(event, context):
output = []
for record in event['records']:
#Kinesis data is base64 encoded so decode here
payload=base64.b64decode(record['data']).decode('utf-8')
print("Decoded payload: " + str(payload))
output_record = {
'recordId': record['recordId'],
'result': 'Ok',
'data': base64.b64encode(payload.encode('utf-8') + b'\n').decode('utf-8')
}
output.append(output_record)
print('Successfully processed {} records.'.format(len(event['records'])))
return {'records': output}
Я новичок в Firehose и довольно часто собираю воедино, какие учебники я могу найти в Интернете. Насколько я понимаю, это должно попасть в мой контейнер S3 как декодированный JSON, чтобы я мог запросить его с Афиной или чем-то еще, что я хотел бы сделать. Но файлы в моем ведре в конечном итоге закодированный (например eyJpZCI6ICIwMTQyYzk3OS1lNTIxLTRlNTMtOGJiZS0xYWMzMjgxZjA5MDYiLCAiYXBwSWQiOiAiYjFmY2UxZTI5M2U0ZDA2MjAwNDFhNzZjNmE3MDgxM2MiLCAiZGV2aWNlSWQiOiAiTkVHTDRDQjE1MTQxSzUyNSIsICJtc2dDb2RlIjogImxvY2F0aW9uIiwgInR5cGUiOiAia2VlcCIsICJ0aW1lc3RhbXAiOiAxNTYxODEyNDcwMjczLCAiZmllbGRzIjogeyJsb2NhdGlvbiI6IFstNzMuOTA2NiwgNDAuNjgyOTE1XX19)
Любая помощь с тем, что мне здесь не хватает, очень ценится.