在 AWS Lambda Boto3 中编写 Gzip 文件

Writing Gzip Files in AWS Lambda Boto3

我在 AWS Lambda 上使用 Boto3 来处理数据流并将内容发布到 s3 中的文件以进行下游处理。在这种情况下,数据可以是简单的原始 json。

我想使用 zlib 将压缩的 gzip 数据存储到 S3。理论上这很简单。但是,当我使用以下命令上传 gzip 文件时,我的本地计算机说该文件不是 gzip 格式。

有人可以帮忙解释一下这是怎么回事吗?这应该是微不足道的。对于它的价值,当我读取其他程序生成的压缩文件时,zlib.decompress 需要 , 16+zlib.MAX_WBITS 作为 wbits 参数才能正确读取压缩字符串。也许我需要 zlib.compress 等价物?

import json
import zlib
import boto3
s3 = boto3.resource('s3')

def lambda_handler(event, context):
    ## Sample dataset
   data = [{"var":1, "foo": "bar"}, {"var":2, "foo":"baz"}]
   payload = '\n'.join([json.dumps(r) for r in data]).encode('utf-8')

    ## Upload
    output = s3.Object("bucket", "file")
    output.put(Body=zlib.compress(payload))

    ## Download and verify
    obj = s3.Object("bucket", "file")

    ## Load the Streaming object body, decompress, decode
    # , 16+zlib.MAX_WBITS
    decompressed = zlib.decompress(obj.get()['Body'].read(), 16+zlib.MAX_WBITS).decode('utf-8').split("\n")
    print(f"Decompressed payload: {payload}")
    data2 = [json.loads(r) for r in decompressed]

    return {
        "statusCode": 200,
        "TestVerification?": data2==data,
        "body": json.dumps('Demo')
    }

稍后,将文件下载到本地:

zcat testcompressed.gz

gzip: testcompressed.gz: not in gzip format

是的,您需要 zlib.compress 等效项。但是,没有一个。您需要使用 zlib.compressobj,它有一个 wbits 参数。