AWS Lambda函数无法查询在ec2示例上运行的ElasticSearch

gg58donl  于 2023-02-07  发布在  ElasticSearch
关注(0)|答案(1)|浏览(137)

我有一个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端点可供公众访问。

nbnkbykc

nbnkbykc1#

仅仅将两个资源“放入同一个安全组”并不意味着它们能够相互通信。事实上,资源不在安全组“内部",而是与安全组”关联“。
安全组规则分别应用于每个资源。这意味着,如果两个资源与同一安全组关联,则需要有特定的规则,允许从安全组到其自身的传入访问。
与使用一个安全组不同,首选配置为:

  • AWS Lambda函数(lambda-SG)上的安全组,具有默认的“全部允许”出站规则,以及
  • Amazon EC2示例上运行Elasticsearch(elastic-SG)的安全组,允许从lambda-SG在端口9200上进行入站访问

也就是说,elastic-SG在允许入站访问时专门引用lambda-SG,这意味着来自Lambda函数的流量将被允许与该端口上的EC2示例通信。

相关问题