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
现在一切正常。我希望这对其他人有帮助。
我正在尝试设置 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
现在一切正常。我希望这对其他人有帮助。