Помните, что сохранение на S3 не является надежным - соединение может быть потеряно, сбой хранилища до завершения и т. Д.
Я создал свои собственные библиотечные процедуры, которые пытаются сделать хранилище, но ловят различные ошибки. Для ошибки без подключения я переподключаюсь. Для других ошибок хранения я повторяю (до трех раз). Вы также можете подождать секунду между попытками.
Добавлена
Ниже приведена библиотечная процедура, которую я использую для вызовов AWS.
Вам нужно будет добавить / изменить пункты восстановления, чтобы перехватить ошибки, с которыми вы столкнулись. Ваши connection_reset и методы сообщения об ошибках также будут зависеть от вашего sw.
# Usage example:
# aws_repeat("Storing #{bucket}/#{obj}"){
# AWS::S3::S3Object.store(obj, data, bucket, opt)}
def aws_repeat(description = nil)
# Calls the block up to 3 times, allowing for AWS connection reset problems
for i in 1..3
begin
yield
rescue Errno::ECONNRESET => e
ok = false
ActiveRecord::Base.logger.error \
"AWS::S3 *** Errno::ECONNRESET => sleeping"
sleep(1)
if i == 1
# reset connection
connect_to_aws # re-login in to AWS
ActiveRecord::Base.logger.error \
"AWS::S3 *** Errno::ECONNRESET => reset connection"
end
else
ok = true
break
end
end
unless ok
msg = "AWS::S3 *** FAILURE #{description.to_s}"
ActiveRecord::Base.logger.error msg
security_log(msg)
end
ok
end
############################################
############################################
def connect_to_aws
# load params. Cache at class (app) level
@@s3_config_path ||= RAILS_ROOT + '/config/amazon_s3.yml'
@@s3_config ||=
YAML.load_file(@@s3_config_path)[ENV['RAILS_ENV']].symbolize_keys
AWS::S3::Base.establish_connection!(
:access_key_id => @@s3_config[:access_key_id],
:secret_access_key => @@s3_config[:secret_access_key],
:server => @@s3_config[:server],
:port => @@s3_config[:port],
:use_ssl => @@s3_config[:use_ssl],
:persistent => false # from http://www.ruby-forum.com/topic/110842
)
true
end