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

amazon-web-services - Cloudfront Lambda@edge 在查看者请求上设置 cookie

更新:更好地收集了我的想法

我在查看器请求 Lambda 中为每个用户生成一个唯一标识符 (UUID),然后根据该 UUID 选择要返回的缓存页面。这行得通。

理想情况下,该用户将始终具有相同的 UUID。

如果该查看器请求的 cookie 中不存在该 UUID,我必须在查看器请求中生成该 UUID 。我还需要将该 UUID 设置为 cookie,这当然发生在响应而不是请求中。

如果没有缓存,我的服务器只需处理一个自定义标头并在响应标头中创建一个 Set-Cookie。

如果我想缓存页面,我找不到处理这个问题的方法。我可以忽略缓存的请求标头并提供正确的缓存页面,但随后用户不会保留该 UUID,因为没有设置 cookie 用于他们的下一个请求。

有没有人完成过这样的事情?

我正在尝试的事情

我正在处理几个角度,但还没有开始工作:

  1. 我不知道 Cloudfront 中的某种设置会处理从查看器请求到查看器响应的标头或其他数据传递,这可以在 Cloudfront 中的第二个 lambda 中使用。

  2. 在查看器请求中抢先修改响应对象标头。我认为这是不可能的,因为它们返回的标头尚未创建,除非我缺少一些内置的 Cloudfront 方法。

  3. 某种现有的传递标头,我不知道这是否是一回事,因为我对请求-响应处理的这方面并不十分熟悉,但值得一试。

  4. 可能(虽然还没有尝试过)我可以在客户端请求 lambda 中创建整个响应对象,并以某种方式从那里提供缓存页面,修改响应标头然后将其传递给回调方法。

托宾的回答确实有效,但不是一个可靠的解决方案。如果用户没有存储或提供他们的 cookie,它就会变成一个无限循环,而且如果我可以避免的话,我宁愿不要在我的所有页面前面抛出一个重定向


有点工作的概念

  1. 查看器请求 Lambda,当 UUID 不存在于 cookie 中时,生成 UUID
  2. 查看器请求 Lambda 在请求对象的标头上的 cookie 中设置 UUID。传入更新请求对象的回调
  3. UUID cookie 的存在会破坏 Cloudfront 缓存
  4. 原始请求 Lambda 在存在 UUID 的情况下触发
  5. 原始请求 Lambda 通过http.get设置 UUID cookie 再次调用原始请求 URL(40KB 限制使得在查看器请求 Lambda 中执行此操作不切实际)
  6. Viewer Request Lambda 的第二种情况,看到 UUID 现在存在,剥离 UUID cookie 然后正常继续请求
  7. 第二个源请求(如果尚未缓存) - 如果缓存了缓存响应,因为缓存破坏 UUID 不存在 - 将实际页面 HTML 返回到第一个源请求
  8. First Origin Request 收到来自http.get包含 HTML 的响应
  9. First Origin Request 创建自定义响应对象,其中包含响应正文http.get和 Set-Cookie 标头设置为我们的原始 UUID

已设置 UUID 的后续调用将从 cookie 中删除 UUID(以防止缓存破坏)并直接跳到 Viewer Request Lambda 中的第二个场景,这将直接加载页面的缓存版本。

我说“有点”是因为当我尝试访问我的端点时,我下载了一个二进制文件。

编辑

这是因为我没有设置content-type标题。我现在只有一个 302 重定向问题......如果我克服了这个问题,我会发布一个完整的答案。


原始问题

我在查看器请求上有一个函数,它选择一个选项并在从缓存或服务器检索请求之前在请求中设置一些内容。

这行得通,但我希望它为未来的用户记住这个选择。这个想法是简单地设置一个cookie,我可以在下次用户访问时读取。由于这是在查看器请求而不是查看器响应上,我还没有弄清楚如何实现这一点,或者甚至可以通过 Lambda 本身实现。

我已经看过这些示例,并且能够通过 Lambda 在查看器响应中成功设置 cookie。这对我没有多大帮助,因为需要根据请求做出决定。毫不奇怪,将此代码添加到查看器请求中不会在响应中显示任何内容。

0 投票
0 回答
206 浏览

amazon-web-services - 将信息从客户端请求传递到客户端响应

使用 AWS Cloudfront 的 Lambda@edge 功能,我想将客户端请求上生成的一些字符串传递给客户端响应。最好不要在服务器上修改源。

我注意到 AWS 使用的 IDx-amz-cf-id位于我的浏览器响应的标头中,并且由 AWS 在 Origin Request 之前添加以标识该单个请求

因此,从表面上看,这些数据似乎可以通过标头传递,但设置一个自定义名称的标头似乎不会使其返回浏览器。我用了:

任何想法,或者这是一个已知的限制?

澄清

简短的版本是,有没有办法从客户端请求 lambda 获取数据到客户端响应 lambda?

0 投票
0 回答
42 浏览

amazon-web-services - 在 AWS 中保留起始 URL 时重定向 URL

我有以下问题:

现有应用程序具有mysite.com的 url

用户可以来自不同的域:

example.comexample1.com

等等

我需要将用户从example.comexample1.com重定向到mysite.com。它们是原始 url 的关键部分,必须保留。

因此,如果我是来自example.com的用户,我应该在mysite.com上看到exmaple.com 。

mysite.com 是 aws 无服务器堆栈的一部分 - 使用 AWS Lambda、AWS API Gateway 和 S3

0 投票
1 回答
1080 浏览

amazon-dynamodb - 如何使用 Dynamodb 全局表和 Lambda@edge 选择正确的区域?

我创建了一个 Lambda 函数,它从 DynamoDB 检索一些数据,它会输出一些 JSON。我想要做的是在 lambda@edge 中运行这个函数并生成一个我可以使用 Cloudfront 缓存的响应。

我面临的问题是,我在 DynamoDB 中的数据使用全局表在(当前)两个区域(us-east-2 和 eu-west-1)中复制,而 lambda@edge 显然在许多区域中运行。

这使我无法AWS_REGION从 lambda 环境中使用。例如,如果一个请求在 us-west-1 中运行,环境变量会反映这一点,并且它会尝试从 us-west-1 检索数据,它实际上应该去往 us-east-2。

虽然我承认我还没有尝试过这个(还),但我想知道是否可以在 Route53 中设置我自己的基于延迟的路由,将 ddb.mydomain.com 指向我使用的区域中 DynamoDB 的端点,假设 SAN 证书已设置起来它会工作吗?

我想也许我可以按照下面的示例在代码中映射区域

这感觉就像它的维护比它的价值更多,并且依赖于我对最佳选择区域的假设。我还必须更新我的地区列表。

当新数据中心稍微开放时,我可以只使用该区域的前两个字母来限制更新它的需要,但这仍然不理想

我怀疑我遗漏了一些明显的东西,这可能使我能够从 lambda@edge 明智地选择我的数据所在的区域。

编辑

从那以后我发现了这个,一个已被删除的 aws lambda@edge 研讨会,它提出了与上述类似的方法。为什么它被删除我不知道。

该研讨会的自述文件现在只是讨论了使用全局表来减少延迟的选项,但没有提供关于如何选择最接近的具有数据的表的见解。

编辑 2

我从 cloudping 中获取了延迟数据的副本,并将以下要点拼凑在一起,现在可以使用。

https://gist.github.com/benswinburne/06a00fab330dca93ea6df2552f73850a

这样做的缺点显然是数据陈旧。不幸的是,cloudping 的 api 对于此目的还不够快,一旦我去远程资源获取最新数据,我还不如去任何地区的 DynamoDB 表¯\_(ツ)_/ ¯

0 投票
2 回答
1772 浏览

serverless-framework - 没有硬编码变量的 lambda@edge 函数

我正在使用无服务器框架,并且我正在一次构建所有资源。我在 AWS cloudfront 查看器请求端有 lambda@edge 函数,该函数需要访问 cognito 用户池 ID。由于我无法将环境变量传递给 lambda@edge 函数,我别无选择,只能在 lambda@edge 函数中硬编码用户池 ID,这至少可以说是非常烦人的。但事情变得更糟,我无法获取用户池 ID,直到我部署所有内容然后选择用户池 ID 并将其硬编码到函数中,然后重新部署。这一切有更好的解决方案吗?

0 投票
1 回答
4062 浏览

amazon-web-services - 如何通过在云端调整图像 lambda 边缘函数来修复 503 错误?

我正在尝试根据文章使用云端分布调整图像大小: https ://aws.amazon.com/tr/blogs/networking-and-content-delivery/resizing-images-with-amazon-cloudfront-lambdaedge-aws-cdn -博客/

我在文章上创建了具有给定 Origin-Response 和 Viewer-Request 函数的项目文件夹,并下载了依赖项,使用 cloudformation 模板部署了 zip 包。

IAM 角色、s3 存储桶、存储桶策略、使用 lambda@edge 函数的分配均在没有任何错误的情况下创建,并且它们似乎都兼容。

但是当我尝试调整原始存储桶中的图像大小时出现以下错误;

“503 错误无法满足请求。与 CloudFront 分配关联的 Lambda 函数无效或没有所需的权限。”

我也没有看到任何关于监控的内容,这意味着我的函数没有被调用。

我使用“AdministratorAccess”策略和信任关系创建了另一个管理员角色“edgelambda.amazonaws.com”、“lambda.amazonaws.com”

我将我的存储桶策略更改为所有公共。

我可以查看图像,但是当我尝试通过将查询字符串添加到云端分发 url 来调整大小时仍然出现 503 错误

“xxxxxxxxx.net/images/pexels.jpeg?d=100x100”

这是我的存储桶、存储桶策略、IAM 角色和功能。

存储桶名称:image-resize-488052071209-us-east-1

桶装政策:

IAM 角色:

查看者请求函数

源响应函数:

0 投票
1 回答
229 浏览

amazon-web-services - lambda@edge 中的速度修复或替代方案

我有一个在客户端请求上运行的 lambda@edge。我将消息放入 SQS 以由另一个 lambda 处理。

更新后我的脚本的第一次运行非常长 - 经常超过五秒的硬超时,这不是一个好的用户体验。

其中大部分是加载 AWS 开发工具包,始终超过 2.5 秒

我也在加载 https

第一次运行大约需要 120 毫秒。

许多后续运行完全在亚毫秒内完成,很少超过 5 毫秒。

有没有其他人遇到过这个问题 - 并希望找到克服它的方法?我没有通过 googlefu 找到任何东西。了解第一次运行和后续运行之间的差异会有所帮助。

疯狂的想法

@jogold 带来了一些有趣的阅读。

出于某种原因,我认为将 require 放在导出之外会很有趣。

从:

至:

在几次(相当肯定的)冷启动中,第一次检查现在下降到大约 300 毫秒。也许这只是其他人都知道的事情,也是我对 NodeJS 知识的一个空白,但是如果其他人来寻找 Lambda@Edge 执行时间的问题,那就去吧。

0 投票
1 回答
370 浏览

amazon-web-services - 如何在使用 lambda@edge 调整图像大小时修复访问被拒绝错误

我正在尝试在已经存在的 s3 存储桶及其分布上使用下面文章中的 Lambda@Edge 函数:

https://aws.amazon.com/blogs/networking-and-content-delivery/resizing-images-with-amazon-cloudfront-lambdaedge-aws-cdn-blog/

我可以访问图像,但每当我尝试调整大小时,我都会收到“拒绝访问”错误。

S3 存储桶是公开可读的。在存储桶策略中,我为公共和正在使用的 IAM 角色 lambda 函数提供了 put object get object 权限。

我已将各种 lambda 策略附加到函数的 IAM 角色,如下所示:

AWSLambdaFullAccess、CloudFrontFullAccess、AdministratorAccess、AWSLambdaExecute、AWSLambdaBasicExecutionRole、AWSLambdaRole

Distributions 查看协议策略 HTTP 和 HTTPS 所以请求类型应该不是问题 任何人都可以帮忙吗?我快疯了 :(

0 投票
2 回答
980 浏览

c# - 使用 AWS Lambda 的 .NET Core cookie 身份验证不持久

我无法通过使用 .NET Core 2.1 MVC 的 AWS Lambda 函数获得 cookie 身份验证。

我已经尝试了很多 cookie 选项的变体。我可以登录并看到响应中创建的 asp cookie,但通常在我刷新或单击任何链接(例如对服务器的下一个请求)后,我会返回登录屏幕。*更新:看来我的状态是我现在只需最初登录两次并保持登录状态。这也是我注意到这种行为的第二个使用 .net 2.1 的 Lambda 函数。

我配置了 API 网关,并在使用 AWS 扩展为 Visual Studio 进行部署时设置了默认值。

我当前的 startup.cs 代码,可在 localhost 上运行:

我在登录时也尝试过使用以下内容:

只需使用以下内容即可让我保持登录状态,但我必须在 cookie 持续存在之前登录两次(在单击任何内容并被重定向到再次登录后再次登录):

0 投票
1 回答
1642 浏览

amazon-web-services - 在 AWS Lambda@edge 中获取推荐人

在记录的事件结构中没有看到引用者,并且我在我的测试 lambda 中没有看到对象中的任何内容 - 但这不一定是实时请求的准确表示。

有没有办法确定 lambda@edge 内请求中的引用者。具体来说,我在 ClientRequest 中工作。