更新:我最终回答了我自己的问题。有关解决此问题的教程,请参阅“答案”部分。
问题: 外部源通过API控件访问AWS S3存储桶所需的策略究竟是什么?
详细信息: 我跟随Michael Hartl的Rails教程,我到了第11课的末尾,我们使用CarrierWave将图像文件存储在AWS S3存储桶中。我能够让它工作(必须添加区域ENV变量),但只能与具有完全管理员权限的用户。显然这并不理想。我专门为此目的创建了一个用户帐户,但所有演练似乎只关注Web浏览器访问。事实上,我能够创建允许用户只能在特定存储桶中读取,写入和删除的策略,但这只能通过Web浏览器而不是通过API工作。只有在我附加AdministratorAccess策略时,API访问才有效。
这是我到目前为止所拥有的:
政策:AllowRootLevelListingOfMyBucket
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowGroupToSeeBucketListAndAlsoAllowGetBucketLocationRequiredForListBucket",
"Action": [
"s3:ListAllMyBuckets",
"s3:GetBucketLocation"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::*"
]
},
{
"Sid": "AllowRootLevelListingOfMyBucket",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::MyBucket"
],
"Condition": {
"StringEquals": {
"s3:prefix": [
""
],
"s3:delimiter": [
"/"
]
}
}
}
]
}
政策:AllowUserToReadWriteObjectDataInMyBucket
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowUserToReadWriteObjectDataInMyBucket",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::MyBucket/*"
]
}
]
}
正如我所说,这允许Web浏览器访问,但API访问尝试返回" AccessDenied"错误:Excon :: Errors :: Forbidden(预期(200)< => Actual(403 Forbidden)
我需要为API访问添加什么内容?
更新:我已经缩小了一点问题。有一些"动作"我需要给予许可,但我还没能完全确定行动。但是使用通配符可以工作,并且我已经能够锁定用户帐户,只能访问一个存储桶。以下是我所做的更改:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowUserToReadWriteObjectDataInMyBucket",
"Action": [
"s3:*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::MyBucket/*"
]
}
]
}
答案 0 :(得分:0)
我最终回答了我自己的问题,并创建了其他人可能想要遵循的教程:
您需要做的第一件事是回顾一下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合作存储图片!