为什么我不能使用AWS javascript sdk删除s3存储桶中的对象?

时间:2017-04-26 08:18:08

标签: javascript amazon-web-services amazon-s3 cors

我在s3上有一个带有对象的存储桶,我的网站可以通过aws javascript sdk删除。作为参考,我的网站托管在us-east-1区域的s3上,我需要通过网站删除其中包含对象的存储桶位于us-west-1。

我在网站上尝试了以下代码:

var bucketInstance = new AWS.S3({region: 'us-west-1'});
var params = {
    Bucket: 'MyBucketName',
    Key: 'photoToDelete.JPG'
};
bucketInstance.deleteObject(params, function (err, data) {
    if (data) {
        console.log("Photo deleted successfully");         
    }
    else {
        console.log("Check if you have sufficient permissions : "+err);                                
    }
});

但它没有成功 - 控制台中出现以下错误:

1)XMLHttpRequest无法加载https://MyBucketName.s3-us-west-1.amazonaws.com/photoToDelete.JPG。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许来源“https:// MyDomain .com”。响应的HTTP状态代码为403。

2)aws-sdk.js:2122 OPTIONS https://MyBucketName.s3.amazonaws.com/?max-keys=0 403(Forbidden)

3)XMLHttpRequest无法加载https://MyBucketName.s3.amazonaws.com/?max-keys=0。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许来源“https:// MyDomain .com”。响应的HTTP状态代码为403。

这些错误似乎在控制台中重复了一遍。

发生了什么事?

为了在我的代码中提及参考,我将如下配置AWS SDK:

AWS.config.region = 'us-east-1'; // 1. Enter your region

    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
        IdentityPoolId: 'us-east-1:*MyIdentityPoolId*' 
    });

我认为这些可能会导致一个问题,因为需要删除的对象所在的s3存储桶位于西1但是我的网站以及我设置的所有lambda函数和api网关都在east-1中这么自然我将AWS.config.region和凭据配置为东值。我不确定这是否可能导致这个问题。我明确地将s3区域设置为西1并且无法在us-west-1中创建IdentityPool,因此我怀疑这些配置值是否导致错误,但它们可能是错误的。

最后,us-west-1中包含需要删除的对象的s3存储桶具有以下存储桶策略:

{
    "Version": "2012-10-17",
    "Id": "Policy2354434234",
    "Statement": [
        {
            "Sid": "MakeItPublic",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::MyBucketName/*"
        }
    ]
}

我设置CORS配置如下:

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

我还为存储桶中的每个人设置了READ和WRITE权限。知道为什么我会得到这个非常令人沮丧的错误吗?

1 个答案:

答案 0 :(得分:0)

您需要以与错误中显示的方式相同的方式添加域名 &安培; AllowedHeader的信用卡

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