Я получаю ошибку http 403 forbidden
при попытке удалить индекс aws elasticsearch
с помощью клиента java Jest (v6.3) asticsearch (который делегирует вызовы http на apache httpclient) (v4.5.2) Я знаю, что мои разрешения правильно настроены в AWS, поскольку я могу успешно использовать почтальона (с помощью помощника по авторизации подписи AWS). Однако, с apache httpclient
, когда я выдаю DELETE /{myIndexName}
Я получаю следующую ошибку:
The request signature we calculated does not match the signature you provided.
Check your AWS Secret Access Key and signing method.
Consult the service documentation for details.
Я подписываю запрос aws
, настроив apache httpclient
с помощью перехватчика, подписывающего запрос. (Код ниже предназначен для класса Spring Framework @Configuration
, который подключает клиента java Jest
и базовый apache httpclient ) но я думаю, что если бы я использовал apache httpclient напрямую, у меня возникла бы та же проблема.
@Configuration
public class ElasticSearchConfiguration {
@Autowired
private CredentialsProviderFactoryBean awsCredentialsProvider;
@Bean
public JestClient awsJestClient(@Value("${elasticsearch.url}") String connectionUrl) throws Exception {
com.amazonaws.auth.AWSCredentialsProvider provider = awsCredentialsProvider.getObject();
final com.google.common.base.Supplier<LocalDateTime> clock = () -> LocalDateTime.now(ZoneOffset.UTC);
final vc.inreach.aws.request.AWSSigner awsSigner = new vc.inreach.aws.request.AWSSigner(provider, "us-east-1", "es", clock);
final vc.inreach.aws.request.AWSSigningRequestInterceptor requestInterceptor = new vc.inreach.aws.request.AWSSigningRequestInterceptor(awsSigner);
final JestClientFactory factory = new JestClientFactory() {
@Override
protected HttpClientBuilder configureHttpClient(HttpClientBuilder builder) {
builder.addInterceptorLast(requestInterceptor);
return builder;
}
@Override
protected HttpAsyncClientBuilder configureHttpClient(HttpAsyncClientBuilder builder) {
builder.addInterceptorLast(requestInterceptor);
return builder;
}
};
factory.setHttpClientConfig(new HttpClientConfig
.Builder(connectionUrl)
.connTimeout(60000)
.multiThreaded(true)
.build());
return factory.getObject();
}
}
Поскольку он работает с почтальоном, он указывает на ошибку подписи, но я не понимаю, где происходит расхождение. Приведенная выше конфигурация работает для всех запросов apache httpclient
, кроме запросов HTTP DELETE.