用于 ElasticSearch 服务的简单 AWS AppSync 架构和解析器
Posted
技术标签:
【中文标题】用于 ElasticSearch 服务的简单 AWS AppSync 架构和解析器【英文标题】:simple AWS AppSync schema and resolver for ElasticSearch service 【发布时间】:2020-09-29 22:25:57 【问题描述】:我想通过这种方式为 EslasticSearch 服务获取简单的 AppSync 解析器:
架构:
type Query
searchESIndex(input: ESModelTypeInput!): ESModelRespType
input ESModelTypeInput
es_body: String
es_index_name: String
type ESModelRespType
es_resp: String
所以关键是只给出要搜索的索引名称以及包含完整的 stingified 正文或查询的正文字符串 并将 ElasticSearch 的完整响应作为字符串返回(用于进一步解析)
解析器:
"version":"2017-02-28",
"operation":"GET",
"path":"/$context.args.es_index_name/_search",
"params":
"body": $util.toJson("$context.args.es_body")
响应模板:
## i need full result as a string, but how to convert it?
$context.result
查询将是:
query searchESIndex($esinput: ESModelTypeInput!)
searchESIndex(input: $esinput)
es_resp
变量:
"esinput":
"es_index_name": "test2",
"es_body": "\"size\": 10"
我也应该有类似的突变
type Mutation
insertToESIndex(input: ESModelTypeInput!): ESModelRespType
很遗憾,我所有的尝试都失败了。 有可能做到吗? 你能帮我解决这个问题吗?
【问题讨论】:
您的响应将是 JSON,将其转换为字符串的一种方法是使用 $util.dynamodb.toString(...)。你试过这个吗?此外,您定义“ESModelRespType”是否有任何具体原因,而您可以只执行“type Query searchESIndex(input: ESModelTypeInput!): String”?您也可以分享您遇到的错误吗? 另外,我认为您测试查询的方式存在错误。根据您对查询的定义,'es_resp' 嵌套在 'ESModelRespType' 中,因此为了测试它,正确的查询语法应该是 'query searchESIndex($esinput:ESModelTypeInput!) searchESIndex(input: $esinput) ESModelRespType:es_resp'。 $util.dynamodb.toString(...) 导致:“消息”:“在 com.amazonaws.deepdish.transform.util.DynamoDBUtils 类中调用方法 'toString' 引发异常 java。 lang.IllegalArgumentException:速度的参数数量错误[第 15 行,第 16 列]" 【参考方案1】:我觉得有义务更新我的答案,因为@cyberwombat 指出了比我之前发布的更好的解决方案。
您可以通过以下方式将结果转换为字符串化 JSON。
选项 1:
#set($resultMap = )
#foreach($key in $ctx.result.keySet())
$util.qr($resultMap.put("$key", $ctx.result.get($key)))
#end
#return($util.escapejavascript($util.toJson($resultMap)))
选项 2:
您可以将解析器转换为 Pipeline,并在 NodeJS 中创建一个简单的 Lambda 函数来对 JSON 对象进行字符串化。这就是你的 lambda 函数的样子:
exports.handler = (event, context, callback) =>
const response =
statusCode: 200,
body: JSON.stringify(event.input.serviceConfig).replace(/\"/g, '\\\"'),
;
callback(null, response)
;
您现在可以轻松地在解析器中使用返回的字符串并获取字符串化的 JSON。
Link我的问题,解释和完整答案。
【讨论】:
以上是关于用于 ElasticSearch 服务的简单 AWS AppSync 架构和解析器的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch+Logstash+Kibana日志采集服务搭建并简单整合应用