我正在关注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>
知道为什么会出现这个问题吗?
答案 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]}
});