【问题标题】:AWS node.js not creating S3 bucket?AWS node.js 没有创建 S3 存储桶?
【发布时间】:2017-05-31 15:58:23
【问题描述】:

我正在尝试使用基本教程来创建一个 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");
    }
  });
});

但我收到以下错误

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 }

【问题讨论】:

  • 您确定您的令牌正在被验证并且您的存储桶名称在所有 S3 中都是唯一的吗?
  • 我刚刚将代码中的存储桶名称更改为绝对唯一的存储桶名称。我不确定我的令牌是否正在被验证,但假设我会收到一个错误,说明如果是这样的话?

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


【解决方案1】:

我刚遇到这个问题,显然 Node.js 教程代码无法编译。我有一个 var Object 没有 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");
    }
  });
});

【讨论】:

  • AWS node.js S3 教程要具体
  • 这很有趣,因为除了配置 .json 文件名、区域和存储桶名称之外,答案代码看起来与问题代码相同。真正的问题是什么?
  • 我认为存储桶在 S3 端的配置方式改变了一些事情。需要为帐户令牌信息设置读/写权限。我认为代码实际上并没有改变任何东西,但我不确定
  • 与AWS官方教程相比,我不得不改变两点:1-删除区域设置,2-使用s3.client而不是s3
【解决方案2】:

我遇到了这个问题,发现我的 api 用户没有创建存储桶的权限。

稍微更彻底的错误检查揭示了这一点......

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

【讨论】:

    【解决方案3】:

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

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

    符合 DNS 的存储桶名称的规则是:

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

    【讨论】:

      【解决方案4】:

      我错过了一些建议,可能有人会觉得有用

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

      • 因此,您可以通过任一方式设置区域

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

      b) 作为 createBucket 参数的一部分

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

      另外,请注意存储桶名称中的大写或下划线,因为这也占用了我一个小时的时间(仅符合 DNS 标准)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-10
        • 2020-05-26
        • 2020-05-04
        • 1970-01-01
        • 2020-12-31
        • 2017-10-09
        • 2017-04-24
        • 2020-07-16
        相关资源
        最近更新 更多