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
});