【问题标题】:Can use AWS Gem with Paperclip for DigitalOcean Spaces service?可以将 AWS Gem 与 Paperclip 一起用于 DigitalOcean Spaces 服务吗?
【发布时间】:2018-03-18 23:01:16
【问题描述】:

我尝试使用 aws-sdk + Paperclip gem 和 Ruby On Rails 来使用 DigitalOcean Spaces 上传文件

我遇到的问题是配置的结果,我得到“{name_buncket}.s3.nyc3.amazonaws.com”而不是“{name_buncket}.s3.nyc3.digitaloceanspaces.com”,最后是正确的结果访问 DigitalOcean Spaces

aws-sdk gem 是 Amazon Services 独有的吗?如果是这种情况,是否还有其他类似于 aws-sdk 的 gem 可以使用?

这是我使用的配置:

config.paperclip_defaults = {
    storage: :s3,
    url: '.....',
    s3_region: 'nyc3',
    s3_credentials: {
    bucket: '......',
    access_key_id: "......",
    secret_access_key: "........",
    s3_host_name: 'nyc3.digitaloceanspaces.com'
  }
}

【问题讨论】:

    标签: ruby-on-rails amazon-web-services amazon-s3 aws-sdk digital-ocean


    【解决方案1】:

    我认为你现在运气不好,虽然不是因为你目前遇到的主机名问题。

    s3_host_name 键应位于您的 s3_credentials 块之外。如果您将配置更改为:

    config.paperclip_defaults = {
      storage: :s3,
      url: '.....',
      s3_region: 'nyc3',
      s3_credentials: {
        bucket: '......',
        access_key_id: "......",
        secret_access_key: "........"
      },
      s3_host_name: 'nyc3.digitaloceanspaces.com'
    }
    

    你应该解决你的主机名问题。

    但是,目前这只会将您引向另一个问题:Paperclip/aws-sdk 身份验证目前不适用于 DigitalOcean Spaces - 请参阅 this issue on GitHub

    【讨论】:

    • 嗯,我试过了,但我不能,我要等到一些宝石可以做到这一点,谢谢 drosboro
    【解决方案2】:

    除了设置s3_host_name,您还需要配置AWS SDK 使用的endpoint。 Paperclip 不会直接暴露这个,但是可以通过s3_options 设置我可以通过下面的配置成功使用带空格的Paperclip,其中env 变量S3_HOST_NAME 设置为nyc3.digitaloceanspaces.com

      config.paperclip_defaults = {
        storage: :s3,
        bucket: ENV["S3_BUCKET"],
        s3_credentials: {
          access_key_id: ENV["S3_ACCESS_KEY_ID"],
          secret_access_key: ENV["S3_SECRET_ACCESS_KEY"]
        },
        s3_host_name: ENV["S3_HOST_NAME"],
        s3_host_alias: ENV["S3_HOST_ALIAS"],
        s3_region: ENV["S3_REGION"],
        s3_protocol: :https,
        s3_options: {
          endpoint: "https://" + ENV["S3_HOST_NAME"],
        },
        url: ":s3_alias_url",
        path: "/assets/:class/:attachment/:style/:filename",
      }
    

    【讨论】:

    • 感谢您分享您的设置。我相信端点选项是原始主机名问题的正确答案。我正在使用几乎相同的设置,但它仍然给我一个“证书验证失败”。我添加了在“DigitalOcean Spaces Access Keys”中创建的访问密钥和秘密。我可能会错过这个难题的另一部分吗?
    • 我终于找到了我的证书失败的答案,在这个链接搜索'ssl_ca_bundle':github.com/aws/aws-sdk-core-ruby/issues/…
    【解决方案3】:

    我开始购买 Paperclip 的票,并且在 Digital Ocean 中也有一张票,但还没有回复。 drosboro 输入的上述示例理论上应该有效,但事实并非如此。指定 s3_host_name 什么都不做,并显示为原始帖子中指定的主机名,尽管我同意问题必须出在某处的身份验证问题上。

    为了测试,我从 :s3 切换到 storage: :fog。指定 scheme: 'https' 会导致 403 响应,而切换到 scheme: 'http' 会导致 302 响应。有趣的是,在通过 http 上传时,使用会在 json 输出中显示文件大小,结果为 0。奇数。

    考虑到可能使用了一些更新的 API 选项,我切换到 AWS-SDK v3,这导致了它自己的问题,我能够解决这些问题。不过,仍然没有骰子。如果我收到任何人的更新,我很乐意在此处发布回复。

    【讨论】:

    • 请注意,我最终迁移到了完全支持数字海洋空间的 Carrierwave。迁移用了不到一个小时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2017-07-02
    • 2011-12-24
    • 2014-12-25
    相关资源
    最近更新 更多