问题标签 [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 投票
0 回答
235 浏览

aws-lambda - CloudFront 不使用 Lambda@Edge 从自定义源获取根 url

我有一个 Lambda@Edge 函数,它根据标头值决定在源请求上使用哪个源。

它不适用于根 url (mysite.com),但它适用于子路由 (mysite.com/sth/abc)。我正在寻求帮助,同时试图弄清楚为什么它不适用于根 url。

它看起来像这样:

默认来源是 S3 静态页面托管。formaviva-agent 在查看器请求 Lambda 函数中设置,该函数检查 User-Agent 是否属于机器人。

Formaviva-agent 被列入白名单。

从日志来看,一切顺利,机器人被识别并且原点被更改为自定义原点:

在这种情况下,Cloudfront 仍然提供来自 S3 源的内容。自定义源服务器未命中(已确认)。即使指定了自定义原点。为什么?

0 投票
1 回答
6378 浏览

amazon-web-services - 当我在 Lambda@Edge 源请求函数中替换正文时出现验证错误

我在提供 HLS 视频的 s3 存储桶前面有 Cloudfront。我正在尝试动态修改清单文件以向其中的段添加身份验证令牌。

我真正想做的是修改我在查看器响应函数中发送回客户端的正文,但由于这是不可能的,我正在尝试使用源请求函数从 S3 手动获取对象,修改它,并返回带有新正文的 Cloudfront 请求。我收到“Lambda 函数结果验证失败:主体不是字符串、不是对象或超出最大大小”的 503 错误

我的身体小于 8kb(文档中的限制是 1MB)。据我所知,我生成的云端请求对象看起来不错,并且 base64 数据解码为我想要的。我也尝试过使用文本而不是 base64。我在 Cloudfront 中启用了“包含正文”。

0 投票
1 回答
2030 浏览

amazon-s3 - Lambda@Edge Cache-Control 标头不存在 Cloudfront

我有存储在 S3 上的图像和一个 lambda 函数来动态调整它们的大小。在执行此操作时,我添加CacheControl: 'max-age=31536000'到调整大小的图像并添加一个 Cache-Control 标头:

如果缩略图已经生成,我就这样做:

在我的 Cloudfront 发行版中,我有以下设置:

  • 基于选定请求标头的缓存:无
  • 对象缓存:使用原始缓存标头

lambda 工作正常,但是当我查看 devtools 时,Chrome 似乎从不缓存图像。这是我得到的信息:

Control-Cache 不存在,我无法弄清楚...

当我使分发中的所有图像无效时,唯一的变化是 x-cache 的值:第一次加载时出现“来自云端的错误”(状态 200 并且图像加载正常)

0 投票
1 回答
9 浏览

aws-lambda - Lamda@edge 客户端响应向客户端脚本返回信息

我在客户端响应上有一个有效的 Lambda@edge。我有一些数据需要发送给客户。

无法修改响应正文,我想看看是否可以通过另一种方式获取此数据,而无需在客户端请求 lambda 中创建自定义响应。此信息将由返回的响应中的现有 javascript 函数使用。如果需要,我可以修改那个 javascript 函数。

该页面上的 javascript 无法读取响应中的标题,因此很多内容都是平淡无奇的。服务器处理和响应过于繁重(旧版应用程序,非常糟糕),因此我不愿意在页面上创建第二个异步请求,只是为了尝试获取这些标头。

客户端响应 lambda 的响应对象中是否有任何内容既可以在响应上设置又可以由页面准备好?

0 投票
3 回答
3699 浏览

node.js - 无法在 export.handler (/var/task/index.js:4:34) 读取未定义的属性“0”

当我尝试执行函数抛出错误时,我创建了一个 Lambda 函数

0 投票
0 回答
68 浏览

amazon-s3 - 为什么带有/不带有“--compressed”标志的 curl 调用之间的缓存控制值不同?

总的来说,我对标头、缓存和卷曲有一个非常初步的理解,更不用说 Cloudfront/S3 以及它们在做什么了——所以,抱歉,如果这最终没有任何意义。

目前,我们有一个带有 originResponse 的 Lambda Edge 脚本,用于设置缓存控制 max-age 值。它使用带有内容类型案例的开关来分配不同的值,如果所有案例都未命中,则默认为默认值。

当我尝试curl -I内容时,它会返回预期的最大年龄,但使用curl -I --compressed或仅从浏览器中检查会显示所有设置为开关的默认值。

我想我知道它与压缩有关,但就我而言,我完全不知道如何解决这个问题。

请求标头具有accept-encoding: gzip, ...,但没有内容具有响应标头content-encoding: gzip。我不知道 Cloudfront 是否会在合适的情况下自动设置该标头本身——如果是这样,内容是否仍可以以 gzip 以外的其他格式“压缩”?缺少content-encoding标题会导致奇怪吗?这甚至与我的问题有关吗?

现在,我想再次为这个问题的意义不大表示歉意,该网站的工作方式有几个层次,而且我不确定在我自己的困惑之上与 NDA 的界限在哪里。

标题真的是我的问题简短。我试图弄清楚如何让 curl 调用--compressedshow 与没有相同的 max-age 。

编辑:目前还有一个 S3(?) 将 MIME 内容类型分配给binary/octet-stream我正在处理的 .woff2 字体之类的问题。我不知道这些问题有多相关,以及是否可能重新分配类型或对象重组(如果这是一件事?)导致切换失败。但是就是说,原始问题中的内容类型显示了预期的内容,所以我不知道为什么它会达到默认值。

编辑 2:我最初在reddit上发布了这个问题,以便在评论中提供更多背景信息。

0 投票
0 回答
117 浏览

amazon-web-services - 如何将请求从一个域重新路由到 AWS CloudFront 中的另一个域?

我有一个 lambda 函数(例如 /getName)。这将由一个域(例如 A)托管,并且可以由多个域(A、B、C 等)触发。我需要设置 CloudFront,以便将来自域 B 的 /getName 请求重新路由或重定向到域 A,而无需显式重定向(返回 301)到浏览器。

例如,当浏览器对 www.B.com/getName 进行 ajax 调用时,在内部它应该是对 www.A.com/getName 的调用。客户端/浏览器不应看到对 www.A.com/getName 的调用。

这在 CloudFront 中可行吗?如果是这样,设置它的正确方法是什么?

0 投票
1 回答
2598 浏览

angular - AWS Lambda@Edge 将查询字符串附加到响应

简短概述。

我在 S3 存储桶上托管一个 Angular 应用程序。我还有一个 Cloudfront 分发版来处理 HTTPS 和重定向。

我尝试根据用户连接的 URL 形成一个查询字符串参数。

2 个例子

到目前为止,我尝试实现一个AWS lambda@Edge 函数,但到目前为止没有任何效果。如果我尝试操纵request它不会有任何影响,如果我试图操纵response重定向不起作用并且我得到一个 S3 存储桶错误或 Cloudfront 错误。

1)我应该使用哪个触发器?

2) Cloudfront 设置中可能缺少哪些设置?

3) 我的 Lambda 函数错了吗?

0 投票
1 回答
2314 浏览

amazon-web-services - AWS Lambda@Edge 没有记录

我将查看器请求和源响应 Lambda 函数部署到 CloudFront 分配,它们正在触发,但没有记录到 CloudWatch。我花了相当多的时间来研究这个主题,并浏览了其他帖子的所有建议,包括:

  • 检查所有区域的日志,因为我知道它们 CloudWatch 日志将在 labmda@edge 函数运行的区域中创建。没有任何登录。
  • 我已检查 AWSServiceRoleForCloudFrontLogger 角色是否存在。

有趣的是,当我故意将错误编码到一个 Lambda 函数中时,我确实会在一个名为/aws/cloudfront/LambdaEdge/<cloudfront distribution id>包含错误日志的组中创建日志,但是这里的 console.log 语句没有输出。

对于我的一生,我无法弄清楚如何启用将所有请求(包括成功和失败)记录到 CloudWatch,其中包含使用 console.log() 的调试语句。

AWSServiceRoleForCloudFrontLogger 包含一个策略AWSCloudFrontLogger

编辑:

以下是 AWS 支持建议的 AWS 角色。我可以确认这有效并解决了问题。

0 投票
1 回答
1443 浏览

node.js - 我想在 AWS lambda 的帮助下从 AWS CloudFront 更改 URL

我有一个 URL,假设是“www.sample.com/hello”。现在我在查看器请求中触发了一个 lambda 函数,我只需将 url 更改为“www.sample.com/hello2”。我使用 lambda 边缘函数做到了,但它给了我一个错误。

这是我在 lamda 中写的代码

我收到此错误