问题 S3对象到期使用boto


我试图想办法清理我的s3水桶。我想删除超过X天的所有密钥(在我的情况下,X是30天)。

我无法找到一种删除s3中对象的方法。

我使用了以下方法,其中没有一个工作(通过工作,我的意思是我尝试在X天后获取对象,并且s3仍在服务对象。我期待“找不到对象”或“对象已过期”消息

方法1:

    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})

方法2:

    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对象,那将是非常好的


3012
2018-02-19 23:02


起源



答案:


您可以使用 生命周期政策 从s3中删除对象 超过X天。例如,假设你有这些 对象:

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

要在30天后过期日志/过期,你会说:

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>

14
2018-02-22 20:02



我试图对此进行测试,并想知道是否可以使用分钟/秒来测试到期时间。看起来天数= 1是可以使用的最短时间 - user2005798
无法使用分钟/秒。最短为0天,唯一的保证是AWS在第二天午夜UTC之前采取行动 PUT Bucket生命周期。 - MeSee
请将生命周期中的LifeCycle更改为生命周期,因为生命周期是正确的类名。 - AliBZ
有没有办法测试一个对象是否在特定的生命周期内? - 2rs2ts


答案:


您可以使用 生命周期政策 从s3中删除对象 超过X天。例如,假设你有这些 对象:

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

要在30天后过期日志/过期,你会说:

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>

14
2018-02-22 20:02



我试图对此进行测试,并想知道是否可以使用分钟/秒来测试到期时间。看起来天数= 1是可以使用的最短时间 - user2005798
无法使用分钟/秒。最短为0天,唯一的保证是AWS在第二天午夜UTC之前采取行动 PUT Bucket生命周期。 - MeSee
请将生命周期中的LifeCycle更改为生命周期,因为生命周期是正确的类名。 - AliBZ
有没有办法测试一个对象是否在特定的生命周期内? - 2rs2ts


答案是 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']

可以在以下位置查看有关设置过期策略的更多信息 到期政策


1
2017-10-26 18:09