这个问题已经存在,但我认为它会对SO产生更大的影响.
我创建了一个AWS Lambda @ Edge函数,以便在Cloudfront URL到达Origin之前重写它.
AWS Lambda @ Edge函数在发布时会自动复制到所有区域,因此我对每个区域都看到这一点并不感到惊讶:
这里开始出现问题:
我删除了Lambda @ Edge,因为它是一个测试,我想开始一个全新的,但复制品不会同时被删除.
当时没什么大不了的,我以为我可以创建一个新的Lambda @ Edge功能.
但你不能,因为Cloudfront触发器一次只能使用一个函数(因为副本使用它,你不能创建一个新函数).
而且,触发器也不能删除.
所以现在我无法在任何地方使用Lambda @ Edge复制品,我无法删除,也无法创建类似的复制品.
TL; DR
我很感激能得到这个
弗朗索瓦的 帮助
编辑:
我绝对认为这是一个错误,因为在我的副本页面中,主ARN的链接以404响应.
lambda amazon-web-services amazon-cloudfront aws-lambda aws-lambda-edge
这样做的动机首先来自亚马逊:https : //aws.amazon.com/blogs/compute/resize-images-on-the-fly-with-amazon-s3-aws-lambda-and-amazon -api-gateway/(在他们添加“更新”之前...)
在我们的 AWS Lambda 调整大小函数中,它调整图像大小并将新图像存储在 S3 上。
const s3_bucket = process.env.s3_bucket;
S3.putObject({
Body: buffer,
Bucket: s3_bucket,
ContentType: contentType,
CacheControl: 'max-age=31536000',
Key: key,
StorageClass: 'STANDARD'
}).promise()
Run Code Online (Sandbox Code Playgroud)
现在我们希望它适用于我们所有的测试/暂存环境以及生产..所以我找到了“环境变量”,我虽然很棒!但是当我尝试部署新版本时,我得到的是:
我们是否在 CloudFront 中设置错误?我们使用的是 Node 6.10 版。我发现很难相信我们是否必须对存储桶进行硬编码并保留不同版本的代码来处理这个问题?如果是这样,那么我们在使用 AWS Lambda 时浪费了很多时间......
编辑:我们所做的是请求像“media/catalog/product/3/0/30123/768x/lorem.jpg”这样的图像,然后我们使用位于“media/catalog/product/3/”的原始图像0/30123.jpg",如果浏览器支持,则将其调整为 768px 和 webp,然后返回新图像(如果尚未缓存)。
我已将查看器请求和源响应 Lambda 函数部署到 CloudFront 分配,这些函数正在触发,但未记录到 CloudWatch。我花了大量时间研究这个主题,并浏览了其他帖子的所有建议,包括:
有趣的是,当我故意将错误编码到一个 Lambda 函数中时,我确实在一个名为/aws/cloudfront/LambdaEdge/<cloudfront distribution id>包含错误日志的组中创建了日志,但是这里的 console.log 语句没有输出。
在我的一生中,我无法弄清楚如何将所有请求(成功和失败)记录到 CloudWatch,其中包含使用 console.log() 的调试语句。
AWSServiceRoleForCloudFrontLogger 包含一个策略AWSCloudFrontLogger:
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:/aws/cloudfront/*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
编辑:
以下是 AWS 支持建议的 AWS 角色。我可以确认这有效并解决了问题。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:*:*:*"
]
}
]
}```
Run Code Online (Sandbox Code Playgroud) amazon-web-services amazon-cloudfront aws-lambda aws-lambda-edge
正如文档中所解释的,我为Lambfront触发器设置了Lambda @ edge Viewer Response.
lambda函数代码:
'use strict';
exports.handler = (event, context, callback) => {
console.log('----EXECUTED------');
const response = event.Records[0].cf.response;
console.log(event.Records[0].cf_response);
callback(null, response);
};
Run Code Online (Sandbox Code Playgroud)
我已经为Viewer Response事件设置了适当的触发器.
现在,当我通过cloudfront发出请求时,必须将其记录在cloudwatch中,但事实并非如此.
如果我做一个简单的Test Lambda Function(使用Button),它会被正确记录.
这可能是什么问题?
amazon-web-services amazon-cloudfront aws-lambda aws-lambda-edge
我目前正在研究lambda @ edge函数.我在CloudWatch或其他调试选项上找不到任何日志.
使用"测试"按钮运行lambda时,日志将写入CloudWatch.
当CloudFront事件触发lambda函数时,不会写入日志.
我100%肯定事件触发器有效,因为我可以看到它的结果.
知道怎么办吗?
谢谢,
Yossi
amazon-web-services amazon-cloudwatch aws-lambda aws-xray aws-lambda-edge
嗨,我已按照此说明尝试使用 Cloudfront 和 lambda@edge 调整图像大小。当我尝试测试调整大小的图像时,我不断收到以下错误消息:
与 CloudFront 分配关联的 Lambda 函数无效或没有所需的权限。
于是查了一下开头提到的那篇文章提供的云形成创建的lambda函数,发现里面没有触发器。
我尝试手动设置它,但收到以下错误消息:
CloudFront 事件不能与 $LATEST 或别名关联。选择操作以发布新版本的函数,然后重试关联。
我按照错误消息中的说明进行操作;发布,并将 Cloudfront 添加为触发器,但似乎无法应用它。它仍在运行没有 Cloudfront 作为触发器的那个。
有什么方法可以将 Cloudfront 设置为触发器并使其正常工作?
amazon-web-services amazon-cloudfront aws-cloudformation aws-lambda aws-lambda-edge
作为我遇到的上一个问题的步骤之一,我需要查看某些 Lambda@Edge 的日志,但我无法在任何地方找到它们。
根据Lambda@Edge 上的文档:
当您在对错误进行故障排除时查看 CloudWatch 日志文件或指标时,请注意它们显示或存储在离函数执行位置最近的区域中。因此,如果您的网站或 Web 应用程序的用户位于英国,并且您有一个与您的分配关联的 Lambda 函数,例如,您必须更改区域以查看伦敦 AWS 区域的 CloudWatch 指标或日志文件。
us-east-1当我在加拿大时,我试图查找其日志的 lambda 函数位于(由 CloudFront 强制要求,因为它被用作分发的事件处理程序),所以我假设最近的区域是ca-central-1. 但由于我不是在发展ca-central-1. 在任何情况下,我都看不到 Lambda@Edge 的日志。为了完整起见,我检查了所有区域,但找不到 lambda 函数的任何日志痕迹。需要明确的是,我正在寻找一个带有 lambda 函数名称的日志组。
我肯定应该有日志,因为console.log()我的代码中有日志,而且我可以下载请求的内容(lambda 函数负责选择保存内容的 S3 存储桶),这意味着 lambda 函数已成功执行。如果不是,我应该无法获得 S3 内容。
在哪里可以找到我的 Lambda@Edge 函数的日志?
我有一个 Angular 应用程序的静态文件通过 Cloudfront 在 S3 存储桶上提供。我的 Cloudfront 发行版设置了错误页面,因此它仍然呈现 Angular 的 index.html。这意味着,如果我请求<cloudfront-distribution>.cloudfront.net/home-page,而不是说它没有找到home-page在 S3 存储桶上命名的文件,它仍然会渲染角度应用程序,并且角度应用程序将处理该/home-page路由。
我需要在应用程序服务器上包含一些安全标头,因此我设置了 Lambda@Edge 函数以将这些标头注入查看器响应事件(如此处所述https://aws.amazon.com/blogs/networking-and-content -delivery/adding-http-security-headers-using-lambdaedge-and-amazon-cloudfront/)。
Lambda@Edge 适用于实际对应于 S3 存储桶中的文件的路由(如果我image.png在 S3 存储桶的根文件夹上调用了一个文件,并且我请求<cloudfront-distribution>.cloudfront.net/image.png,我会看到通过 Lambda@ 注入的响应标头Edge 函数。问题是当访问与 S3 存储桶中的文件不对应的路由时。如果我访问<cloudfront-distribution>.cloudfront.net/home-page,S3 将返回 404,Cloudfront 将处理 404 并根据错误页面配置进行操作,即响应使用 200 状态代码并渲染 index.html 文件。当发生这种情况时,我看不到通过 Lambda@Edge 函数注入的任何标头,而我的 Angular 应用程序的所有其他脚本文件都有标头。
如何使所有响应都通过 Lambda@Edge 函数?
amazon-s3 amazon-web-services amazon-cloudfront angular aws-lambda-edge
我有一个无服务器的 lambda函数,在其中我想触发(调用)一个方法而忘记它
我用这种方式做
// myFunction1
const params = {
FunctionName: "myLambdaPath-myFunction2",
InvocationType: "Event",
Payload: JSON.stringify(body),
};
console.log('invoking lambda function2'); // Able to log this line
lambda.invoke(params, function(err, data) {
if (err) {
console.error(err, err.stack);
} else {
console.log(data);
}
});
// my function2 handler
myFunction2 = (event) => {
console.log('does not come here') // Not able to log this line
}
Run Code Online (Sandbox Code Playgroud)
我注意到,直到并且除非我执行Promise returnin myFunction1,否则它不会触发myFunction2,但是不应该设置lambda InvocationType = "Event"意味着我们希望此操作被触发并忘记并且不关心回调响应吗?
我在这里想念什么吗?
非常感谢您的帮助。
javascript aws-lambda serverless aws-lambda-edge aws-serverless
我正在尝试在 us-east-2 (Ohio) 区域创建一个 CloudFormation 堆栈。但是,收到以下错误
com.amazonaws.services.cloudfront.model.InvalidLambdaFunctionAssociationException:
The function must be in region 'us-east-1'
Run Code Online (Sandbox Code Playgroud)
我已经浏览了以下来源并了解这是 lambda 必须满足的要求。我的问题是为什么?为什么要设置这样的限制?我查看了文档,但他们只提到了 us-east-1 的用法,但没有提供任何推理!
https://github.com/awslabs/serverless-application-model/issues/635
https://medium.com/@mnylen/lambda-edge-gotchas-and-tips-93083f8b4152
aws-lambda-edge ×10
aws-lambda ×6
amazon-s3 ×1
angular ×1
aws-sam ×1
aws-xray ×1
javascript ×1
lambda ×1
serverless ×1