如何为Hartl的rails教程授予AWS用户权限

我不知道如何(或在何处)从AWS授予用户读写权限,以便用户可以在生产环境中的sample_app上发布图片。 这是第11章的最后一项任务,它没有被教程所涵盖,我无法在任何地方找到解决方案。

这是carrier_wave.rb文件:

 if Rails.env.production? CarrierWave.configure do |config| config.fog_credentials = { # Configuration for Amazon S3 :provider => 'AWS', :aws_access_key_id => ENV['lalala'], :aws_secret_access_key => ENV['oloalle'] } config.fog_directory = ENV['name of bucket'] end end 

这是教程中的过程:1)创建AWS IAM用户并记录访问权限和密钥 – 完成

2)创建S3桶 – 完成

3) 授予对上一步创建的用户的读写权限 – 如何???

4)然后我运行这三个命令:

 $ heroku config:set S3_ACCESS_KEY=lalala $ heroku config:set S3_SECRET_KEY=oloalle $ heroku config:set S3_BUCKET=name of bucket 

5)推送到git和heroku – 完成

6) heroku pg:reset DATABASE – 完成

7) heroku run rake db:migrate ,在这里我收到这条消息:

 Running `rake db:migrate` attached to terminal... up, run.7906 rake aborted! ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key /app/vendor/bundle/ruby/2.0.0/gems/fog-core-1.28.0/lib/fog/core/service.rb:244:in `validate_options' /app/vendor/bundle/ruby/2.0.0/gems/fog-core-1.28.0/lib/fog/core/service.rb:268:in `handle_settings' /app/vendor/bundle/ruby/2.0.0/gems/fog-core-1.28.0/lib/fog/core/service.rb:98:in `new' /app/vendor/bundle/ruby/2.0.0/gems/fog-core-1.28.0/lib/fog/storage.rb:25:in `new' /app/vendor/bundle/ruby/2.0.0/gems/carrierwave-0.10.0/lib/carrierwave/uploader/configuration.rb:83:in `eager_load_fog' /app/vendor/bundle/ruby/2.0.0/gems/carrierwave-0.10.0/lib/carrierwave/uploader/configuration.rb:96:in `fog_credentials=' /app/config/initializers/carrier_wave.rb:3:in `block in ' /app/vendor/bundle/ruby/2.0.0/gems/carrierwave-0.10.0/lib/carrierwave/uploader/configuration.rb:118:in `configure' /app/vendor/bundle/ruby/2.0.0/gems/carrierwave-0.10.0/lib/carrierwave.rb:14:in `configure' /app/config/initializers/carrier_wave.rb:2:in `' /app/vendor/bundle/ruby/2.0.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `load' /app/vendor/bundle/ruby/2.0.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `block in load' /app/vendor/bundle/ruby/2.0.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:240:in `load_dependency' /app/vendor/bundle/ruby/2.0.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `load' /app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/engine.rb:652:in `block in load_config_initializer' /app/vendor/bundle/ruby/2.0.0/gems/activesupport-4.2.0/lib/active_support/notifications.rb:166:in `instrument' /app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/engine.rb:651:in `load_config_initializer' /app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/engine.rb:616:in `block (2 levels) in ' /app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/engine.rb:615:in `each' /app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/engine.rb:615:in `block in ' /app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/initializable.rb:30:in `instance_exec' /app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/initializable.rb:30:in `run' /app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/initializable.rb:55:in `block in run_initializers' /app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/initializable.rb:44:in `each' /app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/initializable.rb:44:in `tsort_each_child' /app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/initializable.rb:54:in `run_initializers' /app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/application.rb:352:in `initialize!' /app/config/environment.rb:5:in `' /app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/application.rb:328:in `require' /app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/application.rb:328:in `require_environment!' /app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/application.rb:443:in `block in run_tasks_blocks' Tasks: TOP => db:migrate => environment (See full trace by running task with --trace) 

这是我创建的教程,用于了解Michael Hartl在Ruby on Rails Tutorial(第3版)第11章结束时所留下的内容。它应该回答你的问题等等。

让Railstutorial.org示例应用程序在Heroku和AWS之间工作是一个巨大的痛苦。 但我做到了。 如果您找到了本教程,那意味着您可能遇到了一个无法通过的错误。 没关系。 我有几个。

您需要做的第一件事是回顾Hartl提供的代码。 确保您完全按照所示键入(或复制/粘贴)。 在本节中的所有代码中,您可能只需要添加一个小的附加内容。 “区域”环境变量。 如果您创建的存储桶不在默认的美国区域中,则需要这样做。 稍后会详细介绍。 这是/config/initializers/carrier_wave.rb的代码:

 if Rails.env.production? CarrierWave.configure do |config| config.fog_credentials = { # Configuration for Amazon S3 :provider => 'AWS', :aws_access_key_id => ENV['S3_ACCESS_KEY'], :aws_secret_access_key => ENV['S3_SECRET_KEY'], :region => ENV['S3_REGION'] } config.fog_directory = ENV['S3_BUCKET'] end end 

那一行:region => ENV['S3_REGION']对很多人来说都是一个问题。 稍后会详细介绍。

您应该完全按照所示使用该代码块。 不要把你的实际钥匙放在那里。 我们将分别发送给Heroku。

如果你必须添加那行代码,不要忘记将它提交给git并将其推送到Heroku。

现在让我们转到您的AWS账户和安全性。

  1. 首先, 创建您的AWS账户。 在大多数情况下,这就像注册任何网站。 制作一个很好的长密码并将其存储在安全的地方,就像加密的密码管理器一样。 当您创建帐户时,您将获得第一组AWS密钥。 您将不会在本教程中使用它们,但是您可能在将来的某个时候需要它们,因此也可以将它们保存在安全的地方。
  2. 转到S3部分并制作一个桶。 它必须有一个唯一的名称,所以我通常只把日期放在最后,这就是它。 例如,您可以将其命名为“my-sample-app-bucket-20160126”。 创建存储桶后,单击名称,然后单击“属性”。 了解你的水桶所处的“区域”非常重要。找到它并记下它。 你稍后会用它。
  3. 您的主帐户可能拥有对所有内容的完全权限,因此不要使用它来在两个Web服务之间传输随机数据。 如果它出来,这可能会花费你很多钱。 我们将改为限制用户。 在IAM部分中创建一个新用户。 我把它命名为“雾”,因为那是处理发送和接收的云服务软件。 创建它时,您可以选择显示和/或下载与新用户关联的键。 将它保存在安全可靠的地方非常重要。 它不会进入您的代码,因为它可能最终会出现在其他人可以看到它的存储库中。 此外,不要为此新用户提供密码,因为它不会登录AWS仪表板。
  4. 组建一个新组。 我称之为“s3railsbucket”。 这是分配权限的位置。 为此组添加“雾”。
  5. 转到“政策”部分。 单击“创建策略”,然后选择“创建自己的策略”。 给它一个以“允许”开头的名称,以便它显示在策略列表的顶部附近。 这是一个巨大的清单。 这是我做的:

策略名称: AllowFullAccessToMySampleAppBucket20160126
描述:允许对名为my-sample-app-bucket-20160126的S3存储桶进行远程写入/删除访问。
政策文件:

 { "Version": "2012-10-17", "Statement": [ { "Action": "s3:*", "Effect": "Allow", "Resource": [ "arn:aws:s3:::my-sample-app-bucket-20160126", "arn:aws:s3:::my-sample-app-bucket-20160126/*" ] } ] } 
  1. 返回“组”部分,选择您创建的组,然后将新策略添加到组中。

这就是AWS配置。 我不需要制定一个允许“雾”列出存储桶内容的策略,即使我尝试过的大多数教程都说是必要的。 我认为只有当您想要一个可以通过仪表板登录的用户时才有必要。

现在为Heroku配置。 这些东西会在命令提示符下输入,就像’heroku run rake db:migrate’等。 在这里,您可以输入从之前创建的“雾”用户获得的实际访问密钥和密钥。

 $ heroku config:set S3_ACCESS_KEY=THERANDOMKEYYOUGOT $ heroku config:set S3_SECRET_KEY=an0tHeRstRing0frAnDomjUnK $ heroku config:set S3_REGION=us-west-2 $ heroku config:set S3_BUCKET=my-sample-app-bucket-20160126 

再看看最后一个。 还记得您查看S3存储桶的属性吗? 您可以在此处输入与您所在地区相关联的代码。 如果您的水桶不在俄勒冈州,则必须将us-west-2更改为您的实际区域代码。 编写本教程时,此链接有效:

http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region

如果这不起作用,Google“AWS S3区域代码”。

完成所有这些并仔细检查代码中的错误后,我让Heroku与AWS合作存储图片!

Services -> IAM ,单击IAM Resources下的1 User(s) 。 选择您要获得权限的用户。 在此用户的配置文件中,单击“ Attach User Policy 。 单击Select for Amazon S3 Full Access ,最后Apply Policy

对于将来的其他人来说, 这个答案对我帮助很大 。

继续使用Heroku,在您的应用程序中,转到设置,点击Reveal Config Vars。

点击右侧的编辑,然后在那里输入您的秘密:

 S3_BUCKET: name of your bucket goes here S3_ACCESS_KEY: xxxxx S3_SECRET_KEY: xxxx 

在config / initializers / carrierwave.rb或您输入密码的任何地方都应该:

 CarrierWave.configure do |config| config.root = Rails.root.join('tmp') # adding these... config.cache_dir = 'carrierwave' # ...two lines config.fog_credentials = { :provider => 'AWS', # required :s3_access_key_id => ENV['S3_ACCESS_KEY'], # required :s3_secret_access_key => ENV['S3_SECRET_KEY'], # required :region => 'eu-west-1', # optional, defaults to 'us-east-1' :host => 's3.example.com', # optional, defaults to nil :endpoint => 'https://s3.example.com:8080' # optional, defaults to nil } config.fog_directory = ENV['S3_Bucket'] # required config.fog_public = false # optional, defaults to true config.fog_attributes = {'Cache-Control'=>'max-age=315576000'} # optional, defaults to {} end 

我发现上面选择的正确答案对我不起作用。 经过多次试验和错误后,这最终对我有用。

我按照第一步手动输入上面列出的秘密信息……

继续使用Heroku,在您的应用程序中,转到设置,点击Reveal Config Vars。

点击右侧的编辑,然后在那里输入您的秘密:

S3_BUCKET: name of your bucket goes here
S3_ACCESS_KEY: xxxxx
S3_SECRET_KEY: xxxx

但是,carrier_wave文件的细微差别似乎有效。

注意if Rails.env.production? 线和end

carrier_wave.rb

 if Rails.env.production? CarrierWave.configure do |config| config.root = Rails.root.join('tmp') # adding these... config.cache_dir = 'carrierwave' # ...two lines config.fog_credentials = { :provider => 'AWS', # required :aws_access_key_id => ENV['S3_ACCESS_KEY'], :aws_secret_access_key => ENV['S3_SECRET_KEY'], :region => 'eu-west-2', # optional, defaults to 'us-east-1' :host => 's3.example.com', # optional, defaults to nil :endpoint => 'https://s3.example.com:8080' # optional, defaults to nil } config.fog_directory = ENV['S3_Bucket'] # required config.fog_public = false # optional, defaults to true config.fog_attributes = {'Cache-Control'=>'max-age=315576000'} # optional, defaults to {} end end 

不确定问题是否存在。

在做出改变之后,我根据Michael Hartl的指示完成了这一章。

我们现在准备在主题分支上提交更改并合并回master:

$ bundle exec rake test
$ git add -A
$ git commit -m "Add user microposts"
$ git checkout master
$ git merge user-microposts
$ git push

然后我们部署,重置数据库,并重新设置示例数据:

$ git push heroku
$ heroku pg:reset DATABASE
$ heroku run rake db:migrate
$ heroku run rake db:seed