aws DynamoDB 给出 "write EPROTO"
aws DynamoDB gives "write EPROTO"
我正在使用 dynamoDB 来保存网络服务生成的数据。
我有时(不一致)收到 'EPROTO' 错误,我读到了它,这是一个协议错误,但我使用 aws-sdk (javascript) 并且我没有声明任何协议-相关详情。
我是这样初始化的:
var aws = require('aws-sdk');
var dynamoDB = new aws.DynamoDB({
accessKeyId: config.DynamoDB.accessKeyId,
secretAccessKey: config.DynamoDB.secretAccessKey,
region: config.DynamoDB.region
});
我只是简单地使用 put api:
dynamoDB.putItem(params, function(err, dat) {
if (err) {
console.log('ERROR: Putting to dynamo failed with error: ' + err.message);
}
else {
console.log('wipi');
//passing data
}
});
params
如下:
var params = {
TableName: config.DynamoDB.tableNames.data, //this is the table name, a string
Item: {
id: {
S: id // this is a generated uid (also a string)
},
scheme: {
S: ivd.version // this is a string of structure 'X.X.X'
},
data: {
S: JSON.stringify(data.data) // data.data is a big object - {arg1: [1, 2, 3...], arg2: '', ...}
}
}
};
我应该提一下,它甚至在同一个参数对象上都不一致(仅生成的 uid 不同)。
知道这个错误对我来说意味着什么以及为什么会发生吗?
这是由使用节点版本 > 0.12 的 DynamoDB 问题引起的:https://github.com/aws/aws-sdk-js/issues/862
这被认为是服务器在重负载下没有响应完整的 TLS 响应的问题,这导致这个错误被扔到较新版本的节点中。
目前唯一已知的解决方法是降级到 Node 0.12。
在 https://github.com/aws/aws-sdk-js/issues/862 的讨论之后:
DynamoDB 方面似乎在客户端使用哪个版本的 TLS DynamoDB 进行通信方面存在不一致。要解决此问题,您需要强制 SDK 使用 TLS v1:
const https = require('https');
const dynamodb = new AWS.DynamoDB({
region: 'us-east-1',
httpOptions: {
agent: new https.Agent({
ciphers: 'ALL',
secureProtocol: 'TLSv1_method'
})
}
});
const dynamodbDoc = new AWS.DynamoDB.DocumentClient({
region: 'us-east-1',
service: dynamodb
});
我正在使用 dynamoDB 来保存网络服务生成的数据。 我有时(不一致)收到 'EPROTO' 错误,我读到了它,这是一个协议错误,但我使用 aws-sdk (javascript) 并且我没有声明任何协议-相关详情。
我是这样初始化的:
var aws = require('aws-sdk');
var dynamoDB = new aws.DynamoDB({
accessKeyId: config.DynamoDB.accessKeyId,
secretAccessKey: config.DynamoDB.secretAccessKey,
region: config.DynamoDB.region
});
我只是简单地使用 put api:
dynamoDB.putItem(params, function(err, dat) {
if (err) {
console.log('ERROR: Putting to dynamo failed with error: ' + err.message);
}
else {
console.log('wipi');
//passing data
}
});
params
如下:
var params = {
TableName: config.DynamoDB.tableNames.data, //this is the table name, a string
Item: {
id: {
S: id // this is a generated uid (also a string)
},
scheme: {
S: ivd.version // this is a string of structure 'X.X.X'
},
data: {
S: JSON.stringify(data.data) // data.data is a big object - {arg1: [1, 2, 3...], arg2: '', ...}
}
}
};
我应该提一下,它甚至在同一个参数对象上都不一致(仅生成的 uid 不同)。
知道这个错误对我来说意味着什么以及为什么会发生吗?
这是由使用节点版本 > 0.12 的 DynamoDB 问题引起的:https://github.com/aws/aws-sdk-js/issues/862
这被认为是服务器在重负载下没有响应完整的 TLS 响应的问题,这导致这个错误被扔到较新版本的节点中。
目前唯一已知的解决方法是降级到 Node 0.12。
在 https://github.com/aws/aws-sdk-js/issues/862 的讨论之后:
DynamoDB 方面似乎在客户端使用哪个版本的 TLS DynamoDB 进行通信方面存在不一致。要解决此问题,您需要强制 SDK 使用 TLS v1:
const https = require('https');
const dynamodb = new AWS.DynamoDB({
region: 'us-east-1',
httpOptions: {
agent: new https.Agent({
ciphers: 'ALL',
secureProtocol: 'TLSv1_method'
})
}
});
const dynamodbDoc = new AWS.DynamoDB.DocumentClient({
region: 'us-east-1',
service: dynamodb
});