使用 Rails 和 Paperclip 的 s3 简单 Amazon IAM 策略
Simple Amazon IAM policy for s3 using Rails and Paperclip
我的 IAM 策略应该是什么样子才能允许用户 my-user
访问名为 my-bucket
的 Amazon S3 存储桶?
目前,我已将以下政策分配给 my-user
:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::my-bucket"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::my-bucket/*"]
}
]
}
我从 "Sample 1" 获得了以下 link 的政策:
在我的 production.rb
文件中,我实现了配置设置来告诉回形针使用 S3:
config.paperclip_defaults = {
:storage => :s3,
:s3_credentials => {
:bucket => 'my-bucket',
:access_key_id => ENV['AWS_ACCESS_KEY_ID'],
:secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
}
}
当我尝试使用我的应用程序上传照片时,我收到 AWS::S3::Errors::AccessDenied
异常。
奇怪的是,如果我加载 rails 控制台,然后 运行 以下代码手动上传文件,它可以正常工作:
s3 = AWS::S3.new(access_key_id: ENV['AWS_ACCESS_KEY_ID'], secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'])
bucket = s3.buckets['my-bucket']
obj = bucket.objects['new_file']
obj.write(Pathname.new('/path/to/file'))
这会将文件正确上传到我的 S3 存储桶。我很困惑为什么我明明有权以这种方式上传文件,但是当我尝试使用相同的凭据通过回形针进行上传时,我收到了权限被拒绝的错误。
更令人困惑的是,当我将 AdministratorAccess
策略分配给 my-user
时,paperclip 能够成功上传文件。
知道如何解决这个问题吗?
解决方法在这里:
当paperclip将文件上传到S3时,它还会尝试将文件设置为公开可见,这意味着用户需要获得访问权限才能设置权限。向我的 IAM 策略添加 s3:PutObjectAcl
权限解决了这个问题。
我的 IAM 策略应该是什么样子才能允许用户 my-user
访问名为 my-bucket
的 Amazon S3 存储桶?
目前,我已将以下政策分配给 my-user
:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::my-bucket"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::my-bucket/*"]
}
]
}
我从 "Sample 1" 获得了以下 link 的政策:
在我的 production.rb
文件中,我实现了配置设置来告诉回形针使用 S3:
config.paperclip_defaults = {
:storage => :s3,
:s3_credentials => {
:bucket => 'my-bucket',
:access_key_id => ENV['AWS_ACCESS_KEY_ID'],
:secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
}
}
当我尝试使用我的应用程序上传照片时,我收到 AWS::S3::Errors::AccessDenied
异常。
奇怪的是,如果我加载 rails 控制台,然后 运行 以下代码手动上传文件,它可以正常工作:
s3 = AWS::S3.new(access_key_id: ENV['AWS_ACCESS_KEY_ID'], secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'])
bucket = s3.buckets['my-bucket']
obj = bucket.objects['new_file']
obj.write(Pathname.new('/path/to/file'))
这会将文件正确上传到我的 S3 存储桶。我很困惑为什么我明明有权以这种方式上传文件,但是当我尝试使用相同的凭据通过回形针进行上传时,我收到了权限被拒绝的错误。
更令人困惑的是,当我将 AdministratorAccess
策略分配给 my-user
时,paperclip 能够成功上传文件。
知道如何解决这个问题吗?
解决方法在这里:
当paperclip将文件上传到S3时,它还会尝试将文件设置为公开可见,这意味着用户需要获得访问权限才能设置权限。向我的 IAM 策略添加 s3:PutObjectAcl
权限解决了这个问题。