amazon-cloudfront - 触发 Dynamodb 时的 Lambda@Edge 给出 503 错误
问题描述
我正在尝试Lambda
通过 cloudfront viewer request 调用。这是我的 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
. 但是我尝试了相同的代码 withcodeDynamodb 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 权限。
感谢任何帮助谢谢
解决方案
您在哪里为 DyanamoDB 指定了区域?
Lambda@Edge 可能在您的 DDB 表丢失的区域中执行。查看有关区域优先顺序的AWS 文档。您还可以查看此L@E 研讨会代码和文档,了解有关调用 DDB 的更多详细信息。
附带说明:面向 Lambda 函数的查看器调用跨区域 dynamodb 表将对您的延迟产生负面影响。不确定您的用例,但看看是否可以将此调用移动到面向源的事件或对 ddb 进行异步调用。
推荐阅读
- javascript - 在 html5 画布中创建形状时创建了太多对象
- php - ci 休息服务器允许 CORS 不起作用
- angularjs - 无法设置未定义或空引用的属性“属性名称”
- autohotkey - 使用 Enter 按钮提交,而在其他地方正常工作
- swiftui - SwiftUI 选择器没有更新
- python - 如果最适合,如何将每个数据框列的 dtype 更改为浮动?
- c++ - c++程序返回“0 0”而不是返回素数。为什么它不能从“prime”函数中得到正确的输出?
- r - 通过 M3C 包进行聚类:`[.data.frame`(df, neworder2) 中的错误:选择了未定义的列
- java - Java 在我的电脑上本地存储数据而不使用 DB 最好在 .txt 文件中(如 C# 的 StreamReader 和 Writer)
- javascript - 当 div 到达窗口底部时,粘贴并滚动到下一个 div