我有一个订阅Appysync活动的客户端应用程序。数据源是RDS的Lambda函数。是否可以从RND更新触发的Lambda函数调用mutate?
答案 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']))