Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用boto的S3对象过期_Python_Amazon S3_Boto - Fatal编程技术网

Python 使用boto的S3对象过期

Python 使用boto的S3对象过期,python,amazon-s3,boto,Python,Amazon 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

我在想办法清理我的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对象,那将非常好

您可以使用它从s3中删除对象 大于X天。例如,假设您有 对象:

要在日志/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>
>>config=bucket.get\u lifecycle\u config()
>>>打印(配置[0])
>>>打印(配置[0]。前缀)
日志/
>>>打印(配置[0]。过期)
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))
这将覆盖
日志上的任何现有生命周期配置策略

一个好办法是,在应用过期配置之前,即在
try except

bucket_exists = client.head_bucket(
   Bucket='boto-lifecycle-test'
)
由于
logs
文件夹本身不是一个bucket,而是bucket
boto-lifecycletest
中的一个对象,因此bucket本身可以具有不同的过期策略。 您可以从下面的
policy\u exists
中的结果中检查这一点

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

有关设置过期策略的详细信息,请参见

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

session=boto3.session(profile_name='my-aws-login-profile',region_name='ap-south-1'))
s3=会话资源('s3')
bucket\u lifecycle\u configuration=s3.BucketLifecycleConfiguration('my-s3bucket'))
尝试:
bucket\u lifecycle\u configuration.put(
生命周期配置={
“规则”:[
{
“到期日”:{
“天”:7天
},
“ID”:“日志文件夹的生命周期配置”,
“过滤器”:{
'前缀':'日志/',
},
“状态”:“已启用”,
“非当前版本支出”:{
“非当前日”:7
},
“中止完成多部分上载”:{
“Daysafterinition”:7
}
},
]
}
)
例外情况除外,如e:
打印电子邮件
出口(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>

日志文件夹的生命周期配置
日志/
启用
7.
7.
7.

我正在尝试测试这一点,想知道是否可以使用分钟/秒来测试过期时间。看起来天=1是可以使用的最短时间,没有使用分钟/秒的方法。最短是0天,唯一的保证是AWS it在第二天UTC午夜之前根据采取行动。请在中将生命周期更改为生命周期“从boto.s3.lifecycle导入生命周期"因为Lifecycle是正确的类名。是否有任何方法可以测试对象是否处于特定的生命周期中?您只需从@Vaulstein提交一个编辑请求以获取答案,或者将其添加为注释。这不应作为答案发布。我建议提交一个Editr。提交Editr时抛出一个错误“编辑必须至少包含6个字符”Equist。谢谢你的建议。然后把它作为一个评论添加到答案中会更合适。@mbbce他可能想这样做,但他必须有至少20(?)的声誉才能这样做。你知道,我遇到了无限循环。
<?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>