无法从S3存储桶中“获取对象”-策略不起作用

时间:2018-10-17 03:12:47

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

我已经花了十多个小时(我知道),但是根本无法了解它。


更新-请参阅QN底部


场景

我有一个应用程序,允许用户将对象上传到S3,然后在以后随时将其下载。

使用以下策略,上传就可以了,但是getObject调用却可以。

IAM用户政策

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        }
    ]
}

我上面也尝试了其他一系列更细粒度的策略,但是没有一个起作用,因此,为了使它起作用,我正在尝试设置一个用户策略,该策略使用以下命令授予对AWS的根级别访问权限:旨在从那里进行微调。

时段政策

我认为不需要任何存储桶策略,但是,就其价值而言,我没有尝试以下策略:

{
    "Version": "2012-10-17",
    "Id": "AWSGeneratedPolicyId",
    "Statement": [
        {
            "Sid": "RandomSidGeneratedHere",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::305492142848:user/username-this-line-copy-pasted-from-AWS-IAM-console"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucketname",
                "arn:aws:s3:::bucketname/*"
            ]
        }
    ]
}

函数调用getObject:

const params = {
        Bucket: 'bucketname',
        Key: 'objectkey',
    };
    s3.getObject(params, function(err, data) {
        if (err) {
            console.log(err.message);
        } else {
            console.log(data);
        }
    });

结果和错误消息

<Error>
  <Code>AccessDenied</Code>
  <Message>Access Denied</Message>
  <RequestId>FC1698B03B31AF06</RequestId>
  <HostId>
    ZDDPr+WHCAnoAY/FyGTZA3iv8+L9R0r5CYGI5Owf/DOsItmsU5BSEtD8qXAZc4UHSgSqv2zneH4=
  </HostId>
</Error>

故障排除:

我知道凭据是正确的,因为上传效果很好 我知道上面的“测试”硬编码函数是正确的(就存储桶名称和键而言),因为如果我将存储桶更改为“公共”以供读取,则对getObject的函数调用可以正常工作< / p>

以上内容暗示所涉IAM用户没有对getObject的许可-但根据所应用的用户策略,还需要更多许可吗?

任何建议都值得赞赏(注意-我浏览了论坛并看到了类似的问题,但似乎没有一个答案对我有用)

更新

一时兴起,我更改了功能来做到这一点:

s3.listBuckets({}, function(err, data) {
    if (err) console.log(err, err.stack);
    console.log(data);
}

并且我没有列出所有预期的存储桶,而是从其他帐户获取存储桶列表。尽管以下是顶部的代码,但这种情况仍在发生:

const AWS = require('aws-sdk');

AWS.config = new AWS.Config();
AWS.config.accessKeyId = process.env.AWS_KEY;
AWS.config.secretAccessKey = process.env.AWS_SECRET;
AWS.config.region = 'ap-southeast-2';

const s3 = new AWS.S3();

现在,这种怪异是有道理的-列出的存储桶是完全在另一个AWS账户上的存储桶(我在尝试serverless.com框架时创建的存储桶)。

假设

本地服务器的配置已固定,并且代码中设置的配置属性没有影响。

我可以通过将完全相同的代码部署到按预期方式工作的实际服务器上来确认这种情况(即getObject调用可以正常工作)

修订后的问题:

如何清除“缓存”或保持这些值的终端中的所有内容?这是iTerm / serverless.com的错误吗(如果可以的话,我可以在...中采取必要的步骤)。如果不是错误,而是预期的行为,将来应如何避免?

2 个答案:

答案 0 :(得分:0)

我已经尝试过此政策,并且可以解决问题。

尝试使用我的存储桶策略下的*(仅舍弃)访问所有AWS IAM帐户,另一件事,为什么要使用expire属性?无论如何,请尝试删除该行。

Foo

另外,当您上传图片时,请检查是否分配了ACL属性:

{
    "Version": "2012-10-17",
    "Id": "AWSGeneratedPolicyId",
    "Statement": [
        {
            "Sid": "RandomSidGeneratedHere",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucketname/*"
        }
    ]
}

编码愉快!

答案 1 :(得分:0)

好吧,根据更新的问题以及listObjects函数调用的线索,我发现在服务器运行时,AWS config忽略了我的凭证,而是使用存储在路径中的凭证:{{ 1}}。

解决方案:

删除提到的~/.aws/credentials文件,所有文件应能正常工作...