ElasticSearch 服务的简单 AWS AppSync 架构和解析器

simple AWS AppSync schema and resolver for ElasticSearch service

我想通过这种方式为 EslasticSearch 服务获取简单的 AppSync 解析器:

架构:

type Query {
  searchESIndex(input: ESModelTypeInput!): ESModelRespType
}

input ESModelTypeInput {
  es_body: String
  es_index_name: String
}

type ESModelRespType {
  es_resp: String
}

所以重点是只给出要搜索的索引名称和包含完整的 stingified body 或查询的 body 字符串 return 将 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
}

不幸的是,我的所有尝试都失败了。 有可能做到吗? 你能帮我吗?

我觉得有义务更新我的答案,因为@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:

您可以将解析器转换为管道,并在 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。

我的问题、解释和完整答案。