连接到 AWS-SDK 时的 Node.js 303 永久重定向

Posted

技术标签:

【中文标题】连接到 AWS-SDK 时的 Node.js 303 永久重定向【英文标题】:Node.js 303 Permanent Redirect when connecting to AWS-SDK 【发布时间】:2013-04-13 19:33:09 【问题描述】:

下午好,

我正在尝试建立与我的 aws 产品 api 的连接,但是我不断收到 301 永久重定向错误,如下所示:

 [PermanentRedirect: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.]
  message: 'The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.',
  code: 'PermanentRedirect',
  name: 'PermanentRedirect',
  statusCode: 301,
  retryable: false 

我用来连接API的代码如下:

var aws = require('aws-sdk');

//Setting up the AWS API
aws.config.update(
    accessKeyId: 'KEY',
    secretAccessKey: 'SECRET',
    region: 'eu-west-1'
)

var s3 = new aws.S3();

s3.createBucket(Bucket: 'myBucket', function() 
    var params = Bucket: 'myBucket', Key: 'myKey', Body: 'Hello!';
    s3.putObject(params, function(err, data) 
        if (err)
            console.log(err)
        else
            console.log("Successfully uploaded data to myBucket/myKey");
    );
);

如果我尝试使用不同的区域,例如 us-west-1,我会得到同样的错误。

我做错了什么?

提前非常感谢您!

【问题讨论】:

哦,好吧,那我该如何让它工作 - 或者有什么问题? 这里可能是显而易见的:跟随重定向。但是,您使用的 API 可能存在缺陷,它不遵循您的重定向。 This answer is related. 哇!修复!问题是我没有在我的 S3 控制台中创建任何存储桶!还是谢谢老哥! 【参考方案1】:

我已经解决了这个问题:

您必须确保您已经创建了同名的存储桶;在这种情况下,存储桶的名称将是“myBucket”。

s3.createBucket(Bucket: 'myBucket', function() 
var params = Bucket: 'myBucket', Key: 'myKey', Body: 'Hello!'; 

创建存储桶后,转到属性并查看它正在使用的区域 - 将其添加到:

aws.config.update(
    accessKeyId: 'KEY',
    secretAccessKey: 'SECRET',
    region: 'eu-west-1'
)

现在应该可以了!最好的祝福

【讨论】:

【参考方案2】:

我刚刚遇到这个问题,我认为http://aws.amazon.com/sdkfornodejs/ 的示例不正确。

演示代码的问题是 Bucket 名称应该小写 - http://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html

如果演示在 s3.createBucket 的回调中实际输出 err 参数,这将是显而易见的。

此外,存储桶名称在您创建它们的区域中必须是唯一的。

s3.createBucket(Bucket: 'mylowercaseuniquelynamedtestbucket', function(err) 

    if(err)
        console.info(err);
    else
        var params = Bucket: 'mylowercaseuniquelynamedtestbucket', Key: 'testKey', Body: 'Hello!';
        s3.putObject(params, function(err, data) 
            if (err)
                console.log(err)
            else
                console.log("Successfully uploaded data to testBucket/testKey");
        );
    

 )

【讨论】:

存储桶名称在整个 S3 中必须是唯一的,而不仅仅是特定区域。【参考方案3】:

在这个问题上卡了一段时间......

在我的配置文件中设置区域名称或将其留空都解决了这个问题。我遇到了谈论解决方案的要点,这很简单:

给定:

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

在实例化您的 S3 对象之前,请执行以下操作:

AWS.config.update("region": "us-west-2") //replacing your region there

然后我可以毫无问题地调用以下命令:

var storage = new AWS.S3();
var params = 
                Bucket: config.aws.s3_bucket,
                Key: name,
                ACL:'authenticated-read',
                Body: data
            
storage.putObject(params, function(storage_err, data)...)

【讨论】:

以上是关于连接到 AWS-SDK 时的 Node.js 303 永久重定向的主要内容,如果未能解决你的问题,请参考以下文章

通过 node.js 连接到 mysql 时出现未知数据库错误

连接到 Heroku PostgreSQL 数据库时的身份验证错误

wbhook 通过 ngrok 连接到本地 node.js 服务器,服务触发 Webhooks 需要密码吗?

无法在 aws-sdk(node.js)中收到 503 错误(服务不可用)的响应

从 Heroku 上的 Node.js 连接到 CloudSQL

为啥我在 s3 上的访问被拒绝(使用适用于 Node.js 的 aws-sdk)?