使用ACL调用upload_file时,Ruby 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) 

这似乎工作正常,除了该文件不公开,我无法获得它的公共URL。 但是当我登录S3时,我可以看到我的文件很好。

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

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

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

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

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

  1. 示例存储桶策略
  2. 策略生成器
  3. IAM策略元素参考

我创建了一个策略,允许特定用户为我的存储桶提供对象上载,对象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为“*”)直到你可以获得function。 然后,一旦你开始工作,就通过更改Principal来减少访问列表。