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

时间:2018-01-04 05:20:17

标签: ruby-on-rails amazon-web-services elastic-beanstalk carrierwave fog

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

我对如何正确设置Fog配置感到困惑。

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

我想使用IAM而不是在我的ruby代码中使用我的访问/密码。谁能告诉我如何正确设置?

这是我的配置文件:

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

2 个答案:

答案 0 :(得分:1)

这是一个适合我的设置:

配置/初始化/ 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来保存我的凭据如下:

配置/ application.yml

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

答案 1 :(得分:0)

这有点疯狂。我很难搞清楚费加罗的宝石。这可能很简单,但我并不是真的理解它。因此,对于测试,我将我的密钥直接放在代码中。它仍然无效。

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

我的AWS账户被暂停,我仍在处理相反的费用。

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

--site=QA

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

# 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

现在一切都很好。我希望这有助于其他人。