creating raw AWS log event
Larry Martell
larry.martell at gmail.com
Thu Jun 24 16:28:18 EDT 2021
On Thu, Jun 24, 2021 at 10:38 AM Larry Martell <larry.martell at gmail.com> wrote:
>
> 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.
Well I did need this after all and this works perfectly. Thanks so much!
More information about the Python-list
mailing list