【问题标题】:Different URLs for downloading and uploading with paperclip on S3 storage在 S3 存储上使用回形针下载和上传的不同 URL
【发布时间】: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。

标签: ruby-on-rails amazon-s3 paperclip localstack


【解决方案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
      )
    

    【讨论】:

      猜你喜欢
      • 2017-10-01
      • 2017-11-01
      • 2013-09-09
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 2019-12-21
      相关资源
      最近更新 更多