使DynamoDB Stream Lambda函数调用AWS AppSync突变

时间:2019-03-05 18:03:36

标签: aws-lambda amazon-dynamodb graphql aws-appsync

我有一个lambda函数,当我的dynamodb表中发生更改时会触发该函数。当我使用lambda解析器时,我只能从我的appsync中调用lambda函数,这不是我要尝试的操作。

我正在尝试遵循此处提供的答案:

How do I subscribe directly to my AWS AppSync data source?

但是我在执行第三步时遇到了问题。

谢谢

以下@Aaron_H回答这是我的lambda函数:

module.exports.triggerStream = async (event, context, callback) => {
if(event.Records[0].eventName === 'INSERT'){
return new Promise((resolve, reject) => {
    console.log(event.Records[0].eventName)
    console.log(JSON.stringify(context))
    console.log(JSON.stringify(event));


        const myData = { //this part is hardcoded for my tests
            "query": `
            mutation UpdateData($myDeviceID : String!, $myTs : String!, $myPayload: payloadInput){
                updateData(deviceID : $myDeviceID, ts : $myTs, payload : $myPayload){
                    checkup
                }
            }
            `,
            "variables": {
                "myDeviceID": "z55-temp",
                "myTs": "1549512000",
                "myPayload":{
                    "deviceId": "z55-temp",
                    "ts": 1549512000,
                    "value": 17.25
                }
            }
        };
    const data=JSON.stringify(myData)

    const options = {
        host: 'blablabla.appsync-api.us-east-1.amazonaws.com',
        path: '/graphql',
        method: 'POST',
        headers: {'Content-Type': 'application/json',
            "X-Api-Key" : "myApiKey"}           
    };      

    var req = https.request(options, (res) => {
      console.log('statusCode:', res.statusCode);
      console.log('headers:', res.headers);
      res.setEncoding('utf8');
      resolve('Success');

      res.on('data', (d) => {
        process.stdout.write(d);

      });
    });

    req.on('error', (e) => {
      console.error(e);
      reject(e.message);
    });
    // send the request
    req.write(data);
    req.end();
});
}

};

我也在使用无服务器框架,这是我的lambda函数的serverless.yml配置:

function:triggerStream:
handler: handler.triggerStream
events:
   - stream:
      type: dynamodb
      batchSize: 1
      startingPosition: LATEST
      arn: myExistingTableArn    

我的问题是我想使用Amazon Cognito用户池进行我的appsync授权。如果我的请求来自Dynamodb流,我该如何在标头中使用JWT令牌?我有一个在表中插入数据的物联网设备。

谢谢!

1 个答案:

答案 0 :(得分:0)

在迈克尔在所附的SO问题中概述的解决方案中,您没有使用任何Lambda类型的解析器。相反,您正在设置DynamoDB流以触发Lambda函数(如https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html中所述)。然后,该lambda函数中的代码将DynamoDB中更改的数据用于对您的AppSync端点的调用。确保随Lambda的请求一起发送所有必要的身份验证标头。

+--------+     +---------------+     +----------------+
|DynamoDB| --> |Lambda Function| --> |AppSync mutation|
+--------+     +---------------+     +----+-----+-----+
                                          |     |
                                     +----+     +----+
                                     v               v
                               +----------+    +----------+
                               |AppSync   |    |AppSync   |
                               |subscriber|    |subscriber|
                               +----------+    +----------+

您要发送到appsync端点的特定操作是您添加的变异,它没有数据源(NONE类型的数据源),并使用本地解析器重新广播了发送到该端点的所有数据向提出订阅请求的所有订阅者进行更改。需要注意的关键点是DynamoDB会触发Lambda,而不是AppSync。