Fog/Carrierwave AWS Elastic Beanstalk 上 Rails 应用程序的配置

Fog/Carrierwave config for Rails app on AWS Elastic Beanstalk

我正在尝试设置 Carrierwave 和 Fog 来处理我在 AWS 的 Elastic Beanstalk 上托管的 rails 应用程序上的图像和文件上传。

我对如何正确设置 Fog 配置有点困惑。

我尝试使用我的 AWS 访问密钥和秘密密钥(在下面的示例中被注释掉)。这是通过我的 EB CLI 上的错误(错误:NotAuthorizedError - 操作被拒绝。请求中包含的安全令牌无效。)

我尝试使用 IAM 而不是在我的 ruby 代码中使用我的 Access/Secret 代码。谁能告诉我如何正确设置它?

这是我的配置文件:

CarrierWave.configure do |config|


  # Use local storage if in development or test
  if Rails.env.development? || Rails.env.test?
    CarrierWave.configure do |config|
      config.storage = :file
    end
  end

  # Use AWS storage if in production
  if Rails.env.production?
    CarrierWave.configure do |config|
      config.storage = :fog
    end
  end


  config.fog_credentials = {
    :provider               => 'AWS',                             # required
    # :aws_access_key_id      => 'My Access',            # required
    # :aws_secret_access_key  => 'My Secret',     # required
    :use_iam_profile => true,
    :region                 => 'eu-west-2'                        # optional, defaults to 'us-east-1'
  }
  config.fog_directory  = 'elasticbeanstalk-us-west-2-XXXXXXXXXX'               # required
  #config.fog_host       = 'https://assets.example.com'           # optional, defaults to nil
  config.fog_public     = false                                  # optional, defaults to true
  config.fog_attributes = {'Cache-Control'=>'max-age=315576000'}  # optional, defaults to {}
end

这是适合我的设置:

config/initializers/carrierwave.rb

CarrierWave.configure do |config|
  config.fog_provider = 'fog/aws'                        # required
  config.fog_credentials = {
    provider:              'AWS',                        # required
    aws_access_key_id:     ENV['aws_access_key_id'],       # required
    aws_secret_access_key: ENV['aws_secret_access_key'],   # required
    #region:                'Singapore',                 # optional, defaults to 'us-east-1'
    #host:                  's3.example.com',            # optional, defaults to nil
    #endpoint:              'olucube-images.s3-website-ap-southeast-1.amazonaws.com', # optional, defaults to nil
  }
  config.fog_directory  = ENV['fog_directory']             # required
  #config.fog_public     = false                                        # optional, defaults to true
#  config.fog_attributes = { 'Cache-Control' => "max-age=#{365.day.to_i}" }, # optional, defaults to {}
end

我使用 figaro gem 来保存我的凭证如下:

config/application.yml

aws_access_key_id: 'XXXXXXXXXXXXXXXXXXXX'
aws_secret_access_key: 'XXXXXXXXXXXXXXXXXX'
fog_directory: 'myAppName'

这有点疯狂。我很难弄清楚费加罗 gem。这可能很简单,但我并没有真正理解它。所以为了测试,我将我的密钥直接放在代码中。还是不行。

我将我的代码推送到 github(公开)并且没有想太多。我打算换钥匙以防万一。在我能够做到这一点之前,有人在 github 上找到了我的代码并获得了对我的 AWS 账户的访问权限。他们启动了一堆 EC2 实例,并在几个小时内累积了价值 3000 美元的使用费!

我的 AWS 账户被暂停了,我仍在处理撤销费用的问题。

总之。我发现您实际上可以在 Elastic Beanstalk Web 界面上设置环境变量。它在配置→软件配置下。所以我这样做而不是使用 Fiagro(IMO 更安全)。现在效果很好。我简化了我的 Carrierwave 配置文件以仅使用 AWS 从 EB 调用环境变量。这是文件:

# config/initializers/carrierwave.rb

CarrierWave.configure do |config|

config.fog_provider = 'fog/aws'
config.fog_credentials = {
  provider: 'AWS',
  aws_access_key_id: ENV['S3_KEY'],
  aws_secret_access_key: ENV['S3_SECRET'],
  region: ENV['S3_REGION']
}
config.fog_directory  = ENV['S3_BUCKET']
config.fog_public = false
config.storage = :fog

结束

我也更改了我的上传文件以使用雾。这是一个例子:

# app/uploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  storage :fog
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end
end

现在一切正常。我希望这对其他人有帮助。