我有一个 lambda 函数,需要与 AWS OpenSearch 域通信。
域包含在 VPC 内,并且 lambda 函数已放置在同一 VPC 和子网内。
VPC 包含一个互联网网关和一个代理服务器,Opensearch 域除了自动生成的 URL 之外,还有一个可从 VPC 外部访问的 URL。
当 lambda 函数尝试连接到 Opensearch API 时,会超时。然而奇怪的是,它显示它正在尝试访问错误的 URL。无论我使用面向公众的 URL 还是以“https://vpc-{my-vpc-name}”开头的 VPC 内 URL,它都显示尝试联系“https://search-”时超时。 {我的 vpc 名称}'
我相信相关代码在这里:
RestClientBuilder builder = RestClient.builder(HttpHost.create({my-url-here}))
.setHttpClientConfigCallback(httpAsyncClientBuilder -> httpAsyncClientBuilder.addInterceptorLast(interceptor));
restClient = new RestHighLevelClient(builder);
我真的不明白为什么它会使用修改后的(并且不存在的)URL,无论它被告知使用什么。这可能是某种 DNS 问题,还是我应该更多地了解 OpenSearch 和 AWS Java 库的工作原理?
您可能缺少正确的安全组配置,请参阅下面的 CDK 片段来设置这些安全组
SecurityGroup openSearchSecurityGroup = SecurityGroup.Builder.create(this, id + "sg-search")
.vpc(vpc)
.build();
SecurityGroup lambdaSecurityGroup = SecurityGroup.Builder.create(this, id + "sg-lambda")
.vpc(vpc)
.build();
lambdaSecurityGroup.addEgressRule(openSearchSecurityGroup, Port.tcp(443));
openSearchSecurityGroup.addIngressRule(lambdaSecurityGroup, Port.tcp(443));