【问题标题】:Amazon S3 - accessing bucket from nodejs SDKAmazon S3 - 从 nodejs SDK 访问存储桶
【发布时间】:2017-01-03 21:15:35
【问题描述】:

我在使用 node SDK 从 nodejs 访问我的全新存储桶(通过 aws 控制台创建)时遇到了问题。我做的步骤(如果我遗漏了什么请帮忙)

  • 创建了一个 aws 帐户,所以我现在有了一个 root 用户
  • 为 SDK 创建了一个新的访问密钥
  • 转到 S3 并在控制台中创建了一个新存储桶
  • 在 nodejs 中,我尝试将某些内容上传到此存储桶,但我不断收到“拒绝访问”,没有进一步的解释。

我尝试了使用存储桶的不同区域以及生成新的访问密钥,还尝试为存储桶设置较低的权限,以至于我使用其中一个测试存储桶为每个人启用了所有功能,但仍然出现错误。

代码位:

    class SomeNodeService {

        constructor() {
            this.s3 = new S3({
                params: {
                    Bucket: 'some.bucket.which.name.is.unique',
                    accessKeyId: 'SOMEID',
                    secretAccessKey: 'SOMEID'
                }
            });
        }

        uploadAttachment(attachment) {
            const _this = this;
            return co(function * () {
                const file = yield _readFile(attachment.path, 'utf8');
                const key = `${KEY_PREFIX}attachment/${Date.now()}/${attachment.name}`;
                const params = {
                    Key: key,
                    Body: file
                };

                return yield _this.s3.putObject(params).promise();
            });
        }

    }

我不知道我错过了什么:S


根据@filipebarretto,我创建了一个新用户,并为该用户创建了新的访问令牌,并为他提供了 AmazonS3FullAccess。值得一提的是,我还创建了一个组名“sysadmin”,并为该组本身提供了 AmazonS3FullAccess 权限,因此将用户分配给该组导致也将权限授予用户。总而言之,我所做的一切

1) 创建新组 sysadm 2) 授予组权限“AmazonS3FullAccess” 3) 创建新用户 XY 并加入组 sysadm 4) 为 XY 用户重新创建访问令牌

但我仍然收到拒绝访问:/

【问题讨论】:

  • 您使用的凭据与 root 用户相关联?还是具有其他权限的其他用户?
  • 我对 AWS 还不是很熟悉,虽然我创建了一个用户并向他提供了 S3 IAM 角色,但对我来说,访问令牌似乎只绑定到 root 帐户/root用户而不是任何后续用户。
  • 能否添加您在问题中提供的政策?创建用户时,您可以为他创建凭据。您永远不应该在您的帐户根目录上拥有凭据。
  • @filipebarretto 我编辑了原始问题

标签: javascript node.js amazon-web-services amazon-s3


【解决方案1】:

要配置您的凭据,您可以使用:

AWS.config = new AWS.Config();
AWS.config.accessKeyId = "accessKey";
AWS.config.secretAccessKey = "secretKey";
AWS.config.region = "region";

这不是最好的,也不是最安全的方法。欲了解更多信息,请查看:http://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials.html

你应该在params中定义Bucket和Key,如:

const params = {
    Key: key,
    Body: file
};

return yield _this.s3.putObject(params).promise();

在您的构造函数上,仅使用:

constructor() {
    this.s3 = new S3();
}

var s3 = new AWS.S3();

参考:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property

【讨论】:

  • 同样的问题,不幸的是这并没有帮助:(但还是谢谢。
  • @Jim-Y 我补充了答案。试试看。
  • 谢谢,很遗憾这不是问题的根源,因为在应用程序的其他部分我们也将 AWS 用于其他事情,例如用于发送电子邮件的 AWS-SES,其中 API 有点“相同”我们提供了我在问题中所做的凭据。从环境变量中读取凭据并将它们作为参数提供给 SES/S3 构造函数。
猜你喜欢
  • 2017-02-12
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 2016-03-12
相关资源
最近更新 更多