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

Ale*_*lek 5 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
Run Code Online (Sandbox Code Playgroud)

这是教程中的过程: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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

Max*_*der 9

这是我创建的教程,用于了解Michael Hartl在Ruby on Rails教程(第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
Run Code Online (Sandbox Code Playgroud)

这条线: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/*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)

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

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

如果这不起作用,Google"AWS S3区域代码".

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


Flo*_*rry 5

Services -> IAM,点击1 User(s)下方IAM Resources。选择您想要拥有该权限的用户。在此用户的个人资料中,单击Attach User Policy。点击SelectAmazon S3 Full Access最后Apply Policy


Ale*_*lek 4

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

继续 Heroku,在您的应用程序上,转到设置,点击“显示配置变量”。

单击右侧的“编辑”并在其中输入您的密码:

S3_BUCKET: name of your bucket goes here
S3_ACCESS_KEY: xxxxx
S3_SECRET_KEY: xxxx
Run Code Online (Sandbox Code Playgroud)

在 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
Run Code Online (Sandbox Code Playgroud)