【问题标题】:Why can't I delete an object in a s3 bucket with the AWS javascript sdk?为什么我不能使用 AWS javascript sdk 删除 s3 存储桶中的对象?
【发布时间】:2017-09-23 12:35:15
【问题描述】:

我在 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 选项https://MyBucketName.s3.amazonaws.com/?max-keys=0 403(禁止)

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

这些错误似乎在控制台中重复出现。

发生了什么事?

作为我之前代码中的参考,我像这样配置 AWS 开发工具包:

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

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

我认为这些可能会导致问题,因为需要删除的对象所在的 s3 存储桶位于 west 1,但我的网站以及我设置的所有 lambda 函数和 api 网关自然位于east-1我将我的 AWS.config.region 和凭证配置为东部值。我不确定这是否会导致这个问题。我明确地将 s3 区域设置为 west 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 权限。知道为什么我会收到这个非常令人沮丧的错误吗??

【问题讨论】:

  • 看起来 CORS 配置出了问题。您可以尝试将允许的来源更改为* 以重新测试吗?
  • 感谢您的建议 - 我将 origin 更改为 * 并且出现了相同的结果!
  • 在这里认真地抓住稻草,但我能找到的所有示例/示例都没有指定xmlns 或您拥有的版本/编码信息。

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


【解决方案1】:

添加域所需的内容与错误中显示的方式相同 & AllowedHeader 野卡

<?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>

【讨论】:

    猜你喜欢
    • 2017-03-06
    • 2020-05-12
    • 2016-05-10
    • 2012-02-14
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    相关资源
    最近更新 更多