web-dev-qa-db-ja.com

AWS AppsyncはLambdaからmutateを呼び出しますか?

Appysyncイベントにサブスクライブしているクライアントアプリがあります。データソースは、RDSに対するLambda関数です。 RDSアップデートでトリガーされるLambda関数からミューテートを呼び出すことは可能ですか?

8
Deepan

この投稿で答えられた、あなたと非常によく似た質問を見つけました。

GraphQLミューテーションをあるサーバーから別のサーバーに送信する方法は?

再開すると、HTTPリクエストをGraphqlサーバー(APIゲートウェイなど)にディスパッチし、ペイロードとしてGraphqlクエリ(ミューテーションにすることもできます)を含めることができます。それは私のために働くようです:)

編集:

以下のラムダは、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']))
4
rfschroeder

私があなたを正しく理解しているなら、RDSの変更をサブスクライブしたクライアントに通知する目的で、RDSの更新を介してトリガーされるラムダ関数からミューテーションを呼び出したいと思います。これが正しくない場合は、今すぐ停止してください。

RDSで何かが変更されたときにラムダをトリガーするためにここで説明されているようなことをしていると仮定します( https://docs.aws.Amazon.com/AmazonRDS/latest/UserGuide/AuroraMySQL.Integrating.Lambda.html )。

ワークフローを終了するには、ローカルリゾルバー(「なし」データソースを指すリゾルバー)を作成し、RDSで何かが変更されるたびに、クライアントアプリにプッシュするデータを使用してラムダ関数にそのミューテーションリゾルバーを呼び出させることをお勧めします。クライアントは、@ aws_subscribeディレクティブを使用して、(RDSラムダへのリゾルバーではなく)ローカルリゾルバーでミューテーションフィールドにサブスクライブします。このようにして、接続されたクライアントは、AppSyncを介して行われる可能性がある、またはSQLインスタンスへの直接接続を介して行われる可能性があるRDSの変更について通知されます。

お役に立てれば。

4
mparis