17

我试图找出一种方法来清理我的 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

4 回答 4

15

您可以使用生命周期策略从 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>
于 2013-02-22T20:02:11.817 回答
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']

有关设置过期策略的更多信息,请查看过期策略

于 2017-10-26T18:09:15.890 回答
1
session = boto3.Session(profile_name='my-aws-login-profile', region_name='ap-south-1')
s3 = session.resource('s3')
bucket_lifecycle_configuration = s3.BucketLifecycleConfiguration('my-s3bucket')
    try:
        bucket_lifecycle_configuration.put(
            LifecycleConfiguration={
                'Rules': [
                    {
                        'Expiration': {
                            'Days': 7
                        },
                        'ID': 'life cycle config for log folder',
                        'Filter': {
                            'Prefix': 'logs/',
                        },
                        'Status': 'Enabled',
                        'NoncurrentVersionExpiration': {
                            'NoncurrentDays': 7
                        },
                        'AbortIncompleteMultipartUpload': {
                            'DaysAfterInitiation': 7
                        }
                    },
                ]
            }
        )
    except Exception as e:
        print e.message
        exit(1)

解析的 XML 响应:

<?xml version="1.0" encoding="UTF-8"?>
<LifecycleConfiguration>
   <Rule>
      <ID>life cycle config for log folder</ID>
      <Filter>
         <Prefix>logs/</Prefix>
      </Filter>
      <Status>Enabled</Status>
      <Expiration>
         <Days>7</Days>
      </Expiration>
      <NoncurrentVersionExpiration>
         <NoncurrentDays>7</NoncurrentDays>
      </NoncurrentVersionExpiration>
      <AbortIncompleteMultipartUpload>
         <DaysAfterInitiation>7</DaysAfterInitiation>
      </AbortIncompleteMultipartUpload>
   </Rule>
</LifecycleConfiguration>
于 2019-11-16T10:27:29.157 回答
1

Vaulstein的上述 python 脚本引发了格式错误的 XML 异常。请删除“ 'Status': 'Enabled', ”行末尾多余的“ , ”。

于 2019-02-27T18:28:15.703 回答