元数据中的时间戳记后的S3 boto3列表键

时间:2018-09-25 15:07:49

标签: amazon-web-services amazon-s3 boto3

我需要列出在某个时间戳记之后使用boto3修改过的S3存储桶中的所有键。

我做了这些功能,但是对于具有多个键的存储桶而言,性能却很慢。

s3 = boto3.resource('s3',
         aws_access_key_id=s3_cred.ACCESS_KEY,
         aws_secret_access_key= s3_cred.SECRET_KEY)

my_bucket = s3.Bucket(BUCKET_NAME)

def meta_df(bucket):
    key = []
    ts = []
    for o in bucket.objects.all():
        key.append(o.key)
        ts.append(o.last_modified)
    return pd.DataFrame({'key':key,'ts':ts})


def get_after_timestamp(bucket,ts):
    df = meta_df(bucket)
    df = df[df['ts']>ts]
    return df['key'].tolist()

get_after_timestamp(my_bucket,'2018-09-24 13:39:00')

是否可以通过boto3或更高效的方式来做到这一点?

1 个答案:

答案 0 :(得分:1)

一种选择是使用Amazon S3 Inventory,它可以提供Amazon S3存储桶中对象的每日列表。

因此,您只需要解析列表,而不用进行API调用来列出对象。但是,列表最多只能每天列出一次,因此这取决于您是否需要最新信息。

更新

由于您要每5分钟扫描50万个对象,因此需要采用不同的方法。这是因为扫描这么多文件(每个API调用一次只能检索1000个对象)会很慢而且效率低。

相反,您应该:

  • 在存储桶上创建一个 S3事件,每当上载新对象时,该事件就会触发Lambda函数
  • Lambda函数将对象的详细信息存储在数据库中(例如DynamoDB)
  • 不是每隔5分钟扫描一次S3,而是向数据库查询对象列表

一些例子是: