有没有办法根据某些标签从 Amazon S3 下载对象?

Is there a way to download objects from Amazon S3 based on certain tags?

我正在尝试从 Amazon-S3 下载对象(文件),但我面临的问题是跟踪哪些对象已被下载,因为我在每个存储桶中都有很多对象,并且它们随着每个对象的增加而增加天。

我一直在寻找一种方法,以便我可以 set/unset 一些与每个对象关联的标签。因此,当我必须下载时,我可以查找所有未设置特定标签的对象,下载它们,然后设置它们的标签,以便下次再次下载。有办法吗?这样做的示例会有所帮助。

我正在使用 boto 通过 python 下载对象。我目前的代码基本上是下载我必须命名的单个对象。

from boto.s3.connection import S3Connection

conn = S3Connection( S3 Credentials )
bucket = conn.get_bucket (Bucket Name)
key = bucket.get_key(Object Name)
key.get_contents_to_filename(Local Object Path to Download)

更新代码: 我正在尝试使用 boto's copy() 函数将文件从一个目录复制到同一存储桶中的另一个目录。这是我当前的代码:

    conn = S3Connection( S3 Credentials )
    bucket = conn.get_bucket (Bucket Name)
    key = bucket.get_key(Object Name)
    key2= bucket.get_key(/new/dir/in_same_bucket/)
    key.get_contents_to_filename(Local Object Path to Download)
    key.copy(bucket.name, key2.name,metadata=None, preserve_acl=True)

当我这样做时,我得到错误 AttributeError: 'NoneType' object has no attribute 'name'。如何使用 copy()?

将文件从一个目录复制到同一存储桶中的另一个目录

您可以在上传对象时将任意元数据附加到 S3 对象,这样您就可以在最初上传文件时设置标签。但是还有两个问题需要克服:

  • 取消设置标签。 S3 不提供在创建对象后修改对象元数据的方法。但是,它确实为您提供了一种将对象复制回自身(所有服务器端)并修改元数据的方法。所以,它很笨重,但您可以在处理完对象后取消设置标签。
  • 查询标签。这是真正的问题。无法获得其元数据包含(或不包含)特定值的所有对象的列表。您将不得不不断地列出存储桶中的所有对象,以找到具有您的标签的对象。而且,更糟糕的是,标签不会返回到存储桶列表中。您必须对每个对象执行 HEAD 请求才能检索它的标签。

如果可以根据 LastModifiedDate 找到所有需要下载的对象,您可能会使用它。您仍然需要列出所有对象,但最后修改日期会在存储桶列表数据中返回,因此不需要 HEAD 请求。

或者,您可以使用 prefix 对对象进行排序。您可以使用 new/mynewobject 之类的名称将所有新对象上传到存储桶,然后获取具有 prefix=new 的所有对象的列表。下载对象后,您可以使用 COPY 操作 "move" 将对象从新文件夹中移出,这样您就不会再次处理它。

或者您可以使用像 DynamoDB 这样的数据库来帮助您跟踪事情。