Aws lambda 使DynamoDB Stream Lambda函数调用AWS AppSync

Aws lambda 使DynamoDB Stream Lambda函数调用AWS AppSync,aws-lambda,amazon-dynamodb,graphql,aws-appsync,Aws Lambda,Amazon Dynamodb,Graphql,Aws Appsync,我有一个lambda函数,当dynamodb表中发生更改时会触发该函数。当我使用lambda解析器时,我只能从我的appsync调用lambda函数,这不是我想要做的 我试图遵循这里提供的答案: 但是我在第三步遇到了问题 谢谢 以下@Aaron_H回答这是我的lambda函数: module.exports.triggerStream = async (event, context, callback) => { if(event.Records[0].eventName === 'IN

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

我试图遵循这里提供的答案:

但是我在第三步遇到了问题

谢谢

以下@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();
});
}
function:triggerStream:
handler: handler.triggerStream
events:
   - stream:
      type: dynamodb
      batchSize: 1
      startingPosition: LATEST
      arn: myExistingTableArn    
})

我也在使用无服务器框架,这是我的serverless.yml配置,用于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();
});
}
function:triggerStream:
handler: handler.triggerStream
events:
   - stream:
      type: dynamodb
      batchSize: 1
      startingPosition: LATEST
      arn: myExistingTableArn    
我的问题是我想使用Amazon Cognito用户池进行appsync授权。如果我的请求来自Dynamodb流,我应该如何在头中使用JWT令牌?我有一个物联网设备,可以在我的表中插入数据


谢谢大家!

在Michael在随附的SO问题中概述的解决方案中,您没有使用任何Lambda类型的解析器。相反,您正在设置DynamoDB流以触发Lambda函数(如中所述)。然后,lambda函数中的代码获取DynamoDB中更改的数据,以调用AppSync端点。确保将任何必要的身份验证头与Lambda的请求一起发送

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

发送到appsync端点的特定操作是您添加的变异,它没有数据源(无类型数据源),并使用本地解析程序将发送到该变异的任何数据重新广播给发出订阅请求的任何订阅者。需要注意的关键点是DynamoDB触发的是Lambda,而不是AppSync。

谢谢!我知道有一个lambda函数,当一个项插入到我的Dynamodb表中时,它会被触发,lambda函数会调用一个变异。除了授权标头之外,其他一切都正常工作。我使用了标题中指定的api键,但当涉及到使用AmazonCognito用户池时,我完全不知所措。如果调用来自dynamodb流,如何检索JWT?我有一个在我的表中插入数据的iot设备。您可以选择将后端用户的JWT嵌入Lambda函数,或者选择Lambda可以用来从Cognito检索JWT的用户名和密码,然后将其添加到AppSync调用中的授权标头中。谢谢!我在后端使用了adminInitiateAuth和ADMIN_NO_SRP_AUTH,它的工作方式和我希望的一样!dynamoDB流是否可能直接触发
appsync
订阅?假设有两个appsync修改同一个Dynamo表,我希望一个appsync接口向另一个appsync端点发送更新。