我正在尝试使用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
答案 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请求的地方的