问题标签 [aws-lambda-edge]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
53 浏览

java - 关于树莓模型 3 上的 AWS greengrass 边缘计算的问题

根据 AWS IOT Greengrass 开发指南,我想使用 raspberry 模型 3 设置边缘计算环境。在板上部署“helloworld”lambda函数时,出现了一个奇怪的问题,状态总是“进行中”,没有任何反馈。我尝试了几次以确保每个操作都正确,但同样的问题仍然存在。

请帮助提供一些建议如何找出原因并解决它。非常感谢

0 投票
2 回答
4486 浏览

amazon-web-services - 如何在 Cloudfront Lambda@Edge Origin Request 中添加自定义标头?

我有一个自定义来源的 Cloudfront 发行版。

我想使用 Lambda@Edge 原始请求来修改和添加一些额外的标头以转发到我的原始服务器。

下面是我的 Lambda 函数。这custom_header在我的 Lambda 的 Cloudwatch 日志中可见,但未显示在我的自定义服务器请求标头中:(。

我希望custom_header在我的 Node.js 路由中可见req.headers

0 投票
1 回答
3037 浏览

amazon-web-services - 如何在 cloudfront lambda@Edge 函数中访问 S3 存储桶对象?

我有一个与我的云端分发相关联的 Lambda 函数。

我想在这个 egde@lambda 函数中访问一些 S3 Bucket 对象。我没有找到一种方法来做到这一点,也不知道什么是最好的方法来做到这一点并且有最小的延迟。

我不想使用对存储桶的 http 调用来访问存储桶对象,因为它会给云端响应带来一些延迟。

任何人都知道如何在边缘 lambda 函数中访问与我的云端分布相关的 S3 存储桶?

非常感谢。

0 投票
1 回答
3315 浏览

amazon-web-services - 启用 Lambda@Edge 后调试 CloudFront 的问题

这篇文章之后,我尝试在 AWS 中提供来自多个区域(在同一域下)的静态内容。

到目前为止,我有:

  • 将我的内容上传到 S3 存储桶
  • 为该存储桶启用“静态网络托管”
  • 并公开
  • 在 CloudFront 中创建了一个以 S3 存储桶为源的分配
  • 在 Route 53 中创建了一个指向分布的记录集

在这一点上,一切正常。如果我在浏览器中输入域名,我可以看到静态内容。现在是时候让它多区域了:

  • 按照文章中的说明创建一个 lambda 函数,角色持有AdministratorAccess策略(出于绝望 - 一旦我让它工作,我会仔细设计适当的角色)
  • 将 lambda 函数链接到 CloudFront:Event type: origin-request, Include body: No, Path pattern: *
  • 编辑 CloudFront 分配,添加标头X-DNS-ORIGIN

应用这些步骤后,我必须等待一分钟才能生效。一旦它们生效,我就无法再打开网页了。这样做会导致此错误消息:

我什至启用了 CloudFront 的日志记录机制。但这也无济于事。日志只显示有一个LambdaExecutionError. 但它并没有说任何有用的东西。

我相信 lambda 函数根本没有被调用,因为我在 CloudWatch 中没有看到为它生成的任何日志。在这一点上,我不知道如何解决这个问题。任何帮助表示赞赏。

[编辑]

我忘了提。分配给 lambda 函数的角色在其信任关系选项卡lambda.amazonaws.com中具有edgelambda.amazonaws.com并列为服务。

0 投票
2 回答
5688 浏览

amazon-web-services - 在哪里可以找到 Lambda@Edge 的日志?

作为我遇到的上一个问题的步骤之一,我需要查看一些 Lambda@Edge 的日志,但我无法在任何地方找到它们。

根据Lambda@Edge 上的文档:

当您在排查错误时查看 CloudWatch 日志文件或指标时,请注意它们显示或存储在最接近函数执行位置的区域中。因此,如果您的网站或 Web 应用程序的用户位于英国,并且您有一个与您的分配关联的 Lambda 函数,那么您必须更改区域以查看伦敦 AWS 区域的 CloudWatch 指标或日志文件。

我试图查找日志的 lambda 函数位于us-east-1(由 CloudFront 强制执行,因为它用作分发的事件处理程序),而我在加拿大,所以我假设最近的区域是ca-central-1. 但是由于我不是在 开发ca-central-1,所以我在那个区域没有任何日志组。在任何情况下,我都看不到我的 Lambda@Edge 的日志。为了完整起见,我检查了所有区域,但找不到 lambda 函数的任何日志痕迹。为了清楚起见,我正在寻找一个带有 lambda 函数名称的日志组。

我很肯定应该有日志,因为我console.log()的代码中有日志,而且我可以下载请求的内容(lambda 函数负责选择保存内容的 S3 存储桶),这意味着 lambda 函数已成功执行。如果不是,我应该无法获得 S3 内容。

在哪里可以找到我的 Lambda@Edge 函数的日志?

0 投票
1 回答
898 浏览

amazon-web-services - AWS 无服务器 - 将云端 POST 请求修改为 s3 网站来源的 GET 请求

我有一个 CloudFront 分配,其中源设置为 s3 网站端点(在 s3 上提供静态 Web 应用程序)

现在我在 s3 上的 webapp 需要一些用户信息,这些信息只能通过 iframe 的 POST 请求提供。

我认为可以在 ViewerRequest 阶段使用 Lambda@edge 函数来捕获用户信息,然后在请求源之前将请求修改为 GET 并将令牌附加到源,从而允许 s3 服务。

但是我似乎无法让它工作。这甚至可能吗?

0 投票
0 回答
699 浏览

amazon-web-services - Cloudfront Lambda Egde 错误?更改查看器响应中的响应状态代码

问题是:为什么在 lambda edge 的 ViewerResponseEvents 中返回响应之前无法更改 http 状态?

我有一个 Lambda 函数,它必须检查每个响应并根据我在 lambda 函数中的 JSON 文件更改它的状态代码。我在查看器响应中部署了这个 lambda 函数,因为我希望这个函数在返回每个响应之前执行。Aws 文档 ( https://aws.amazon.com/blogs/networking-and-content-delivery/lambdaedge-design-best-practices/ ) 说如果你想为所有请求执行一个函数,它应该放在查看器事件中.

云端事件

所以,我创建了一个简单的函数,基本上是在返回之前克隆和更改响应的 http 状态代码。我做了这个代码进行测试:

};

当我访问 cloudwatch 中的日志时,它显示响应具有 http 404 代码,但由于某种原因,cloudfront 仍然返回具有 200 状态代码的响应。(我已经清除了浏览器缓存,在邮递员等其他工具中对其进行了测试,但在所有这些工具中,CloudFront 都返回 HTTP 200)

CloudWatch 日志和响应打印:

云观察日志 回复

如果我将此函数更改为在原始响应中执行,它将起作用,但我不想仅在缓存未命中时执行它(+ as aws 告诉我们原始事件将仅在这种情况下执行+)。由于原始事件仅在缓存未命中时执行,因此要执行该重定向,我必须创建一个 chache 标头破坏器以确保始终执行原始事件。

edge lambda 的这种行为真的很奇怪。有谁知道我该如何解决这个问题?我已经尝试清理用于测试请求的浏览器和工具的缓存,还清理了我的发行版的缓存,但仍然无法正常工作。

我一周前在 AWS 论坛上发布了这个问题,但仍然没有答案: https ://forums.aws.amazon.com/message.jspa?messageID=885516#885516

提前致谢。

0 投票
6 回答
14058 浏览

amazon-web-services - AWS Lambda@Edge Nodejs“不支持环境变量。”

采用这种方法的动机首先来自亚马逊:https ://aws.amazon.com/blogs/compute/resize-images-on-the-fly-with-amazon-s3-aws-lambda-and-amazon -api-gateway/(在他们添加“更新”之前......)

在我们的 AWS Lambda 调整大小函数中,它调整图像的大小并将新图像存储在 S3 上。

现在我们希望它适用于我们所有的测试/登台环境以及生产环境。所以我找到了“环境变量”,我虽然很棒!但是当我尝试部署一个新版本时,我得到的只是:

不支持环境变量

我们是否在 CloudFront 中设置错误?我们使用的是 Node 6.10 版本。我很难相信我们是否必须对存储桶进行硬编码并保留不同版本的代码来处理这个问题?如果是这样的话,那么我们在使用 AWS Lambda 上浪费了很多时间......

编辑:我们所做的是请求图像,如“media/catalog/product/3/0/30123/768x/lorem.jpg”,然后我们使用位于“media/catalog/product/3/”的原始图像0/30123.jpg”,如果浏览器支持,将其调整为 768px 和 webp,然后返回新图像(如果尚未缓存)。

0 投票
1 回答
529 浏览

c# - 使用 lambda@edge 重写 Cloudfront url

我想为我的图像提供友好的路径。例如:“ https://xxxxxx.cloudfront.net/images/friendly-file-name-132456.jpg

但是,实际上 S3 中的物理路径是:“ https://s3.amazonaws.com/images/132456.jpg

或多或少与 AWS 示例相同: https ://github.com/aws-samples/aws-lambda-edge-workshops/blob/master/Workshop1/Lab4_PrettyUrls/README.md#2-uri-rewrite

如何实现捕获对 S3 的请求并修改文件路径的 lambda@edge 函数?

非常感谢!

0 投票
2 回答
3696 浏览

amazon-cloudfront - Lambda@Edge 仅对某些图像提供 502

我们所做的是请求图像,如“media/catalog/product/3/0/30123/768x/lorem.jpg”,然后我们使用位于“media/catalog/product/3/0/”的原始图像30123.jpg”,如果浏览器支持,将其大小调整为 768px 和 webp,然后返回新图像(如果尚未缓存)。

如果您要求:所见即所得/lorem.jpg 它将尝试创建一个最大 1920 像素的 webp(不放大)。

对于 <= 1420 像素宽的图像,这似乎工作得很好。然而,在这之上我们只得到HTTP 502: The Lambda function returned invalid json: The json output is not parsable.

SO上有一个与GZIP相关的类似问题,但是据我所知,您不应该真正使用GZIP图像:https ://webmasters.stackexchange.com/questions/8382/gzipped-images-is-it-worth/57590# 57590

但是原始图像可能已经上传到 S3 GZIPPED。但是 gzip 可能会导致错误,因为为什么它适用于较小的图像呢?我们在 Cloudfront 中禁用了 GZIP。

我已经给了 Lamda@Edge Resize 函数最大资源 3GB 内存和 30 秒的超时时间。这对于更大的图像来说还不够吗?

我已经删除了已经生成的图像,使 Cloudfront 无效,但它的行为仍然相同..

编辑:更新

我只是尝试了一个不同的图像,然后它工作正常..我不知道为什么以及如何解决损坏的图像......我猜 Cloudfront 现在已经缓存了 502..我只使用“*”无效但没有'没有帮助..两个原始文件都是jpg。

工作的原始源图像是 6.1 MB,如果重要的话,非工作的源图像是 6.7 MB。

他们有这些限制: https ://docs.aws.amazon.com/lambda/latest/dg/limits.html

response.body 停止工作时大约为 512 MB。