【问题标题】:Different S3 buckets for staging app vs. production app用于暂存应用程序与生产应用程序的不同 S3 存储桶
【发布时间】:2011-08-25 21:56:56
【问题描述】:

我有一个使用 Amazon S3 存储回形针附件的 Rails 应用程序。我的 database.yml 文件为开发、测试和生产指定了不同的 S3 存储桶。

我在 Heroku 上有两个应用程序 - 一个生产应用程序和一个用于在平台发布前测试代码的“临时应用程序”。

当前系统有一个重要缺陷 - 它使用相同的 S3 存储桶进行暂存和生产。如何设置我的系统,使其使用不同的存储桶,这主要取决于我是写 git push production master 还是 git push staging master

【问题讨论】:

  • 你是如何写回形针的?
  • 呼吸暂停,你在说什么文件?
  • 在您的模型中,您如何将 s3 配置传递给回形针?
  • @apneadiving - 在每个有附件的模型中,我都有has_attached_file :whatever, :storage => :s3, :s3_credentials => "#{::Rails.root.to_s}/config/s3.yml", :path => "/whatever/:style/:id/:normalized_file_name"这一行。

标签: ruby-on-rails ruby-on-rails-3 amazon-s3


【解决方案1】:

Heroku 允许您通过应用程序中的每个测功机/进程开始使用的持久环境变量来配置您喜欢的任何内容。同一应用程序的暂存版本和生产版本之间不共享环境变量。充分利用这一点。

has_attached_file :photo, 
  :styles => ...,
  :path => ...,
  :storage => :s3,
  :bucket => ENV['S3_BUCKET'], # <--- over here
  :s3_credentials => {
    :access_key_id => ENV['S3_KEY'],
    :secret_access_key => ENV['S3_SECRET']
  }

然后:

# Configure the "staging" instance
$ heroku config:add \
    RACK_ENV=production \
    S3_KEY=my-staging-key \
    S3_SECRET=my-staging-secret \
    S3_BUCKET=my-staging-bucket \
    --app my-staging-app-name

# Configure the "production" instance
$ heroku config:add \
    RACK_ENV=production \
    S3_KEY=my-production-key \
    S3_SECRET=my-production-secret \
    S3_BUCKET=my-production-bucket \
    --app my-production-app-name

请注意,您的应用程序的每个实例都有一个RACK_ENV=production。不要使用 Rails 环境来区分应用程序的实例。相反,您的应用程序应该期望使用环境变量来配置特定于实例的方面。

【讨论】:

  • 是的,我在“staging”实例中设置了RACK_ENV=production。这是因为,在 Heroku 上,您可以将环境变量用于所有配置。为此,您不需要 Rails 环境的帮助。在您的production.rb 中,您当然可以根据环境变量的存在、不存在或值设置属性,这就是您应该在 Heroku“暂存”环境中执行的操作。
  • 感谢这个超级有用的答案!我的问题是,当我尝试使用 RACK_ENV=development 和 RAILS_ENV=development 更改环境时,我不断收到错误消息,提示“错误 R10(启动超时)-> Web 进程在启动后 60 秒内无法绑定到 $PORT,”这是为什么呢?
【解决方案2】:

在您的暂存箱上设置 config:add RACK_ENV=staging,然后在您的代码中,您可以根据环境指定存储桶。例如:

if Rails.env.production?
    has_attached_file :photo, 
    :styles => ...,
    :path => ...,
    :storage => :s3,
    :bucket => 'your_prod_bucket',
    :s3_credentials => {
      :access_key_id => ENV['S3_KEY'],
      :secret_access_key => ENV['S3_SECRET']
    }
  else
    has_attached_file :photo, 
    :styles => ...,
    :path => ...,
    :storage => :s3,
    :bucket => 'your_staging_bucket',
    :s3_credentials => {
      :access_key_id => ENV['S3_KEY'],
      :secret_access_key => ENV['S3_SECRET']
    }

  end

这篇 heroku 帖子似乎还建议您只需使用不同的 s3 凭据进行暂存和生产即可实现此目的。我猜您也必须在亚马逊方面进行一些配置。无论如何,看看它是否有帮助。 http://devcenter.heroku.com/articles/config-vars

【讨论】:

  • 我会将凭据存储在 config/environments/ 中,并避免可能分散在整个代码中的条件逻辑。
猜你喜欢
  • 1970-01-01
  • 2017-10-02
  • 2021-05-27
  • 2020-09-27
  • 2017-02-07
  • 2019-04-18
  • 2020-07-24
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多