diff --git a/seatunnel-connectors-v2/connector-elasticsearch/pom.xml b/seatunnel-connectors-v2/connector-elasticsearch/pom.xml
index 01217063a7..96efa91750 100644
--- a/seatunnel-connectors-v2/connector-elasticsearch/pom.xml
+++ b/seatunnel-connectors-v2/connector-elasticsearch/pom.xml
@@ -68,5 +68,16 @@
guava
${guava.version}
+
+ software.amazon.awssdk
+ auth
+ 2.29.47
+ compile
+
+
+ io.github.acm19
+ aws-request-signing-apache-interceptor
+ 3.0.0
+
diff --git a/seatunnel-connectors-v2/connector-elasticsearch/src/main/java/org/apache/seatunnel/connectors/seatunnel/elasticsearch/client/EsRestClient.java b/seatunnel-connectors-v2/connector-elasticsearch/src/main/java/org/apache/seatunnel/connectors/seatunnel/elasticsearch/client/EsRestClient.java
index 2207d416a2..f2a0811e87 100644
--- a/seatunnel-connectors-v2/connector-elasticsearch/src/main/java/org/apache/seatunnel/connectors/seatunnel/elasticsearch/client/EsRestClient.java
+++ b/seatunnel-connectors-v2/connector-elasticsearch/src/main/java/org/apache/seatunnel/connectors/seatunnel/elasticsearch/client/EsRestClient.java
@@ -17,11 +17,13 @@
package org.apache.seatunnel.connectors.seatunnel.elasticsearch.client;
+import io.github.acm19.aws.interceptor.http.AwsRequestSigningApacheInterceptor;
import org.apache.http.Header;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.message.BasicHeader;
import static org.apache.seatunnel.connectors.seatunnel.elasticsearch.client.EsType.KNN_VECTOR;
import static org.apache.seatunnel.connectors.seatunnel.elasticsearch.client.EsType.VECTOR;
+import static org.apache.seatunnel.connectors.seatunnel.elasticsearch.config.EsClusterConnectionConfig.IAM;
import org.apache.seatunnel.shade.com.fasterxml.jackson.databind.JsonNode;
import org.apache.seatunnel.shade.com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.seatunnel.shade.com.fasterxml.jackson.databind.node.ArrayNode;
@@ -80,6 +82,11 @@
import static org.apache.seatunnel.connectors.seatunnel.elasticsearch.client.EsType.DATE_NANOS;
import static org.apache.seatunnel.connectors.seatunnel.elasticsearch.client.EsType.DENSE_VECTOR;
import static org.apache.seatunnel.connectors.seatunnel.elasticsearch.client.EsType.OBJECT;
+import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
+import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
+import software.amazon.awssdk.http.auth.aws.signer.AwsV4HttpSigner;
+import software.amazon.awssdk.regions.Region;
@Slf4j
public class EsRestClient implements Closeable {
@@ -89,12 +96,14 @@ public class EsRestClient implements Closeable {
private static final int SOCKET_TIMEOUT = 5 * 60 * 1000;
private final RestClient restClient;
+ private static ReadonlyConfig connConfig;
private EsRestClient(RestClient restClient) {
this.restClient = restClient;
}
public static EsRestClient createInstance(ReadonlyConfig config) {
+ connConfig = config;
List hosts = config.get(EsClusterConnectionConfig.HOSTS);
Optional cloudId = config.getOptional(EsClusterConnectionConfig.CLOUD_ID);
Optional username = config.getOptional(EsClusterConnectionConfig.USERNAME);
@@ -200,6 +209,23 @@ private static RestClientBuilder getRestClientBuilder(
httpClientBuilder.addInterceptorFirst((HttpRequestInterceptor) (request, context) -> {
request.addHeader(apiKeyHeader);
});
+ }else{
+ Map iam = connConfig.get(IAM);
+ AwsCredentialsProvider awsCredentials = StaticCredentialsProvider.create(
+ AwsBasicCredentials.create(iam.get("access_key"), iam.get("secret_key"))
+ );
+ // AWS Region & Service
+ String region = iam.get("region"); // Update to match your OpenSearch region
+ String serviceName = iam.get("service_name"); // Use "es" for Managed OpenSearch, "aoss" for Serverless
+
+ // OpenSearch Host (WITHOUT "https://")
+ HttpRequestInterceptor awsSigV4Interceptor = new AwsRequestSigningApacheInterceptor(
+ serviceName,
+ AwsV4HttpSigner.create(),
+ awsCredentials,
+ region
+ );
+ httpClientBuilder.addInterceptorLast(awsSigV4Interceptor);
}
try {
@@ -328,6 +354,28 @@ public ScrollResult searchByScroll(
String endpoint = "/" + index + "/_search?scroll=" + scrollTime;
return getDocsFromScrollRequest(endpoint, JsonUtils.toJsonString(param));
}
+ public ScrollResult search(String index, List source, Map query, List