creating raw AWS log event

Larry Martell larry.martell at gmail.com
Thu Jun 24 13:38:28 EDT 2021


On Thu, Jun 24, 2021 at 12:20 AM Peter Otten <__peter__ at web.de> wrote:
>
> On 23/06/2021 19:42, Larry Martell wrote:
> > When an AWS cloudwatch event is passed to a consumer it looks like this:
> >
> > {
> >      "awslogs": {
> >           "data": "ewogICAgIm1l..."
> >       }
> > }
> >
> > To get the actual message I do this:
> >
> > def _decode(data):
> >      compressed_payload = b64decode(data)
> >      json_payload = zlib.decompress(compressed_payload, 16+zlib.MAX_WBITS)
> >      return json.loads(json_payload)
> >
> > message = _decode(json.dumps(event['awslogs']['data']))
> >
> > This returns the log message as a string.
> >
> > For my unit tests I need to reverse this - given a message as a string
> > I want to generate the compressed, encoded event structure.
> >
> > I have not been able to get this to work. I have this:
> >
> > message  = b'test message'
> > compressed= zlib.compress(message)
> > event['awslogs']['data'] = str(compressed)
> >
> > message = _decode(json.dumps(event['awslogs']['data']))
> > Traceback (most recent call last):
> >    File "<stdin>", line 1, in <module>
> >    File "<stdin>", line 3, in _decode
> > zlib.error: Error -3 while decompressing data: incorrect header check
> >
> > Anyone see how to make this work?
>
> The json/bas64 parts are not involved in the problem:
>
>  >>> zlib.decompress(zlib.compress(b"foo"), 16 + zlib.MAX_WBITS)
> Traceback (most recent call last):
>    File "<pyshell#4>", line 1, in <module>
>      zlib.decompress(zlib.compress(b"foo"), 16 + zlib.MAX_WBITS)
> zlib.error: Error -3 while decompressing data: incorrect header check
>
> whereas:
>
>  >>> zlib.decompress(zlib.compress(b"foo"))
> b'foo'
>
> Unfortunately compress() doesn't accept the flags you seem to require.
> However, reading around a bit in the zlib docs turns up the compressobj
> which does. So
>
>  >>> def mycompress(data):
>         obj = zlib.compressobj(wbits=16 + zlib.MAX_WBITS)
>         result = obj.compress(data)
>         result += obj.flush()
>         return result
>
>  >>> zlib.decompress(mycompress(b"foo"), 16 + zlib.MAX_WBITS)
> b'foo'

Thanks. Turns out I don't need this after all.


More information about the Python-list mailing list