403在POST到S3存储桶期间被禁止

时间:2017-06-09 22:30:13

标签: amazon-web-services amazon-s3 aws-sdk amazon-cognito amazon-iam

我正在关注this tutorial将简单的照片上传服务部署到S3存储桶。

我使用以下政策

创建了一个新角色
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "s3:*"
         ],
         "Resource": [
            "arn:aws:s3:::BUCKET_NAME/*"
         ]
      }
   ]
}

授予桶中所有授权AWS用户列表和读/写访问权限,设置以下CORS

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <AllowedMethod>HEAD</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

生成一个新的Cognito标识池并在上面的链接中运行该脚本。它运行成功,它打开一个新专辑,我可以在S3控制台中看到它,但当我尝试将照片上传到相册时,我收到错误:

BUCKET_NAME.amazonaws.com/ALBUM_NAME//PHOTO_NAME.jpeg?uploads:1 POST https://BUCKET_NAME.amazonaws.com/ALBUM_NAME//PHOTO_NAME.jpeg?uploads 403 (Forbidden)

当我尝试访问脚本生成的链接时,我得到了这个XML:

<Error>
<Code>InvalidRequest</Code>
<Message>
Key is not expected for the GET method ?uploads subresource
</Message>
<RequestId>******</RequestId>
<HostId>
******
</HostId>
</Error>

知道为什么会出现这个问题吗?

4 个答案:

答案 0 :(得分:1)

您正在进行HTTP POST,而不是HTTP PUT。如果你想传递密钥,你应该使用PUT。如果您想进行POST,则需要按照此page中的说明传递正文中的密钥。

答案 1 :(得分:0)

您缺少s3存储桶的部分权限。

  

在此示例中,您希望授予您的AWS账户中的IAM用户访问您的某个存储桶,例如存储桶,并允许用户添加,更新和删除对象。

     

除了向用户授予s3:PutObject,s3:GetObject和s3:DeleteObject权限之外,该策略还授予s3:ListAllMyBuckets,s3:GetBucketLocation和s3:ListBucket权限。这些是控制台所需的其他权限。有关向用户授予权限并使用控制台see An Example Walkthrough: Using user policies to control access to your bucket.

对其进行测试的示例演练
{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListAllMyBuckets"
         ],
         "Resource":"arn:aws:s3:::*"
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListBucket",
            "s3:GetBucketLocation"
         ],
         "Resource":"arn:aws:s3:::examplebucket"
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:GetObject",
            "s3:DeleteObject"
         ],
         "Resource":"arn:aws:s3:::examplebucket/*"
      }
   ]
}

http://docs.aws.amazon.com/AmazonS3/latest/dev/example-policies-s3.html

答案 2 :(得分:0)

我也有同样的问题。我没有删除ACL:“ public-read”,而是将其更改为“ public-read-write”,并且可以正常工作。我只能假定由于存储桶策略是可读写的,因此尝试将其设置为只读会导致冲突...但是只是猜测。

答案 3 :(得分:0)

这很旧,但是以防万一有人在使用Cognito上传时偶然发现它。

在我的情况下,问题是我的S3 (us-east-1)的区域与Cognito服务器区域(eu-west-1)不同。大多数在线示例仅设置一个区域,默认情况下,上传使用同一区域。

因此在Javascript中,要进行身份验证,您需要设置Cognito区域:

AWS.config.region = 'eu-west-1'; // Cognito Region
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'eu-west-1:51a4f410-7694-4222-89b5-...',
});

然后在上传之前,设置您的S3存储桶区域:

var s3 = new AWS.S3({
  region: 'us-east-1', //Bucket region
  apiVersion: '2006-03-01',
  params: {Bucket: [BUCKET-NAME]}
});