Лямбда @ Edge при срабатывании Dynamodb дает 503 Ошибка - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь вызвать Lambda через запрос средства просмотра облачного фронта. Вот мой лямбда-код

'use strict';
const AWS = require("aws-sdk");
const docClient = new AWS.DynamoDB.DocumentClient();
exports.handler = (event, context, callback) => {
    /* Get request */
    const request = event.Records[0].cf.request;
    const requestbody = Buffer.from(request.body.data, 'base64').toString();
    const data = JSON.parse(requestbody);
    const Id = data.Name;
    console.log(Id);

    /* Generate body for response */
    const body = 
     '<html>\n'
     + '<head><title>Hello From Lambda@Edge</title></head>\n'
     + '<body>\n'
     + '<h1>You clicked more than 10 Times </h1>\n'
     + '</body>\n'
     + '</html>';
    var params = {
        TableName: "Test",
         ProjectionExpression: "#V,#N",
         KeyConditionExpression: "#N = :v1",
         ExpressionAttributeNames: { 
                  "#N" : "Name",
                  "#V" : "Value"
                                  },
  ExpressionAttributeValues: {
  ":v1": Id
  }
 };
var querydb = docClient.query(params).promise();
querydb.then(function(data) {
    console.log(data.Items[0].Value);
    if(data.Items[0].Value >= 11){
    const response = {
        status: '200',
        body: body,
    };
    callback(null, response);
}else {
    callback(null,request);
}
}).catch(function(err) {
  console.log(err);
});
};

Когда я запускаю ту же лямбду через консоль, она дает правильный ответ. Но когда я развернул через Cloudfront, это дает 503 Error. Но я попробовал тот же код с кодом Dynamodb Client, он работал отлично. Вот рабочий

'use strict';
const AWS = require("aws-sdk");
const docClient = new AWS.DynamoDB.DocumentClient();
exports.handler = (event, context, callback) => {
    /* Get request */
    const request = event.Records[0].cf.request;
    const requestbody = Buffer.from(request.body.data, 'base64').toString();
    const data = JSON.parse(requestbody);

    /* Generate body for response */
    const body = 
     '<html>\n'
     + '<head><title>Hello From Lambda@Edge</title></head>\n'
     + '<body>\n'
     + '<h1>You clicked more than 10 Times </h1>\n'
     + '</body>\n'
     + '</html>';
     if(data.Value >= 10){
    const response = {
        status: '200',
        body: body,
    };

    callback(null, response);
}
else {
 callback(null, request);
}
};

Я дал полные полномочия DynamodB для lambda @ edge.

Любая помощь приветствуется Спасибо

1 Ответ

0 голосов
/ 12 ноября 2018

Где вы указали регион для DyanamoDB?
Возможно, что Lambda @ Edge работает в регионе, где отсутствует ваша таблица DDB. Взгляните на документ AWS в порядке приоритета региона . Вы также можете ознакомиться с этой L @ E мастерской и документацией для получения более подробной информации о вызове DDB.
Примечание: зритель, обращенный к лямбда-функции и выполняющий вызов таблицы динамической базы данных между регионами, отрицательно повлияет на вашу задержку. Не уверен насчет вашего варианта использования, но посмотрите, возможно ли переместить этот вызов в исходное событие или сделать асинхронный вызов ddb.

...