Rails AWS-SDK:设置对象的到期日期

时间:2014-01-31 17:00:20

标签: ruby-on-rails amazon-s3

在我的Rails应用程序中,我允许用户将图像直接上传到S3,这会创建一个临时文件,在将图像记录保存到数据库中后会自动删除。

我不想在保存记录后自动删除图像,而是想在S3上设置文件的截止日期,以便在一段时间(比如24小时)后自动删除。

我看过有关如何在存储桶上设置过期日期的文档(http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/BucketLifecycleConfiguration.html),但我只想让存储桶中的某个文件夹自动删除文件。

有没有人有关于如何做的建议?

s3 = AWS::S3.new(:access_key_id => ENV['AWS_ACCESS_KEY_ID'], :secret_access_key => ENV['AWS_ACCESS_KEY'])
foldername = @image.s3_filepath.split("/")[5]
folder_path = 'uploads/' + foldername
s3.buckets[ENV['AWS_BUCKET']].objects.with_prefix(folder_path).each( #set expiration date header here)

4 个答案:

答案 0 :(得分:2)

您可以在存储桶本身上设置生命周期配置,而不是每个单独的对象。使用其余的api,你只需写出一个xml配置(prefix有一个字段,让你只将这个生命周期配置应用于那些以它为前缀的密钥)并将PUT应用到存储桶中。 / p>

将其转换为ruby SDK,看起来示例 正在做你想要的事情; add_rule的第一个参数似乎是前缀。

答案 1 :(得分:0)

虽然您在存储桶上设置了生命周期,但您不能直接在存储桶对象上设置它。您需要使用AWS :: S3 :: BucketLifecycleConfiguration类。这里有更多关于如何管理生命周期的内容:

http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/BucketLifecycleConfiguration.html

答案 2 :(得分:0)

您现在可以在存储桶中指定文件夹或前缀,以缩小生命周期规则。

enter image description here

答案 3 :(得分:0)

我正在努力解决您所遇到的同一问题,而且看起来rails应用程序的AWS文档对于如何通过write方法发送此参数没有太多说法。您可以在此处找到一些链接,说明如何将文件上传到S3存储桶AWS SDK for RubyUpload an Object Using the AWS SDK for Ruby

使用适用于Ruby的AWS开发工具包 - 版本1

#!/usr/bin/env ruby

require 'rubygems'
require 'aws-sdk'

bucket_name = '*** Provide bucket name ***'
file_name = '*** Provide file name ****'

# Get an instance of the S3 interface.
s3 = AWS::S3.new

# Upload a file.
key = File.basename(file_name)
s3.buckets[bucket_name].objects[key].write(:file => file_name)
puts "Uploading file #{file_name} to bucket #{bucket_name}."

这对我来说也是一个很好的来源Amazon S3: Cache-Control and Expiry Date difference and setting trough REST API,但他仍然没有提到如何设置过期日期,或者那里的任何答案或链接。

所以我浏览了代码本身的文档(我使用了aws-sdk-v1 gem),我在这里Method: AWS::S3::S3Object#write找到了所有可能允许我们配置上传的选项S3对象,但有两个似乎是为了相同的目的:

  • :metadata(Hash) - 要包含在对象中的元数据的哈希值。这些将作为前缀为x-amz-meta的标头发送到S3。每个名称,值对都必须符合US-ASCII。
  • :expires(String) - 对象不再可缓存的日期和时间。

所以我开始查看我应该配置哪一个,我在这里Set content expires and cache-control metadata for AWS S3 objects with Ruby找到了我要找的东西:

require 'rubygems'
require 'aws-sdk'

s3 = AWS::S3.new(
  :access_key_id => 'your_access_key',
  :secret_access_key => 'your_secret_access_key')

bucket = s3.buckets['bucket_name']

one_year_in_seconds = 365 * 24 * 60 * 60
one_year_from_now = Time.now + one_year_in_seconds

# for a new object / to update an existing object
o = bucket.objects['object']
o.write(:file => 'path_to_file', 
    :cache_control => "max-age=#{one_year_in_seconds}", 
    :expires => one_year_from_now.httpdate)

# to update an existing object
o.copy_to(o.key, 
    :cache_control => "max-age=#{one_year_in_seconds}", 
    :expires => one_year_from_now.httpdate)

这就是我为配置过期日期和缓存控制所做的工作,以下是适用于我正在处理的应用的代码:

one_year_in_seconds = 365 * 24 * 60 * 60
files.each do |path, s3path|
  #puts "Uploading #{path} to s3: #{File.join(prefix, s3path)}"
  s3path = File.join(prefix, s3path) unless prefix.nil?
  one_year_from_now = Time.now + one_year_in_seconds
  bucket.objects[File.join(s3path)].write(
    :file => path,
    :acl => (public == true ? :public_read : :private),
    :cache_control => "max-age=#{one_year_in_seconds}",
    :expires => one_year_from_now.httpdate
  )
end

同样在http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html,您可以找到必要的支持,帮助我完成配置expirescache_control而非元数据的决定:

  • Cache-Control max-age指令允许您指定在CloudFront再次从源服务器获取对象之前,您希望对象保留在缓存中的时间长度(以秒为单位)。 CloudFront支持的最短到期时间为Web分发为0秒,RTMP分发为3600秒。最大值为100年。按以下格式指定值: 缓存控制:max-age =秒 例如,以下指令告诉CloudFront将关联对象保留在缓存中3600秒(一小时): 缓存控制:max-age = 3600 如果您希望对象在CloudFront边缘缓存中保留的持续时间与保留在浏览器缓存中的持续时间不同,则可以将Cache-Control max-age和Cache-Control s-maxage指令一起使用。有关更多信息,请参阅指定CloudFront为Web分发缓存对象的时间量。

  • Expires头字段允许您使用RFC 2616,超文本传输​​协议 - HTTP / 1.1第3.3.1节,完整日期中指定的格式指定到期日期和时间,例如: 2015年6月27日星期六23:59:59 GMT

关于您的问题,是的,您可以为存储桶中的每个对象指定过期日期和缓存控制日期。