Заставить функцию DynamoDB Stream Lambda вызывать мутацию AWS AppSync - PullRequest
0 голосов
/ 05 марта 2019

У меня есть лямбда-функция, которая срабатывает, когда происходят изменения в моей таблице DynamodB. Когда я использую лямбда-преобразователь, я могу вызывать только лямбда-функцию из моей appsync, а это не то, что я пытаюсь сделать.

Я пытаюсь следовать приведенному здесь ответу:

Как подписаться непосредственно на мой источник данных AWS AppSync?

Но у меня проблемы с третьим шагом.

Спасибо

После ответа @Aaron_H это моя лямбда-функция:

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();
});
}

};

Я также использую безсерверный фреймворк, это моя конфигурация serverless.yml для моей лямбда-функции:

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

Моя проблема в том, что я хочу использовать Amazon Cognito User Pool для авторизации приложений. Как я могу использовать токены JWT в своем заголовке, если мой запрос поступает из потоков Dynamodb? У меня есть устройство IOT, которое вставляет данные в мою таблицу.

Спасибо!

1 Ответ

0 голосов
/ 12 марта 2019

В решении, изложенном Майклом в прилагаемом вопросе SO, вы не работаете с какими-либо распознавателями лямбда-типа. Вместо этого вы настраиваете поток DynamoDB для запуска лямбда-функции (как описано в https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html).. Затем код в этой лямбда-функции принимает данные, измененные в DynamoDB, для вызова вашей конечной точки AppSync. Убедитесь, что отправьте все необходимые заголовки аутентификации вместе с запросом от Lambda.

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

Конкретная операция, которую вы отправляете конечной точке appsync, - это добавленная вами мутация, которая не имеет источника данных (источник данных NONE-типа) и использует локальный преобразователь для повторной передачи любых данных, которые были отправлены на нее. мутация любых подписчиков, которые сделали запрос на подписку. Ключевым моментом, который стоит отметить, является то, что DynamoDB запускает лямбда, а не AppSync.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...