AWS Appsync从Lambda调用mutate?

时间:2018-04-22 13:48:11

标签: aws-lambda aws-appsync

我有一个订阅Appysync活动的客户端应用程序。数据源是RDS的Lambda函数。是否可以从RND更新触发的Lambda函数调用mutate?

2 个答案:

答案 0 :(得分:3)

如果我理解正确,您希望调用lambda函数中的变异,该函数通过RDS中的更新触发,目的是通知订阅客户端RDS中的更改。如果这不正确,请立即停止。

我假设您正在执行此处描述的操作,以便在RDS(https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/AuroraMySQL.Integrating.Lambda.html)中发生更改时触发lambda。

要完成工作流程,我建议您创建一个本地解析器(一个指向“无”数据源的解析器)并让您的lambda函数调用该突变解析器,并在您发生更改时将所需数据推送到客户端应用程序在RDS中。然后,您的客户将使用@aws_subscribe指令使用本地解析程序(而​​不是RDS lambda的解析程序)订阅变异字段。这样,您的连接客户端将被告知可能通过AppSync进行的任何RDS更改,或者可能通过与SQL实例的直接连接进行更改。

希望这有帮助。

答案 1 :(得分:2)

我发现了一个问题,与你的问题非常相似,在这篇文章中回答:

How to send GraphQL mutation from one server to another?

恢复,您只需向您的Graphql Server(如API网关)发送HTTP请求,并将Graphql查询(也可以是变异)包含为有效负载。这似乎对我有用:)

编辑:

我在下面使用的lambda在DynamoDB表上通过insert触发时使用:

import json
import requests

GRAPHQL_URL = 'https://XXXXXXXXXXXXXXXXX.appsync-api.ap-southeast-2.amazonaws.com/graphql'

GRAPHQL_API_KEY = "************************************" (secret)

HEADERS = {
    "X-Api-Key":GRAPHQL_API_KEY,
}

def lambda_handler(event, context):

    for record in event['Records']:
        if record['eventName'] == 'INSERT':
            item = record['dynamodb']
            res = {}
            data = {"operationName":None,"variables":{"id":item['NewImage']['id']['S'],"name":item['NewImage']['name']['S'],"when":item['NewImage']['when']['S'],"where":item['NewImage']['where']['S'],"description":item['NewImage']['description']['S']},"query":"mutation ($id: ID!, $name: String!, $when: String!, $where: String!, $description: String!) {\n  eventCreated(id: $id, name: $name, when: $when, where: $where, description: $description) {\n    id\n    name\n    where\n    when\n    description\n    comments {\n      items {\n        commentId\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n}\n"}

            try:
                res = requests.post(
                    GRAPHQL_URL,
                    headers=HEADERS,
                    data=json.dumps(data)
                )

            except Exception as e:
                print('error: ', e)
            print('Graphql request response: ', res)
    return 'Successfully processed {} records.'.format(len(event['Records']))