运行在EC2上的Elasticsearch集群能否作为AWS AppSync的数据源?
问题解答
AppSync与OpenSearch的绑定限制说明
首先明确:AWS AppSync 没有和Amazon OpenSearch Service强绑定,支持多种数据源接入方式,完全可以对接部署在EC2上的自建Elasticsearch集群。
EC2自建ES集群接入AppSync的操作流程
AppSync没有对接第三方/自建ES的原生数据源类型,需要通过Lambda函数作为中间层完成对接,具体操作如下:
- 步骤1:配置ES集群的网络和权限
- 确保EC2 ES集群的安全组开放ES服务端口(默认9200)的访问权限,若集群部署在VPC内,需要提前规划好后续Lambda的网络配置,确保两者网络可达
- 若ES配置了账号密码鉴权,提前记录好对应的鉴权凭证
- 步骤2:开发对接ES的Lambda函数
- 选择任意支持的运行时(Python、Node.js等均可)编写逻辑,完成对ES集群的增删改查操作,Python示例核心代码如下:
from elasticsearch import Elasticsearch import os # 从环境变量读取敏感配置,避免硬编码 es_client = Elasticsearch( hosts=os.environ["ES_ENDPOINT"], http_auth=(os.environ["ES_USER"], os.environ["ES_PASS"]) # 无鉴权可删除该行 ) def lambda_handler(event, context): # 解析AppSync传递的操作参数 op_type = event["op_type"] target_index = event["index"] op_params = event.get("params", {}) if op_type == "search": return es_client.search(index=target_index, body=op_params) elif op_type == "create_doc": return es_client.index(index=target_index, document=op_params) # 按需补充更新、删除等其他操作逻辑 - 给Lambda配置对应环境变量存储ES访问地址、鉴权信息,若ES部署在VPC内,需要给Lambda开通VPC访问权限,关联和ES同VPC的子网、安全组
- 选择任意支持的运行时(Python、Node.js等均可)编写逻辑,完成对ES集群的增删改查操作,Python示例核心代码如下:
- 步骤3:AppSync端添加Lambda数据源
- 进入AppSync API控制台的「数据源」页面,点击新增数据源,类型选择
Lambda函数,选中上一步创建的Lambda,按照提示授予AppSync调用该Lambda的权限即可
- 进入AppSync API控制台的「数据源」页面,点击新增数据源,类型选择
- 步骤4:配置AppSync Resolver映射
- 为需要对接ES的GraphQL字段关联上述Lambda数据源
- 编写请求映射模板,把GraphQL请求参数转换为Lambda可识别的格式,示例如下:
{ "version": "2017-02-28", "operation": "Invoke", "payload": { "op_type": "search", "index": "your_target_index", "params": { "query": { "match": { "content": $util.toJson($ctx.args.search_keyword) } } } } } - 编写响应映射模板,把Lambda返回的ES查询结果转换为对应GraphQL字段要求的返回格式即可
如果后续不想自行维护Lambda中转层,也可以把EC2上的ES集群迁移到Amazon OpenSearch Service,即可直接使用AppSync原生的OpenSearch数据源,无需额外开发中间逻辑。
内容的提问来源于stack exchange,提问作者Suhas Kashyap
相关产品推荐
相关产品推荐

