Seahorse::Client::NetworkingError 使用 rails 上传 Amazon S3 文件
Seahorse::Client::NetworkingError Amazon S3 file upload with rails
在我的 rails 4 应用程序中,我尝试使用 aws-sdk(使用 gem 'aws-sdk', '~> 2'
)下载一个普通的 png 文件,然后将其上传到我的 s3 存储桶。
在开发环境中,代码运行良好。但是如果我尝试 rails s -e production
或者如果我在我的 heroku 实例上测试上传,我在测试图像上传功能时会收到以下错误,
Seahorse::Client::NetworkingError (Connection reset by peer):
app/helpers/aws_s3.rb:73:in `upload_to_s3'
app/controllers/evaluations_controller.rb:19:in `test'
我的 upload_to_s3 跟踪中提到的方法看起来像:
def upload_to_s3(folder_name)
url = "http://i.imgur.com/WKeQQox.png"
filename = "ss-" + DateTime.now.strftime("%Y%d%m-%s") + "-" + SecureRandom.hex(4) + ".png"
full_bucket_path = Pathname(folder_name.to_s).join(filename).to_s
file = save_to_tempfile(url, filename)
s3 = Aws::S3::Resource.new(access_key_id: ENV["IAM_ID"], secret_access_key: ENV["IAM_SECRET"], region: 'us-east-1')
s3_file = s3.bucket(ENV["BUCKET"]).object(full_bucket_path)
s3_file.upload_file(file.path)
raise s3_file.public_url.to_s.inspect
end
两种环境的环境变量相同。我真的不知道还有什么地方可以调试它。为什么它在开发中有效,但在生产中无效?我有一种感觉,我错过了一些非常明显的东西。
更新:
让我们进一步简化这个,因为我没有收到太多反馈。
s3 = Aws::S3::Resource.new
bucket = s3.bucket(ENV["BUCKET"])
bucket.object("some_file.txt").put(body:'Hello World!')
以上完全适用于我的开发环境,但不适用于我的生产环境。在生产中,当我调用 put(body:'Hello World!')
时它会出错。我知道这可能与写权限或其他东西有关,但我再次检查了我的环境变量,它们是相同的。是否有一些我不知道应该检查的配置?
我试过使用新的 IAM 用户。我也临时将development.rb的全部内容复制到production.rb,只是为了看看开发或生产的配置是否影响它,但无济于事。我 运行 捆绑更新也是如此。再一次,运气不好。
我希望错误更具有描述性,但无论我尝试什么,它都只是说 Seahorse::Client::NetworkingError (Connection reset by peer)
。
嗯,我从来没有找到解决这个问题的方法,因为我在截止日期前不得不求助于其他选择。我假设这是 Amazon 端或 aws-sdk gem 的错误,因为我已经多次检查我的配置,它是正确的。
我的解决方法是使用雾 gem,这实际上非常方便。在将 gem 'fog'
添加到我的 gem 文件和 运行 bundle install
之后,我的代码现在看起来像这样:
def upload_to_s3(folder_name)
filename = "ss-" + DateTime.now.strftime("%Y%d%m-%s") + "-" + SecureRandom.hex(4) + ".png"
full_bucket_path = Pathname(folder_name.to_s).join(filename).to_s
image_contents = open(url).read
connection = Fog::Storage.new({
:provider => 'AWS',
:aws_access_key_id => ENV["AWS_ACCESS_KEY_ID"],
:aws_secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"]
})
directory = connection.directories.get(ENV["BUCKET"])
file = directory.files.create(key: full_bucket_path, public: true)
file.body = image_contents
file.save
return file.public_url
end
这很简单并且很容易实现。希望我知道 aws-sdk 出了什么问题 gem,但对于其他有问题的人,试试 fog。
在我的 rails 4 应用程序中,我尝试使用 aws-sdk(使用 gem 'aws-sdk', '~> 2'
)下载一个普通的 png 文件,然后将其上传到我的 s3 存储桶。
在开发环境中,代码运行良好。但是如果我尝试 rails s -e production
或者如果我在我的 heroku 实例上测试上传,我在测试图像上传功能时会收到以下错误,
Seahorse::Client::NetworkingError (Connection reset by peer):
app/helpers/aws_s3.rb:73:in `upload_to_s3'
app/controllers/evaluations_controller.rb:19:in `test'
我的 upload_to_s3 跟踪中提到的方法看起来像:
def upload_to_s3(folder_name)
url = "http://i.imgur.com/WKeQQox.png"
filename = "ss-" + DateTime.now.strftime("%Y%d%m-%s") + "-" + SecureRandom.hex(4) + ".png"
full_bucket_path = Pathname(folder_name.to_s).join(filename).to_s
file = save_to_tempfile(url, filename)
s3 = Aws::S3::Resource.new(access_key_id: ENV["IAM_ID"], secret_access_key: ENV["IAM_SECRET"], region: 'us-east-1')
s3_file = s3.bucket(ENV["BUCKET"]).object(full_bucket_path)
s3_file.upload_file(file.path)
raise s3_file.public_url.to_s.inspect
end
两种环境的环境变量相同。我真的不知道还有什么地方可以调试它。为什么它在开发中有效,但在生产中无效?我有一种感觉,我错过了一些非常明显的东西。
更新:
让我们进一步简化这个,因为我没有收到太多反馈。
s3 = Aws::S3::Resource.new
bucket = s3.bucket(ENV["BUCKET"])
bucket.object("some_file.txt").put(body:'Hello World!')
以上完全适用于我的开发环境,但不适用于我的生产环境。在生产中,当我调用 put(body:'Hello World!')
时它会出错。我知道这可能与写权限或其他东西有关,但我再次检查了我的环境变量,它们是相同的。是否有一些我不知道应该检查的配置?
我试过使用新的 IAM 用户。我也临时将development.rb的全部内容复制到production.rb,只是为了看看开发或生产的配置是否影响它,但无济于事。我 运行 捆绑更新也是如此。再一次,运气不好。
我希望错误更具有描述性,但无论我尝试什么,它都只是说 Seahorse::Client::NetworkingError (Connection reset by peer)
。
嗯,我从来没有找到解决这个问题的方法,因为我在截止日期前不得不求助于其他选择。我假设这是 Amazon 端或 aws-sdk gem 的错误,因为我已经多次检查我的配置,它是正确的。
我的解决方法是使用雾 gem,这实际上非常方便。在将 gem 'fog'
添加到我的 gem 文件和 运行 bundle install
之后,我的代码现在看起来像这样:
def upload_to_s3(folder_name)
filename = "ss-" + DateTime.now.strftime("%Y%d%m-%s") + "-" + SecureRandom.hex(4) + ".png"
full_bucket_path = Pathname(folder_name.to_s).join(filename).to_s
image_contents = open(url).read
connection = Fog::Storage.new({
:provider => 'AWS',
:aws_access_key_id => ENV["AWS_ACCESS_KEY_ID"],
:aws_secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"]
})
directory = connection.directories.get(ENV["BUCKET"])
file = directory.files.create(key: full_bucket_path, public: true)
file.body = image_contents
file.save
return file.public_url
end
这很简单并且很容易实现。希望我知道 aws-sdk 出了什么问题 gem,但对于其他有问题的人,试试 fog。