部署低流量轨道应用的最佳做法,无需担心成本问题

时间:2017-12-15 13:48:45

标签: ruby-on-rails hosting

我的问题

在部署rails app时,与成本相关的维护是否会降低?

欢迎攻击,因为它会教会我期待什么并支持自己 不过,我宁愿在月底避免大笔账单。

使用简易云托管服务?

我之所以选择AWS是因为它似乎具有可扩展性,我认为以后我可以避免使用其他服务 我没有遗憾,但AWS是压倒性的,如果有明显更简单的服务,我应该使用它。

我目前关注的是

  • 当我在那里上传一些内容时,Dos攻击或获取aws S3上的请求泛滥可能会显着提高托管成本。

计费闹钟很有用,但没有自动关机我觉得有点不舒服,休息一下,进入丛林或有人居住的岛屿,在那里我没有收到INTERNET连接被告知或关闭我的服务......

明显修复了我的案例

停止使用S3并将用户上传保存到数据库,我可以控制缩放行为。但是,大多数人似乎都在使用带载波的S3,为什么呢?

我正在做什么

使用以下方式制作我的第一个主页:

  • 弹性豆秆
  • rails5
  • Carrierwave gem配置为在S3中保存用户上传

修改

最后,我找不到任何真正的解决方案来解决S3问题。

下面或多或少是我的注意事项 我猜S3有一些基本的内置防御攻击,因为我没有听说过有关人们使用S3来托管静态网站并获得超过10000美元账单的悲惨故事,尽管亚马逊的防守有多好,但仍然会发生这种情况。是

减轻

一个脚本,它定期检查s3日志文件,并在这些文件的累积大小过大时调用禁用s3资源服务的操作。
S3日志有时需要一个多小时才能使用,因此它不是解决方案,但总比没有好。

class LogObserver
  def initialize
    aws_conf = Aws.config.update({
      access_key_id: ENV['AWS_ACCESS_KEY_ID'],
      secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
      region: 'ap-northeast-1'})
    @bucket_name="bucket name that holds s3 log"

    @last_checked_log_timestamp = Time.now.utc
    log "started at: #{Time.now}"
  end

  def run
    bucket = Aws::S3::Resource.new.bucket(@bucket_name)
    while true
      prv_log_ts = @last_checked_log_timestamp
      log_size = fetch_log_size(bucket)

      log "The total size of S3 log accumulated since last time this script was executed: #{log_size}"

      time_range = @last_checked_log_timestamp - prv_log_ts # float
      log_size_per_second = log_size/time_range

      if log_size_per_second > (500.kilobyte/60)
        log "Disabling S3 access as S3 log size is greater than expected."

        `curl localhost/static_pages/disable_s3`
      end

      sleep 60*60 
    end
  end
  def log text
    puts text
    File.open('./s3_observer_log.txt','a') do |f|
      f << text
    end
  end

  def fetch_log_size(bucket)
    log_size=0
    bucket.objects(prefix: 'files').each do |o|
      time_object = o.last_modified


      if time_object < @last_checked_log_timestamp
        next
      end
      @last_checked_log_timestamp = time_object
      log_size += o.size.to_i
    end  
    return log_size
  end
end

佣金任务:

namespace :s3_log do
  desc "Access S3 access log files and check their cumulative size. If the size is above the expected value, disables s3 access."
  task :start_attack_detection_loop do
    require './s3_observer.rb'
    id=Process.fork do
      o=LogObserver.new
      o.run
    end
    puts "Forked a new process that watches s3 log. Process id: #{id}"
  end
end

控制器动作:

  before_action :ensure_permited_ip, only: [:enable_s3, :disable_s3]
  def enable_s3
    # allow disabling s3 only from localhost
    CarrierWave.configure do |config|
      config.fog_authenticated_url_expiration = 3 
    end
  end
  def disable_s3
    # allow disabling s3 only from localhost
    CarrierWave.configure do |config|
      config.fog_authenticated_url_expiration = 0 
    end
  end
  private
  def ensure_permited_ip
    if request.remote_ip!= "127.0.0.1" # allow access only from localhost
      redirect_to root_path
    end
  end

宝石:

gem 'aws-sdk-rails'
gem 'aws-sdk-s3', '~> 1'

1 个答案:

答案 0 :(得分:1)

我的经历有限,但我的建议是:

  

在部署rails app时,与成本相关的维护是否会降低?

  • 如果您要使用后台工作,请使用rufus-scheduler代替sidekiqdelayed_job,因为它会在rails server之上运行而不会需要额外的内存/额外的专用进程。这允许您获得最小/最便宜的可能实例:t2.nano,我曾经做过一次。
  

使用简易云托管服务?

  • Heroku将是一个不错的选择,因为设置它很容易。但是,如果你这样做是为了体验,我建议采购非托管主机,如AWS EC2Linode。我最近3个月前将我的服务器从AWS迁移到Vpsdime,因为它便宜且内存很大;到目前为止一直很好。
  

我目前关注的问题

  • 对于carrierwave,您可以限制S3访问。见reference。然后,这会阻止热链接,然后需要用户首先查看您的Rails页面,以便下载或查看或显示S3文件。既然Rails现在可以控制S3文件,你可以简单地使用像Rack::Attack这样的东西来防止DDOS或过多的请求。如果您的Rails应用配置了ApacheNginx,则可以在那里设置DDOS规则,而不是使用Rack::Attack。或者,如果您要使用AWS负载均衡器来管理/路由请求,那么您可以使用AWS Shield ...但是还没有真正使用它。