在 S3 存储上使用回形针下载和上传的不同 URL
Posted
技术标签:
【中文标题】在 S3 存储上使用回形针下载和上传的不同 URL【英文标题】:Different URLs for downloading and uploading with paperclip on S3 storage 【发布时间】:2020-05-17 04:10:53 【问题描述】:对于本地开发,我使用 localstack Docker 容器作为 AWS Sandbox,并使用此 Paperclip 配置:
config.paperclip_defaults =
storage: :s3,
s3_credentials:
access_key_id: ENV['AWS_ACCESS_KEY_ID'],
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
,
bucket: 'my-development',
s3_region: 'localhost-region',
s3_host_name: 'localhost:4572',
url: ':s3_path_url',
下载内容的链接已正确生成并且可以正常工作:
http://localhost:4572/my-development/files/downloads/be-fl-che-spezialtiefbau-mischanlage-750_ae0f1c99d8.pdf
但是当我想上传新文件时,我会得到一个基于不同 URL 的 Aws::Errors::NoSuchEndpointError:
https://my-development.s3.localhost-region.amazonaws.com/files/downloads/_umschlag-vorlage_c534f5f25e.pdf
我搜索和调试了几个小时,但找不到此 url 的生成位置以及为什么它使用 amazonaws.com 作为主机。
任何提示在哪里看?
【问题讨论】:
你的paperclip_defaults
对象实际上是发起:s3
。那时您的上传将始终专注于 s3。
Localstack 也提供了一个 S3 服务,它可以工作,所以没问题。我只想更改文件上传的位置(在哪个主机上)。
我还是不明白,你如何在不上传的情况下获得下载内容[NoSuchEndpointError]?您的上传内容也不能正常工作?如果 localstack 是开发,那么 S3 生产是什么?
我使用一些终端命令将“live AWS S3”镜像到 localstack 容器中。它与回形针、红宝石或 AWS Gem 无关。在生产中,我使用的是“真正的”AWS S3。
【参考方案1】:
我找到了让它工作的方法。
在配置中添加显式端点 url
# config/environments/development.rb
config.paperclip_defaults =
storage: :s3,
s3_credentials:
access_key_id: ENV['AWS_ACCESS_KEY_ID'],
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
,
s3_options:
endpoint: 'http://localhost:4572/my-development',
,
bucket: 'my-development',
s3_region: 'localhost-region',
s3_host_name: 'localhost:4572',
url: ':s3_path_url',
由于 AWS Gem 将使用存储桶名称重命名 url,因此生成的域将为 my-development.localhost
。除了将此子域添加到我的/etc/hosts
之外,我还没有找到任何其他解决方案:
127.0.0.1 localhost
127.0.0.1 my-development.localhost
255.255.255.255 broadcasthost
::1 localhost
::1 my-development.localhost
这不是很干净但有效。也许我以后找到了更好的解决方法。
【讨论】:
【参考方案2】:这可以帮助其他人。您可以在特定于环境的配置文件中更新 aws 配置。
Aws.config.update(
endpoint: 'http://localhost:4572',
force_path_style: true
)
【讨论】:
以上是关于在 S3 存储上使用回形针下载和上传的不同 URL的主要内容,如果未能解决你的问题,请参考以下文章
使用 Rails 和 Paperclip 设置存储桶的名称放置域样式 (bucket.s3.amazonaws.com)