Spring 本机 RestHighLevelClient 未连接到 AWS OpenSearch

Spring Native with RestHighLevelClient not connecting to AWS OpenSearch

我在“Amazon Linux 2”上配置了 Lambda 和 运行。 GraalVM 是我们应用程序使用的运行时。

当 Lambda 尝试与 OpenSearch 建立连接时,总是会导致 "java.net.SocketTimeoutException:连接 http-outgoing-0 [ACTIVE]" 时超时 60,000 毫秒 .

以下是我们应用中使用的一些要点:

  1. Lambda 和 OpenSearch 都在同一个 VPC 中
  2. 安全组配置为允许所有入站和出站流量(目前)
  3. 我们使用 Elasticsearch 的 'RestHighLevelClient' 库与 OpenSearch 建立连接
  4. Lambda 的权限具有完整的 OpenSearch 访问权限。

下面是RestHighLevelClient配置:

public class OpenSearchConfig extends AbstractElasticsearchConfiguration {

  @Value("${aws.es.endpoint:defaultEndpoint}")
  private String endpoint;

  @Override
  public RestHighLevelClient elasticsearchClient() {
    return new RestHighLevelClient(RestClient.builder(HttpHost.create(endpoint)));
  }
}

注意:当我们使用 'Java 11 (Corretto)' 作为运行时时,Lambda 到 OpenSearch 的连接工作正常。由于我们在 Lambda 中面临冷启动问题,我们计划使用 GraalVM(由 Spring Native 支持)来加快启动速度,但最终遇到了这个障碍。将套接字连接超时增加到任何限制也无济于事。

非常感谢任何建议。提前致谢。

看来 Spring 的魔法与 GraalVM 不太兼容。我修改了如下配置,效果很好。

@Configuration
public class OpenSearchConfig {

  @Value("${aws.es.endpoint:defaultEndpoint}")
  private String endpoint;

  @Bean
  public RestHighLevelClient elasticsearchClient() {
    return new RestHighLevelClient(RestClient.builder(HttpHost.create(endpoint)));
  }
}

上面我已经明确地将 RestHighLevelClient 标记为一个 bean,并创建了 ElasticsearchOperations 实例,如下所示:

  private RestHighLevelClient restHighLevelClient;
  private ElasticsearchOperations elasticsearchOperations;

  @Autowired
  public Foo(RestHighLevelClient restHighLevelClient){
    this.restHighLevelClient = restHighLevelClient;
    this.elasticsearchOperations = new ElasticsearchRestTemplate(this.restHighLevelClient);
  }

希望这对某人有所帮助。