【问题标题】:Lambda@Edge when triggered Dynamodb giving 503 Error触发 Dynamodb 时的 Lambda@Edge 给出 503 错误
【发布时间】:2019-04-13 14:35:06
【问题描述】:

我正在尝试通过 cloudfront viewer request 调用 Lambda。这是我的 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);
});
};

当我通过控制台触发相同的 lambda 时,它会给出正确的响应。但是当我通过 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);
}
};

我已授予 lambda@edge 的完整 dynamodb 权限。

任何帮助表示赞赏 谢谢

【问题讨论】:

    标签: amazon-cloudfront aws-lambda-edge


    【解决方案1】:

    您在哪里为 DyanamoDB 指定了区域?
    Lambda@Edge 可能在您的 DDB 表丢失的区域中执行。 查看region's order of precedence 上的 AWS 文档。您还可以查看此L@E workshop codedocumentation,了解有关调用 DDB 的更多详细信息。
    附带说明:面向 Lambda 函数的查看器调用跨区域 dynamodb 表将对您的延迟产生负面影响。不确定您的用例,但看看是否可以将此调用移至面向源的事件或对 ddb 进行异步调用。

    【讨论】:

    • 谢谢@Mr.Ocean。我假设它将采用默认区域名称us-east-1,因为我正在从 N.Virginia 运行这个 lambda@edge。这条线就像一个魅力 const ddbEU = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-10-08', region: 'us-east-1'}); 。我什至尝试过这样AWS.config.update({ region: "us-east-1", endpoint: "http://dynamodb.us-east-1.amazonaws.com" });,但没有成功。
    • @Private Lambda@Edge 从最接近发出请求的客户端的任何区域执行。因此,如果我提出一个调用该 Lambda 的请求,它可能会发生在其中一个欧洲数据中心。 Lambda@Edge 代码始终根据您的 CloudFront 分配配置进行分配。这也意味着,如果您想查看该 Lambda 的日志,则需要查看发生错误的区域,而不是 us-east-1。
    猜你喜欢
    • 1970-01-01
    • 2018-08-29
    • 2011-06-18
    • 2020-09-01
    • 2020-06-02
    • 2020-12-08
    • 2021-12-28
    • 2023-01-27
    • 1970-01-01
    相关资源
    最近更新 更多