【问题标题】:How to get a 'feed export' of the files in an S3 bucket如何获取 S3 存储桶中文件的“提要导出”
【发布时间】:2017-10-29 19:06:44
【问题描述】:

我想创建一个数据库,其中包含从 S3 存储桶中的文件中提取的数据。我希望数据库与存储桶的内容保持“同步”。

到目前为止,我想出的是创建一个 S3Processor 类来跟踪 processed_keys 并使用 list_objects 定期更新它们:

import time
import boto3
import schedule

BUCKET = "my-bucket"
MAX_ITEMS = 1                   # Limit the number of files iterated over (for debugging)
FILENAME = "/tmp/temp.txt"      # Name of a temporary file to be processed

class S3Processor(object):
    def __init__(self, processed_keys=[]):
        self.processed_keys = processed_keys

    def process_files(self):
        client = boto3.client('s3')
        paginator = client.get_paginator('list_objects')
        page_iterator = paginator.paginate(Bucket=BUCKET, PaginationConfig={'MaxItems': MAX_ITEMS})

        for page in page_iterator:
            for apk_object in page['Contents']:
                key = apk_object['Key']
                if key not in self.processed_keys:
                    client.download_file(Bucket=BUCKET, Key=key, Filename=FILENAME)
                    # Populate the database with information extracted from the file
                    self.processed_keys.append(key)

s3_processor = S3Processor()
schedule.every().day.do(s3_processor.process_files)

while True:
    schedule.run_pending()
    time.sleep(1)

定期重新运行是必要的,因为文件不断从不同的来源添加到 S3 存储桶。然而,这似乎不是一个优雅的解决方案,我正在考虑使用AWS Lambda Functions 来响应存储桶内容的变化。但是,我不清楚这样的 Lambda 函数是否也可以“追溯”存储桶中已经存在的文件。

简而言之,有没有一种方法可以更好地利用 AWS/Boto3 的现有功能?

【问题讨论】:

  • 将事件添加到触发 AWS Lambda 函数的存储桶将是一个优雅的解决方案,但它不会为 S3 存储桶中已有的对象创建事件。事件仅从那一刻开始生成。
  • @JohnRotenstein 您应该将此作为答案重新发布。您应该有一个一次性脚本,它将为所有现有对象和 s3 触发器追溯执行,该触发器将运行 lambda 函数。

标签: python amazon-web-services amazon-s3 aws-lambda boto3


【解决方案1】:

一个更优雅(和强大)的解决方案是:

  • 创建由 Amazon S3 存储桶中的Object Created 事件触发的 AWS Lambda 函数
  • 函数会自动传递上传对象的Bucket和Key
  • 函数读取对象并将信息添加到数据库中

这个事件只会在函数和事件创建之后触发。如果同时上传多个文件,它也可以并行运行。更好的是,如果什么都没有上传,那么什么都不会运行并且没有成本!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 2016-02-06
    • 2022-10-19
    • 2016-06-22
    相关资源
    最近更新 更多