Можно ли отслеживать использование ресурсов Amazon S3 с помощью приложения Ruby on Rails?

Скажем, у меня есть веб-приложение, которое позволяет пользователям загружать изображения и документы, и мое приложение хранит все эти активы на S3. Есть ли способ отслеживать использование ресурсов КАЖДОЙ учетной записи пользователя?

Например, если для учетной записи пользователя установлено ограничение на объем хранилища в 1 ГБ, как я могу отслеживать, сколько из этого разрешения использует тот или иной человек?

Кроме того (но это не проблема для меня), если эта учетная запись пользователя также имеет ограничение пропускной способности 5 ГБ, есть ли какие-либо доступные инструменты, которые позволяют мне контролировать только их пропускную способность S3?


person aaronrussell    schedule 07.03.2010    source источник


Ответы (1)


Да, это возможно. Вы можете использовать papreclip для управления загрузкой файлов (или любой другой надежный плагин/жемчужина управления загрузкой). Большинство этих инструментов дают вам доступ к размеру загруженного файла. Вы можете просто хранить эти файлы в базе данных вместе с assets_uri (которую, я полагаю, вы уже храните), и чтобы проверить, может ли пользователь загрузить другой файл, просто суммируйте все размеры всех активов с соответствующим user_id.

Users:
  id
  email_address
  first_name
  upload_limit

Assets:
  id
  user_id
  uri
  filesize
  filename

Затем, чтобы получить общий размер загруженных файлов конкретным пользователем, вы можете сделать:

class User < ActiveRecord::Base
  has_many :assets

  #Check if the user can upload another file
  def can_upload?
    if Asset.sum('filesize', :conditions => 'user_id = #{self.id}') >= self.upload_limit
      return false
    else
      return true
    end
  end

  #See the user's used storage space
  def used_storage
    return Asset.sum('filesize', :conditions => 'user_id = #{self.id}')
  end

  #See how much space the user has remaining
  def available_storage
    if self.can_upload?
      return self.upload_limit - Asset.sum('filesize', :conditions => 'user_id = #{self.id}')
    else
      return 0
    end
  end
end

Как видите, я использую сумму ActiveRecord. функция здесь, чтобы сделать расчет. Вы можете так же легко использовать карту или какое-либо другое решение на основе ruby.

person Mike Trpcic    schedule 07.03.2010