AWS Appsync 从 Lambda 调用变异?
Posted
技术标签:
【中文标题】AWS Appsync 从 Lambda 调用变异?【英文标题】:AWS Appsync Invoke mutate from Lambda? 【发布时间】:2018-10-02 15:30:36 【问题描述】:我有一个订阅 Appysync 事件的客户端应用程序。数据源是 RDS 的 Lambda 函数。是否可以从 RDS 更新时触发的 Lambda 函数调用 mutate?
【问题讨论】:
看看我的回答here,看看是不是你需要的。 【参考方案1】:如果我对您的理解正确,您想从 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 实例的直接连接进行的任何 RDS 更改。
希望这会有所帮助。
【讨论】:
你将如何连接到 appsync 来调用突变? 一般来说,您只需向您的自定义端点发送一个 HTTP 请求,其中包含一个包含查询、变量和可选操作的对象。然后这取决于您配置的身份验证策略。如果 api_key 则您需要提供密钥作为标题。如果是 IAM,那么您需要使用您的 IAM 凭证对您的请求进行 SigV4 签名。如果是用户池,您将需要通过用户池登录以获取 JWT 令牌,然后将其作为授权不记名标头提供。如果是 OIDC,那么您将提供从 OIDC 提供商处获得的 JWT 作为 Auth Bearer 令牌。 我正在尝试做几乎相同的事情。我正在使用 IAM 并尝试做 SigV4 但很难。你做过吗?我真的买了一张票。你能看看吗? ***.com/questions/50957895/… 目前在我的手机上,所以还不能复制您的代码,但我可以将您指向 AppSync 客户端使用的签名者代码。 github.com/awslabs/aws-mobile-appsync-sdk-js/blob/master/… 作为另一种选择,我过去在这个库上运气不错github.com/mhart/aws4【参考方案2】:我发现了一个与你的问题非常相似的问题,在这篇文章中得到了回答:
How to send GraphQL mutation from one server to another?
恢复,您可以简单地将 HTTP 请求发送到您的 Graphql 服务器(如 API 网关),并将 Graphql 查询(也可以是突变)作为有效负载包含在内。它似乎对我有用:)
编辑:
当我在 DynamoDB 表上插入触发时,我使用了下面的这个 lambda:
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']))
【讨论】:
我编辑了我上面的帖子,以便更好地向您解释。尝试做同样的事情并查看结果。以上是关于AWS Appsync 从 Lambda 调用变异?的主要内容,如果未能解决你的问题,请参考以下文章
从 Lambda 调用 AWS AppSync graphql API
让 DynamoDB Stream Lambda 函数调用 AWS AppSync 突变
如何使用 IAM 在 AWS Lambda 中调用 AppSync?
如何将签名的 HTTP 请求从 AWS Lambda 发送到 AppSync GraphQL?