在 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的主要内容,如果未能解决你的问题,请参考以下文章

无法使用回形针导轨上传到S3 5.配置选项无效:存储桶

回形针在使用 S3 时在本地查找文件以进行重新处理

上传图片 - Nodejs Paperclip 和 S3

Rails:回形针上传时 AWS S3 访问被拒绝错误

我应该如何在 Amazon S3 上配置“阻止公共访问”?

使用 Rails 和 Paperclip 设置存储桶的名称放置域样式 (bucket.s3.amazonaws.com)