Ошибка подключения AWS ElasticSearch Instance из AWS лямбда-функции при использовании Serverless Framework - PullRequest
1 голос
/ 12 февраля 2020

Я использую безсерверный фреймворк для реализации безсерверного проекта. Я добавил некоторые настройки в свой файл serverless.yml, чтобы создать экземпляр для службы awsasticsearch, которая успешно создана. Затем я создал в своем обработчике клиентаasticsearch и пинговал его для тестирования. Поэтому, когда я пингую поисковый клиент elasti c с автономного сервера в моей локальной системе, он работал нормально и получил «истинный» ответ, но когда я развернул тот же код на aws лямбде, чем после истечения времени ожидания ответ до 30 сек. c.

Предоставлены все политики, которые могут потребоваться, но не удача.

Serverless.yml: -

ElasticSearchInstance:
  Type: AWS::Elasticsearch::Domain
  Properties:
    EBSOptions:
      EBSEnabled: true
      VolumeType: gp2
      VolumeSize: 10
    ElasticsearchClusterConfig:
      InstanceType: t2.small.elasticsearch
      InstanceCount: 1
      DedicatedMasterEnabled: false
      ZoneAwarenessEnabled: false
    ElasticsearchVersion: 7.1

Обработчик. js: -

var {Client} = require('elasticsearch');
var client = new Client({
 host: 'Aws elasticsearch endpoint',
 log: 'trace'
});

module.exports.elasticSearchPing = async () => {
  try {
  console.log('Inside elasticSearchPing function!!!!');
  const res = await client.ping({requestTimeout: 900000});
  console.log('Res: ', res);
  return {
  statusCode: 200,
  body: JSON.stringify({ message: 'Connection successful with elasticSearch.' })
 }
} catch (err) {
  console.log('err: ', err);
  return {
    statusCode: err.statusCode || 500,
    headers: { 'Content-Type': 'text/plain' },
    body: 'Error connecting elasticsearch.'
    }
 }
}

1 Ответ

0 голосов
/ 13 февраля 2020

Таким образом, awsasticsearch не сможет узнать, кто вы. Вам необходимо подписать свой запрос перед отправкой на awsasticsearch. Вы можете использовать пакет под названием http-aws-es, который в основном считывает учетные данные aws из вашей ec2 / lambda и подписывает запрос для вас. Ваш код будет выглядеть так

const {Client} = require("elasticsearch");
const esConnectionClass = require("http-aws-es");

const client = new Client({
  "host": "Aws elasticsearch endpoint",
  "log": "trace",
  "connectionClass": esConnectionClass
});

module.exports.elasticSearchPing = async () => {
  try {
    console.log("Inside elasticSearchPing function!!!!");
    const res = await client.ping({"requestTimeout": 900000});
    console.log("Res: ", res);
    return {
      "statusCode": 200,
      "body": JSON.stringify({"message": "Connection successful with elasticSearch."})
    };
  } catch (err) {
    console.log("err: ", err);
    return {
      "statusCode": err.statusCode || 500,
      "headers": {"Content-Type": "text/plain"},
      "body": "Error connecting elasticsearch."
    };
  }
};

...