【问题标题】:How can I decode a .gz file from S3 using an AWS Lambda function?如何使用 AWS Lambda 函数从 S3 解码 .gz 文件?
【发布时间】:2020-03-22 03:07:28
【问题描述】:

我让 AWS Config 每 12 小时将我的 AWS 系统的快照发送到 S3 存储桶。它们是以 .json.gz 格式存储的 JSON 文件,其中包含有关整个 AWS 系统的信息。在存储桶中创建对象时,会触发 Lambda 函数来读取该文件。我的计划是读取函数中的 JSON 信息,解析数据并创建描述 AWS 系统某些元素的报告,然后将这些报告推送到另一个 S3 存储桶。

我当前的代码是:

data = s3.get_object(Bucket=bucket, Key=key)
text = data['Body'].read().decode('utf-8')
json_data = json.loads(text)

我目前遇到的错误是:'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

我的猜测是这个错误是说 data['Body'] 中的某些字节不是 ASCII 字符。显然我无法使用标准 utf-8 解码,所以我想解压缩 .gz 文件。有没有办法做到这一点?我已经查看了 zipfile.py,但我无法真正收集有关我的用例的任何信息。谢谢。

【问题讨论】:

    标签: python json amazon-web-services utf-8 aws-lambda


    【解决方案1】:

    您是对的 - 您无法将其解码为文本。你会想要这样的东西:

    import io
    import gzip
    import json
    
    import boto3
    from urllib.parse import unquote_plus
    
    def handler_name(event, context): 
        s3client = boto3.client('s3')
        for record in event['Records']:
            bucket = record['s3']['bucket']['name']
            key = unquote_plus(record['s3']['object']['key'])
    
            response = s3client.get_object(Bucket=bucket, Key=key)
            content = response['Body'].read()
            with gzip.GzipFile(fileobj=io.BytesIO(content), mode='rb') as fh:
                yourJson = json.load(fh)
    

    然后您可以使用yourJson 变量来读取 JSON。

    【讨论】:

    • 这太棒了!太感谢了。我第一次插入时它就起作用了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    相关资源
    最近更新 更多