欢迎攻击,因为它会教会我期待什么并支持自己 不过,我宁愿在月底避免大笔账单。
我之所以选择AWS是因为它似乎具有可扩展性,我认为以后我可以避免使用其他服务 我没有遗憾,但AWS是压倒性的,如果有明显更简单的服务,我应该使用它。
计费闹钟很有用,但没有自动关机我觉得有点不舒服,休息一下,进入丛林或有人居住的岛屿,在那里我没有收到INTERNET连接被告知或关闭我的服务......
停止使用S3并将用户上传保存到数据库,我可以控制缩放行为。但是,大多数人似乎都在使用带载波的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'
答案 0 :(得分:1)
我的经历有限,但我的建议是:
在部署rails app时,与成本相关的维护是否会降低?
rufus-scheduler
代替sidekiq
或delayed_job
,因为它会在rails server
之上运行而不会需要额外的内存/额外的专用进程。这允许您获得最小/最便宜的可能实例:t2.nano,我曾经做过一次。使用简易云托管服务?
我目前关注的问题
carrierwave
,您可以限制S3访问。见reference。然后,这会阻止热链接,然后需要用户首先查看您的Rails页面,以便下载或查看或显示S3文件。既然Rails现在可以控制S3文件,你可以简单地使用像Rack::Attack这样的东西来防止DDOS或过多的请求。如果您的Rails应用配置了Apache
或Nginx
,则可以在那里设置DDOS规则,而不是使用Rack::Attack
。或者,如果您要使用AWS负载均衡器来管理/路由请求,那么您可以使用AWS Shield ...但是还没有真正使用它。