AWS Lambda访问OpenSearch出现无法验证服务器为Elasticsearch错误如何解决
错误产生原因
- 你使用的第三方AWS连接库
@acuris/aws-es-connection是为旧版Elasticsearch客户端设计的,和OpenSearch官方客户端兼容性不足,会触发客户端的产品校验逻辑 - OpenSearch JS客户端默认会发起产品兼容性校验请求,你当前使用的AWS凭证没有权限访问校验所需的服务端接口,请求被权限拦截后客户端无法确认服务端产品类型,抛出该错误
- 部分高版本OpenSearch客户端默认会校验服务端是否为兼容的Elasticsearch/OpenSearch版本,AWS托管OpenSearch在权限受限情况下无法返回校验所需的元数据,也会触发该报错
排查解决方法
- 第一步:优先关闭客户端的产品校验
初始化OpenSearch客户端时添加skipProductValidation: true参数,跳过不必要的产品校验逻辑,修改后的代码示例:
const { Client } = require('@opensearch-project/opensearch'); const { createAWSConnection, awsGetCredentials } = require('@acuris/aws-es-connection'); const test = async () => { const awsCredentials = await awsGetCredentials(); const AWSConnection = createAWSConnection(awsCredentials); const client = new Client({ ...AWSConnection, node: 'https://<domain-name>.us-east-2.es.amazonaws.com', // 新增下面这行关闭产品校验 skipProductValidation: true }); await client.cat.help(); }; test();
- 第二步:替换老旧的第三方AWS签名库,使用OpenSearch客户端原生的AWS SigV4签名能力
@acuris/aws-es-connection已经停止维护很久,新版OpenSearch JS客户端原生支持AWS签名,不需要引入第三方依赖,代码示例:
const { Client } = require('@opensearch-project/opensearch'); const { AwsSigv4Signer } = require('@opensearch-project/opensearch/aws'); const { defaultProvider } = require('@aws-sdk/credential-provider-node'); const client = new Client({ ...AwsSigv4Signer({ region: 'us-east-2', service: 'es', getCredentials: () => defaultProvider()(), }), node: 'https://<domain-name>.us-east-2.es.amazonaws.com', skipProductValidation: true }); const test = async () => { await client.cat.help(); }; test();
- 第三步:检查IAM权限配置
确认Lambda执行角色的IAM政策包含如下权限配置:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "es:ESHttp*", "Resource": "arn:aws:es:us-east-2:<你的AWS账户ID>:domain/<你的OpenSearch域名>/*" } ] }
如果你的OpenSearch域开启了精细访问控制,还需要在OpenSearch的安全面板中将Lambda执行角色的ARN映射到具备对应操作权限的OpenSearch角色(例如只读角色、all_access角色)。
- 第四步:排查网络连通性
如果Lambda部署在VPC内,需要确认VPC安全组放通了到OpenSearch域443端口的出向访问,已经配置了OpenSearch的VPC端点或者VPC具备公网访问能力。
内容的提问来源于stack exchange,提问作者coolman
相关产品推荐
相关产品推荐

