Ruby S3"访问被拒绝"使用ACL调用upload_file时出错

时间:2015-08-31 20:53:08

标签: ruby amazon-s3

我试图编写一个Ruby脚本,将文件上传到AWS并使文件公开。我做了以下事情:

s3 = Aws::S3::Resource.new(
    credentials: Aws::Credentials.new(KEY, SECRET),
    region:'us-west-2'
)
obj = s3.bucket('stg-db').object('key')
obj.upload_file(filename)

这似乎工作正常,但文件不公开,我无法获取公共网址。但是当我登录S3时,我可以很好地看到我的文件。

为了公开发布,我将最后一行更改为

obj.upload_file(filename, acl: 'public-read')

但是当我这样做时,我收到了拒绝访问权限的错误。我的S3存储桶上是否存在一些导致问题的权限设置,或者我是否以某种方式错误地调用了这个设置?

1 个答案:

答案 0 :(得分:8)

花了更多的时间比我想承认使用S3存储桶策略,我想出了如何让它工作。

我强烈推荐这三个AWS资源:

  1. Example Bucket Policies
  2. Policy Generator
  3. IAM Policy Elements Reference
  4. 我创建了一个策略,允许特定用户拥有对我的存储桶的对象上载,对象ACL和对象删除权限。这是JSON:

    {
    "Version": "2012-10-17",
    "Id": "Policy1441134540846",
    "Statement": [
        {
            "Sid": "Stmt1441134537688",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::MY_USER_ID:user/myemail@example.com"
            },
            "Action": [
                "s3:DeleteObject",
                "s3:PutObjectAcl",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::MY_BUCKET/*"
        }
    ]
    }
    

    一些提示:

    • 上面第3点中的参考有助于理解JSON的“Principal”部分。只需在IAM中创建一个用户,并填写相应的信息。
    • 资源部分可能有点挑剔。根据您授予的权限,您需要考虑是否应该指定存储桶中的对象(因此在MY_BUCKET之后为“/ *”)或存储桶本身。如果您在尝试保存存储桶时开始出现错误(“操作不适用于语句中的任何资源......”,您可能指定了错误的资源。
    • 最后一件事你可以尝试只是向所有人开放你的权限(指定Principal为“*”),直到你可以获得功能。然后,一旦你完成任务,就通过更改Principal来减少访问列表。