当前位置: 首页 > 知识库问答 >
问题:

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

丁均
2023-03-14

我不知道如何(或者在哪里)从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 bucket-完成

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:重置数据库-完成

7) heroku运行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)

共有3个答案

高胜
2023-03-14

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

进入Heroku,进入应用程序,进入设置,点击显示配置变量。

单击右侧的“编辑”,然后在此处输入您的秘密:

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
锺离逸春
2023-03-14

服务中-

邢嘉祯
2023-03-14

这是我的教程,我创建它的目的是为了从Michael Hartl在Ruby on Rails教程(第三版)第11章的结尾处开始。它应该能回答你的问题,甚至更多。

把火车修好。在Heroku和AWS之间运行的org示例应用程序是一个巨大的麻烦,但我做到了。如果您找到了本教程,这意味着您可能遇到了无法克服的错误。那很好。我有一些。

2020年注:这里引用S3区域的所有内容可能不再需要,或者可能从未需要过。当我最初让这一切正常工作时,是在添加了区域信息之后。但是,S3存储桶都共享一个全局名称空间。因此,如果有人还在读这篇文章,请先在没有区域内容的情况下尝试所有内容,并对其是否有效发表评论。无论如何,回到教程。。。

您需要做的第一件事是回顾Hartl提供的代码。确保键入(或复制/粘贴)的内容与所示内容完全一致。在本节的所有代码中,您可能只需要做一个小的添加。“区域”环境变量。如果您创建的bucket不在默认的US区域中,则需要执行此操作。稍后将对此进行详细介绍。这是/config/initializers/carrier\u 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

那一行:区域=

您应该使用如图所示的代码块。不要把你的钥匙放在那里。我们会把它们分别送到希罗库。

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

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

  1. 首先,创建您的AWS帐户。在大多数情况下,这就像注册任何网站一样。制作一个漂亮的长密码并将其存储在安全的地方,比如加密密码管理器。当您创建帐户时,您将获得第一套AWS密钥。在本教程中,您将不会使用这些工具,但在将来的某个时候您可能需要它们,所以也请将它们保存在安全的地方

策略名称: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/*"
            ]
        }
    ]
}

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

现在是Heroku配置。这些内容在您的命令提示符下输入,就像“heroku run rake db:migrate”之类。在这里,您可以输入从先前创建的“fog”用户处获得的实际访问密钥和密钥。

$ 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

如果这不起作用,谷歌“AWS S3地区代码”。

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

 类似资料:
  • 我正在尝试制作一个使用数据库的java应用程序。我已经下载了db2并创建了一个用户'student'。我的程序中有以下几行: 显然,我几乎不知道我在做什么,我不知道如何给予“学生”必要的特权。也就是说,我不知道什么用户可以给他特权,因为我从来没有创建过另一个用户。我看到有人提到过'db2admin'(我使用的是windows),但我不知道该如何处理这段信息。我不知道如何检查现有用户,也不知道对db

  • 我正在编写一个Python应用程序,它从帐户a提取数据并发送到帐户B中的SQS队列。执行lambda函数时,它返回以下错误: "errorMessage":"调用SendMessage操作时发生错误(AccessDended):拒绝访问资源https://eu-central-1.queue.amazonaws.com/。", 如果我在同一个帐户中使用SQS队列,它就会工作。 我使用的是无服务器框

  • 问题内容: 我看过许多类似的问题,因此表明我已经检查了基础知识。当然,这并不意味着我没有错过任何显而易见的东西。:-) 我的问题是:为什么我拒绝具有特权的用户访问权限,而我却已经在其中输入密码并被授予访问权限?(为了完整起见,我尝试输入错误的密码只是为了确保MySQL客户端在程序启动时拒绝我访问。) 背景: 通过ssh登录到运行MySQL服务器的计算机的外壳,我以root用户身份登录: 太棒了 我

  • 文档建议将服务帐户添加到GApps的第三方oauth访问列表必须由域管理员手动完成:https://developers.google.com/drive/delegation#delegate_domain-wide_authority_to_your_service_account 有没有一种方法可以通过身份验证页面来实现这一点?

  • 问题内容: 我在注册后使用以下方法进行程序化登录 用户已通过身份验证,但始终具有ROLE_ANONYMOUS我不知道为什么?有任何想法吗 ? 问题答案: 这种现象看起来很奇怪。Javi建议手动将安全性上下文持久化到会话中,但是应该由Spring Security的自动完成。 一个可能的原因,我可以想像是在你的登记处理的页面。 禁用指定URL的所有安全过滤器。如你所见,它可能会干扰Spring Se

  • 已试过 获取 错误1064(42000):您的SQL语法中有错误;查看与您的MySQL服务器版本相对应的手册,了解第1行“标识由'root'WITH GRANT option”附近使用的正确语法。 注意:在以前的版本中尝试时同样有效。 也试过 获取 错误1410(42000):不允许创建具有授权的用户 MySQL(8.0.11.0)用户名/密码是root/root。