使用boto设置S3对象过期时间

19 投票
4 回答
18013 浏览
提问于 2025-04-17 16:26

我在想办法清理我的s3存储桶。我想删除所有超过X天的文件(在我的情况下,X是30天)。

但是我找不到删除s3中对象的方法。

我尝试了以下几种方法,但都没有成功(我说的没有成功是指,我在X天后尝试访问这些对象,结果s3还是能找到这些对象。我本来期待看到“对象未找到”或“对象已过期”的提示)

方法一:

    k = Key(bucket)
    k.key = my_key_name
    expires = datetime.utcnow() + timedelta(seconds=(10))
    expires = expires.strftime("%a, %d %b %Y %H:%M:%S GMT")
    k.set_contents_from_filename(filename,headers={'Expires':expires})

方法二:

    k = Key(bucket)
    k.key = "Event_" + str(key_name) + "_report"
    expires = datetime.utcnow() + timedelta(seconds=(10))
    expires = expires.strftime("%a, %d %b %Y %H:%M:%S GMT")
    k.set_meta_data('Expires', expires)
    k.set_contents_from_filename(filename)

如果有人能分享一下他们能成功删除s3对象的代码,那就太好了。

4 个回答

1

上面这个由 Vaulstein 写的 Python 脚本出现了一个“格式错误的 XML”异常。请把行末的多余的 "," 去掉,具体是 "'Status': 'Enabled'," 这一行的最后。

7

用户jamesis的回答使用了boto,这是一个旧版本,未来会被淘汰。现在支持的版本是boto3

对日志文件夹设置相同的过期策略可以这样做:

import boto3
from botocore.exceptions import ClientError

client = boto3.client('s3')
try:
    policy_status = client.put_bucket_lifecycle_configuration(
               Bucket='boto-lifecycle-test',
               LifecycleConfiguration={
                    'Rules': 
                           [
                             {
                             'Expiration':
                                {
                                 'Days': 30,
                                 'ExpiredObjectDeleteMarker': True
                                },
                             'Prefix': 'logs/',
                             'Filter': {
                               'Prefix': 'logs/',
                             },
                             'Status': 'Enabled',
                            }
                        ]})
except ClientError as e:
     print("Unable to apply bucket policy. \nReason:{0}".format(e))

这将覆盖logs上已有的生命周期配置策略。

在应用过期配置之前,最好先检查一下这个存储桶是否存在,以及你是否有权限访问它,也就是在try-except之前。

bucket_exists = client.head_bucket(
   Bucket='boto-lifecycle-test'
)

因为logs文件夹本身不是一个存储桶,而是存储桶boto-lifecycletest中的一个对象,所以这个存储桶可以有不同的过期策略。你可以通过policy_exists的结果来检查这一点,如下所示。

policy_exists = client.get_bucket_lifecycle_configuration(
    Bucket='boto-lifecycle-test')
bucket_policy = policy_exists['Rules'][0]['Expiration']

关于设置过期策略的更多信息,可以查看过期策略

17

你可以使用生命周期策略来删除那些在S3中存放超过X天的文件。比如说,假设你有这些文件:

logs/first
logs/second
logs/third
otherfile.txt

如果你想在30天后删除logs/文件夹下的所有内容,你可以这样设置:

import boto
from boto.s3.lifecycle import (
    Lifecycle,
    Expiration,
)

lifecycle = Lifecycle()
lifecycle.add_rule(
    'rulename',
     prefix='logs/',
     status='Enabled',
     expiration=Expiration(days=30)
)

s3 = boto.connect_s3()
bucket = s3.get_bucket('boto-lifecycle-test')
bucket.configure_lifecycle(lifecycle)

你还可以查看生命周期配置:

>>> config = bucket.get_lifecycle_config()
>>> print(config[0])
<Rule: ruleid>
>>> print(config[0].prefix)
logs/
>>> print(config[0].expiration)
<Expiration: in: 30 days>

撰写回答