我有一个lambda函数,它试图从ec2机器上运行的ElasticSearch中读取数据。这两个函数都在同一个VPC子网中,并且分配了相同的安全组。Lambda似乎无法访问ElasticSearch示例。
const AWS = require('aws-sdk');
const elasticsearch = require('elasticsearch');
exports.handler = async function (event, context, callback) {
const client = new elasticsearch.Client({
host: 'public_dns:9200',
httpAuth: 'user:password'
});
let self = this;
client.search({
index: 'index_name',
scroll: '30s',
size: 10000,
body: {
query: {
match_all: {}
}
}
})
.then(response => {
self.responseString = response.hits.hits;
console.log(response.hits.hits);
})
.catch(error => {
console.error(error);
});
const responseData = {
statusCode: 200,
body: JSON.stringify({
message: self.responseString
})
};
callback(null, responseData);
};
我从lambda得到的错误是
2023-02-06T23:19:54.890Z fcd62836-4fe3-4c6a-9871-ee70668ba07c ERROR StatusCodeError: Request Timeout after 30000ms
at /var/task/node_modules/elasticsearch/src/lib/transport.js:397:9
at Timeout.<anonymous> (/var/task/node_modules/elasticsearch/src/lib/transport.js:429:7)
at listOnTimeout (node:internal/timers:559:17)
at processTimers (node:internal/timers:502:7) {
status: undefined,
displayName: 'RequestTimeout',
body: undefined
任何关于如何调试此问题的提示都将受到高度赞赏。我不希望ElasticSearch端点可供公众访问。
1条答案
按热度按时间nbnkbykc1#
仅仅将两个资源“放入同一个安全组”并不意味着它们能够相互通信。事实上,资源不在安全组“内部",而是与安全组”关联“。
安全组规则分别应用于每个资源。这意味着,如果两个资源与同一安全组关联,则需要有特定的规则,允许从安全组到其自身的传入访问。
与使用一个安全组不同,首选配置为:
lambda-SG
)上的安全组,具有默认的“全部允许”出站规则,以及elastic-SG
)的安全组,允许从lambda-SG
在端口9200上进行入站访问也就是说,
elastic-SG
在允许入站访问时专门引用lambda-SG
,这意味着来自Lambda函数的流量将被允许与该端口上的EC2示例通信。