在 S3 存储上使用回形针下载和上传的不同 URL

Different URLs for downloading and uploading with paperclip on S3 storage

对于本地开发,我使用 localstack Docker Container 作为 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

但是当我想上传新文件时,我得到一个 Aws::Errors::NoSuchEndpointError 基于不同的 URL:

https://my-development.s3.localhost-region.amazonaws.com/files/downloads/_umschlag-vorlage_c534f5f25e.pdf

我搜索并调试了几个小时,但无法找到这个 url 的生成位置以及它为什么使用 amazonaws.com 作为主机。

有什么要看的提示吗?

我找到了让它工作的方法。

将显式端点 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

这不是很干净,但有效。也许我后来找到了更好的解决方法。

这可以帮助其他人。您可以在您的环境特定配置文件中更新 aws 配置。

Aws.config.update(
    endpoint: 'http://localhost:4572',
    force_path_style: true
  )