如何为Node.JS配置AWS S3 SDK以使用FakeS3?

时间:2013-11-30 21:31:27

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

我正在尝试使用fakes3作为我编写的一些简单S3代码的端点。我不能超越连接阶段。

目前的错误是:NetworkingError: getaddrinfo ENOTFOUND

我有配置设置:

"aws": {                                
    "accessKeyId": "123",               
    "secretAccessKey": "abc",           
    "region": "",                       
    "endpoint": "http://localhost:8081",
    "sslEnabled": false                 
}               

var AWS = require('aws-sdk');
// loaded the config into an object called `config`:

AWS.config.update(config.aws);
s3 = new AWS.S3();
// also tried creating an `EndPoint`:
s3.endpoint = new AWS.Endpoint(config.aws.endpoint);  

当我尝试简单的代码时:

s3.putObject({ Bucket: 'logging', Key: "logging123", Body: "started" }, 
   function(err, data) {
   if (err) {
       console.log(err);
   }
});

发生上述错误。当我不通过直接设置endPoint时,会向East AWS区域发出请求(并忽略我通过配置传递的endpoint值。)

而且,我正在使用命令行运行fakes3

fakes3 -r c:\temp\_fakes3 -p 8081
Loading FakeS3 with c:/temp/_fakes3 on port 8081 with hostname s3.amazonaws.com
[2013-11-30 14:20:22] INFO  WEBrick 1.3.1
[2013-11-30 14:20:22] INFO  ruby 2.0.0 (2013-06-27) [x64-mingw32]
[2013-11-30 14:20:22] INFO  WEBrick::HTTPServer#start: pid=11800 port=8081

2 个答案:

答案 0 :(得分:18)

在AWS开发工具包docs中,有以下选项:

s3ForcePathStyle(boolean)

  

返回是否强制S3对象的路径样式URL

我已经测试过它可以使用这个配置:

var config = {
  accessKeyId: "123",
  secretAccessKey: "abc",
  endpoint: "localhost:3000",
  sslEnabled: false,
  s3ForcePathStyle: true
};
AWS.config.update(config);
s3Client = new AWS.S3();

答案 1 :(得分:1)

请求将发送至:

logging.127.0.0.1:8081

'“logging”`是存储桶名称(这有意义,因为S3的SDK总是将存储桶作为URL的一部分发送)。由于该名称无法正确解析到计算机,因此失败了。

因此,请尝试使用37signals中的简单动态DNS,并将配置更改为:

"endpoint": "127.0.0.1.xip.io:8081/"

总计:

"aws": {                                
    "accessKeyId": "123",               
    "secretAccessKey": "abc",           
    "region": "",                       
    "endpoint": "127.0.0.1.xip.io:8081/",
    "sslEnabled": false                 
}               

可能还有其他选项,但http://xip.io从子域获取IP地址并始终返回该地址。因此,在上面的情况中,发送的实际url是:"logging.127.0.0.1.xip.io",但xip.io上的DNS服务器返回127.0.0.1

我本可以编辑和维护本地DNS文件,但这是一个简单的解决方案,足够干净,符合我的目的。

为了追踪这个问题,我查看了源代码,特别是node.js函数中的文件handleRequest,这是发送实际http请求的地方