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?

使用 AWS Lambda (NodeJS) 创建 AWS AppSync

AWS Lambda 函数无法访问 AppSync GraphQL API - 权限被拒绝