【问题标题】:Change CSV file In S3 With AWS Lambda使用 AWS Lambda 在 S3 中更改 CSV 文件
【发布时间】:2018-06-01 19:22:53
【问题描述】:

有没有办法让每个用户的 dynamodb 行,用 csv 文件在 s3 中备份。

然后使用流,当一行发生突变时,在 csv 文件的 s3 中更改该行。

目前存在的 csv 阅读器旨在解析 csv 以在 lambda 中使用。

而我想找到一个特定的行,由流给出,然后用另一行替换它,而不必将整个文件加载到内存中,因为它可能很大。我想要在 s3 上备份的原因是因为将来我需要对其进行批处理并在短时间内从 dynamo 读取 300k 文件,这不是可取的。

【问题讨论】:

  • 您可以使用在 dynamodb 更新时触发的 lambda:docs.aws.amazon.com/amazondynamodb/latest/developerguide/…
  • @avigil 我遇到的问题是让 lambda 更新文件。作为从 s3 读取它的一种方式,找到该行并更新它。例如,我使用了 fast-csv,它只允许我解析行而不更新它。
  • 您需要读入 S3 对象的内容,对其进行解析并根据需要进行更新,然后用更新后的版本覆盖该对象。请参阅boto3 文档以了解 S3 putupload_fileobj
  • @avigil 我希望避免将整个文件读入 lambda,只更新一个文件
  • 很遗憾,如果您使用的是 S3,您将无法做到这一点。考虑切换到数据库以轻松进行增量更新。

标签: amazon-web-services amazon-s3 aws-lambda amazon-dynamodb


【解决方案1】:

从 S3 读取数据,使用您喜欢的库解析为 csv 并更新,然后写回 S3:

import io
import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')

with io.BytesIO() as data:
    bucket.download_fileobj('my_key', data)

    # parse csv data and update as necessary
    # then write back to s3

    bucket.upload_fileobj(data, 'my_key')

请注意,如果您希望这样做,S3 确实支持对象追加或更新 - 请参阅 here。您只能读取和覆盖。您在设计系统时可能会考虑到这一点。

【讨论】:

  • 这样的话,如果文件很大,我需要将整个文件读取并重写回s3吗?
  • 是的,但这是在 S3 中执行此操作的唯一方法。做很多小物件,不会有问题的。
猜你喜欢
  • 2015-03-21
  • 1970-01-01
  • 2017-01-29
  • 2020-02-06
  • 1970-01-01
  • 2018-09-13
  • 2018-09-16
  • 2018-08-29
  • 2020-02-09
相关资源
最近更新 更多