正在运行heroku run rake db:migrate
,我收到此错误:Missing required arguments: aws_access_key_id, aws_secret_access_key
我在问题25596504中进行了修正建议,特别是将文件carrier_wave.rb
更改为carrierwave.rb
而没有运气。我正在按照Hartl教程页面688进行操作,该页面指定将它们添加为$heroku config:set S3_ACCESS_KEY=<access key>
我用实际密钥的引用和非引用版本替换了''。密钥显示在我运行heroku配置时,例如S3_ACCESS_KEY:
在我开始处理上传图像的教程的这一部分(11.4)之前,应用程序正在运行。顺便说一下,我知道费加罗的宝石;但是,我想尝试按照教程的方法。我错过了什么?任何想法将不胜感激。谢谢!
答案 0 :(得分:14)
继续使用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
答案 1 :(得分:12)
这是我在使用Heroku工作的大量工作之后的教程,如Michael Hartl的Ruby on Rails教程第11章所述。我希望它有所帮助:
让Rails教程示例应用程序在Heroku和AWS之间工作是一个巨大的痛苦。但我做到了。如果您找到了本教程,那意味着您可能遇到了一个无法通过的错误。没关系。我有几个。
您需要做的第一件事是回顾一下Hartl提供的代码。确保您完全按照所示键入(或复制/粘贴)。在本节中的所有代码中,您可能只需要添加一个小的附加内容。 “region”环境变量。如果您创建的存储桶不在默认的美国区域中,则需要这样做。稍后会详细介绍。以下是/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。
现在让我们转到您的AWS账户和安全性。
政策名称: 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/*"
]
}
]
}
这适用于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合作存储图片!
答案 2 :(得分:3)
我认为发生此错误是因为var名称不匹配。
在carrierwave.rb中,您应该使用前缀“aws”替换:s3_access_key_id和:s3_secret_access_key。
if Rails.env.production? CarrierWave.configure do |config| config.root = Rails.root.join('tmp') config.cache_dir = 'carrierwave' config.fog_credentials = { # Configuration for Amazon S3 :provider => 'AWS', # change var's name :aws_access_key_id => ENV['S3_ACCESS_KEY'], # change var's name :aws_secret_access_key => ENV['S3_SECRETE_KEY'] } config.fog_directory = ENV['S3_BUCKET'] end end
可以部署。
答案 3 :(得分:2)
无论出于何种原因,运行rake assets:precompile RAILS_ENV=development
为我解决了这个问题
[和env vars不需要命名S3_ACCESS_KEY
等,我使用aws.access_key_id
]
答案 4 :(得分:0)
在没有任何RAILS_ENV的情况下运行rake assets:precompile
是我可以让它进行预编译的唯一方法。