基本概述,我有一个运行 Node.js 应用程序的 AWS Lambda,它通过 http 调用将 JSON 发布到我的 AWS Elastic Search DB
所以,我从这个小错误开始:AWS: {"Message":"User: anonymous is not authorized to perform: es:ESHttpPost"}
经过大量时间后,我终于明白 AWS 不喜欢未签名的请求。
现在我坚持这个
Response:
{
"errorMessage": "Cannot read property 'presigned-expires' of undefined",
"errorType": "TypeError",
"stackTrace": [
"V4.isPresigned (/var/runtime/node_modules/aws-sdk/lib/signers/v4.js:206:32)",
"V4.addAuthorization (/var/runtime/node_modules/aws-sdk/lib/signers/v4.js:27:14)",
"Promise (/var/task/index.js:18:16)",
"new Promise (<anonymous>)",
"exports.handler (/var/task/index.js:6:12)"
]
}
在谷歌上的很多时间,甚至在网络上的更深入都没有给我这个问题的解决方案。
这是我的 lambda 代码:
var AWS = require('aws-sdk');
var creds = new AWS.EnvironmentCredentials('AWS');
var http = require('http');
exports.handler = async (event, context) => {
return new Promise((resolve, reject) => {
const options = {
hostname: 'XXX_ES_DOMAIN.eu-central-1.es.amazonaws.com',
path: '/path/1',
method: 'POST'
};
const req = http.request(options, (res) => {
resolve('Success');
});
var signer = new AWS.Signers.V4(req, 'es');
signer.addAuthorization(creds, new Date());
req.on('error', (e) => {
reject(e.message);
});
// send the request
req.write(JSON.stringify({ 'test': 'test' }));
req.end();
});
};