Я создал пакет AWS Lambda (Java) с функцией, которая считывает некоторые файлы из Amazon S3 и отправляет данные в сервис AWS ElasticSearch. Поскольку я использую AWS Elastic Search, я не могу использовать транспортный клиент, и в этом случае я работаю с Jest Client для отправки через REST. Проблема с клиентом Jest.
Вот мой экземпляр клиента Jest:
public JestClient getClient() throws InterruptedException{
final Supplier<LocalDateTime> clock = () -> LocalDateTime.now(ZoneOffset.UTC);
DefaultAWSCredentialsProviderChain awsCredentialsProvider = new DefaultAWSCredentialsProviderChain();
final AWSSigner awsSigner = new AWSSigner(awsCredentialsProvider, REGION, SERVICE, clock);
JestClientFactory factory = new JestClientFactory() {
@Override
protected HttpClientBuilder configureHttpClient(HttpClientBuilder builder) {
builder.addInterceptorLast(new AWSSigningRequestInterceptor(awsSigner));
return builder;
}
@Override
protected HttpAsyncClientBuilder configureHttpClient(HttpAsyncClientBuilder builder) {
builder.addInterceptorLast(new AWSSigningRequestInterceptor(awsSigner));
return builder;
}
};
factory.setHttpClientConfig(
new HttpClientConfig.Builder(URL)
.discoveryEnabled(true)
.multiThreaded(true).build());
JestClient jestClient = factory.getObject();
return jestClient;
}
Поскольку домен AWS Elasticsearch защищен политикой доступа IAM, я подписываю запросы на их авторизацию AWS (пример здесь). Я использую POJO для индексации документов.
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу выполнить более одного действия с экземпляром клиента jest. Например, если я сначала создал индекс:
client.execute(new CreateIndex.Builder(indexName).build());
а позже я хотел, например, выполнить массовое индексирование:
for (Object object : listOfObjects) {
bulkIndexBuilder.addAction(new Index.Builder(object ).
index(INDEX_NAME).type(DOC_TYPE).build());
}
client.execute(bulkIndexBuilder.build());
будет выполнено только первое действие, а второе не удастся. Это почему? Можно ли выполнить более одного действия?
Более того, используя предоставленный код, я не могу выполнить более 20 массовых операций, когда хочу проиндексировать документ. В принципе, около 20 — это нормально, но если больше, то client.execute(bulkIndexBuilder.build());
просто не запустится, и клиент выключится.
Любая помощь или предложение будут оценены.
ОБНОВЛЕНИЕ: кажется, что AWS ElasticSearch не позволяет подключаться к отдельным узлам. Простое отключение обнаружения узлов в клиенте Jest .discoveryEnabled(false)
решило все проблемы. Этот ответ помог.