我有一个订阅 Appysync 事件的客户端应用程序。数据源是 RDS 的 Lambda 函数。是否可以从 RDS 更新时触发的 Lambda 函数调用 mutate?
2 回答
如果我理解正确,您想从通过 RDS 中的更新触发的 lambda 函数调用突变,目的是通知订阅的客户端 RDS 中的更改。如果这是不正确的,请立即阻止我。
我假设您正在执行此处描述的操作,以在 RDS 发生变化时触发 lambda ( https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/AuroraMySQL.Integrating.Lambda.html )。
为了完成工作流程,我建议创建一个本地解析器(一个指向“无”数据源的解析器),并让您的 lambda 函数在 RDS 发生变化时使用您想要推送到客户端应用程序的数据调用该突变解析器。然后,您的客户将使用 @aws_subscribe 指令通过本地解析器(而不是 RDS lambda 的解析器)订阅突变字段。这样,您连接的客户端将被告知可能通过 AppSync 进行的任何 RDS 更改,或者可能通过与您的 SQL 实例的直接连接进行的任何 RDS 更改。
希望这可以帮助。
我发现了一个与您的问题非常相似的问题,在这篇文章中得到了回答:
如何将 GraphQL 突变从一台服务器发送到另一台服务器?
恢复,您可以简单地将 HTTP 请求发送到您的 Graphql 服务器(如 API 网关),并将 Graphql 查询(也可以是突变)作为有效负载包含在内。这似乎对我有用:)
编辑:
下面这个 lambda 在通过 DynamoDB 表上的插入触发时使用:
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']))