2013-04-12 417 views
1

我试图使用基本教程如下AWS node.js没有创建S3存储桶?

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

AWS.config.loadFromPath('./myawsconfig.json'); 
AWS.config.update({region: 'eu-west-1'}); 

var s3 = new AWS.S3(); 
s3.client.createBucket({Bucket: 'pBucket'}, function() { 
    var data = {Bucket: 'pBucket', Key: 'myKey', Body: 'Hello!'}; 
    s3.client.putObject(data, function(err, data) { 
    if (err) { 
     console.log("Error uploading data: ", err); 
    } else { 
     console.log("Successfully uploaded data to myBucket/myKey"); 
    } 
    }); 
}); 

创建一个S3桶,但我收到以下错误

node createbucket.js 
Error uploading data: { [NoSuchBucket: The specified bucket does not exist] 
    message: 'The specified bucket does not exist', 
    code: 'NoSuchBucket', 
    name: 'NoSuchBucket', 
    statusCode: 404, 
    retryable: false } 
+0

您确定您的令牌正在验证中,并且您的存储桶名称在整个S3中都是唯一的吗? –

+0

我只是将我的代码中的存储桶名称更改为绝对唯一的存储桶名称。我不确定我的令牌是否正在验证,但假设我会收到一个错误,说如果是这种情况,那么多吗? –

回答

1

我只是碰到了这个问题,显然节点.js教程代码不能编译。我得到一个var对象没有createBucket方法。

这工作:

var AWS = require('aws-sdk'); 
AWS.config.loadFromPath('./credentials.json'); 
// Set your region for future requests. 
AWS.config.update({region: 'us-east-1'}); 
// Create a bucket and put something in it. 
var s3 = new AWS.S3(); 
s3.client.createBucket({Bucket: 'hackathon-test'}, function() { 
    var data = {Bucket: 'hackathon-test', Key: 'myKey', Body: 'Hello!'}; 
    s3.client.putObject(data, function(err, data) { 
    if (err) { 
     console.log("Error uploading data: ", err); 
    } else { 
     console.log("Successfully uploaded data to myBucket/myKey"); 
    } 
    }); 
}); 
+0

AWS node.js S3教程是具体的 –

+0

工作就像一个魅力,谢谢! –

+0

这很有趣,因为除了config.json文件名,区域和存储桶名称之外,答案代码看起来与问题代码完全相同。真正的问题是什么? –

1

我有这个问题,发现我的API,用户没有权限创建桶。检查发现

稍微更彻底的错误这...

s3.client.createBucket({Bucket: 'someBucket'}, function(err) { 
    if (err) { 
     console.log("Error creating bucket: ", err); 
    } else { 
     console.log("Successfully created bucket 'someBucket'"); 
    } 
// ... 
0

根据AWS的S3存储名称限制。 您的存储桶名称不应包含任何大写字母。所以'pBucket'是无效的。

http://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html

为符合DNS斗名的规则是:

  • 桶名称必须至少为3,不超过63个字符长。
  • 存储桶名称必须是一系列一个或多个标签。相邻标签由一个单独的句点(。)分隔。存储桶名称可以包含 小写字母,数字和连字符。每个标签必须以小写字母或数字开头和结尾 。
  • 存储桶名称不得格式化为IP地址(例如,192.168.5.4),其格式为 。
  • 当使用带有SSL的虚拟 托管式存储桶时,SSL通配符证书只有 与不包含句点的存储桶相匹配。要解决此问题,请使用 HTTP或编写您自己的证书验证逻辑。
+1

谢谢@ 8bittree只是修改了答案。 〜 –

0

一对夫妇的指针,我错过了,有人可能会觉得有用

  • 如果设置区域为S3对象var s3 = new AWS.S3({region: 'us-west-1'});则调用将失败的一部分(在我的经验)。

  • 因此,可以通过任一

一个)AWS.config.update({ region: 'eu-west-1' });

B被设定的区域)作为则params的部分上createBucket

s3.createBucket({ Bucket: bucketName, CreateBucketConfiguration: { LocationConstraint: "eu-west-1" } }, function() {

也,注意大写字母或下划线,因为这也花了我一个小时的时间(仅限DNS兼容)。