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

时间:2015-02-11 21:50:16

标签: ruby-on-rails amazon-web-services railstutorial.org amazon-iam

我不知道如何(或在何处)从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 <top (required)>'
/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 `<top (required)>'
/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 <class:Engine>'
/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 <class:Engine>'
/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 `<top (required)>'
/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)

4 个答案:

答案 0 :(得分:7)

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

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

您需要做的第一件事是回顾一下Hartl提供的代码。确保您完全按照所示键入(或复制/粘贴)。在本节中的所有代码中,您可能只需要添加一个小的附加内容。 &#34;地区&#34;环境变量。如果您创建的存储桶不在默认的美国区域中,则需要这样做。稍后会详细介绍。以下是/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部分并制作一个存储桶。它必须具有唯一性 名字,所以我通常只把日期放在最后,就是这样。例如,您可以将其命名为&#34; my-sample-app-bucket-20160126&#34;。一旦您 创建了您的存储桶,单击该名称,然后单击“属性”。 了解什么&#34; Region&#34;你的水桶在。找到它, 并记下它。你以后会用它。
  3. 您的主帐户可能拥有对所有内容的完全权限,因此请不要使用它来在两个Web服务之间传输随机数据。如果它出来,这可能会花费你很多钱。我们会改为限制用户。 在IAM部分创建一个新用户。我将其命名为#34; fog&#34;,因为它是处理发送和接收的云服务软件。创建它时,您可以选择显示和/或下载与新用户关联的键。保持安全是非常重要的 和安全的地方。它不会进入你的代码,因为那可能会 最终进入其他人可以看到它的存储库。另外,不要这样做 新用户密码,因为它不会登录AWS仪表板。
  4. 制作一个新组。我打电话给我的&#34; s3railsbucket&#34;。这就是 权限将被分配。添加&#34;雾&#34;这个小组。
  5. 转到“政策”部分。点击&#34;创建政策&#34;然后选择&#34;创建你的 自己的政策&#34;。给它一个以&#34;允许&#34;开头的名字。所以它会出现在附近 政策列表的顶部。这是一个巨大的清单。这就是我的所作所为:
  6. 政策名称: AllowFullAccessToMySampleAppBucket20160126
    描述:允许对名为的S3存储桶进行远程写入/删除访问 我的样本应用程序内斗 - 20160126。
    政策文件:

    {
        "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. 返回“群组”部分,选择您制作的群组,然后添加 您对集团的新政策。
    2. 这适用于AWS配置。我不需要制定政策允许 &#34;雾&#34;列出存储桶的内容,即使我尝试了大多数教程 说这是必要的。我认为只有你想要一个用户才有必要 可以通过仪表板登录。

      现在为Heroku配置。这些东西输入你的 命令提示符,就像&heroku run rake db:migrate&#39;等等。这是 您可以在其中输入实际访问密钥和密钥,您可以从&#34; fog&#34;您之前创建的用户。

      $ 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&#34; AWS S3区域代码&#34;。

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

答案 1 :(得分:4)

Services -> IAM中,点击1 User(s)下面的IAM Resources。选择您要获得权限的用户。在此用户的个人资料中,点击Attach User Policy。点击Select Amazon S3 Full Access,最后Apply Policy

答案 2 :(得分:4)

将来的其他人,this answer helped me a lot

继续使用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

答案 3 :(得分:0)

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

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

  

继续使用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的指示完成了这一章。

  

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

     

$ 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