配置Amazon S3编程PUT访问

时间:2014-10-07 22:43:41

标签: amazon-web-services amazon-s3

我在S3中设置了一个存储桶,test-bucket,我正在尝试配置用户IAM策略,以允许从我在其他地方托管的网络应用程序进行编程访问。这只是一个没有文件夹的简单扁桶。

我在IAM配置中添加了一个用户,并创建了一组访问密钥。最后,我设置了一个如下所示的访问策略:

{
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListAllMyBuckets"
         ],
         "Resource":"arn:aws:s3:::*"
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListBucket",
            "s3:GetBucketLocation"
         ],
         "Resource":"arn:aws:s3:::test-bucket"
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:GetObject", 
            "s3:DeleteObject"
         ],
         "Resource":"arn:aws:s3:::test-bucket/*"
      }
   ]
}

使用它,我可以成功地以编程方式列出我的存储桶的内容并下载存储桶中的单个文件。但是当我尝试以编程方式上传内容时,我收到Access Denied错误:

<Error>
  <Code>AccessDenied</Code>
  <Message>Access Denied</Message>
  ...
</Error>

我知道此策略适用于GET和LIST:例如,当我从策略中删除行"s3:GetObject"时,下载不再有效。但对于我的生活,我无法弄清楚为什么上传不起作用。我通过在localhost上运行的webapp来测试这一切。关于如何上传工作的任何想法?

1 个答案:

答案 0 :(得分:1)

原来我需要添加以下权限:

"s3:PutObjectAcl"

所以允许的操作现在看起来像这样:

"Action":[
        "s3:PutObject",
        "s3:PutObjectAcl"
        "s3:GetObject", 
        "s3:DeleteObject"
     ]

我从here得到了这个想法,但我不完全确定为什么这适用于我,因为我没有更改文件的权限。但它确实有效。