标签: aws-lambda-edge

启用 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

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

503 ERROR
The request could not be satisfied.
The Lambda function associated with the CloudFront distribution is invalid or doesn't have the required permissions. 
If you received this error while trying to use an …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-cloudfront aws-lambda-edge

4
推荐指数
1
解决办法
2608
查看次数

Cloudfront Lambda@edge 在查看者请求上设置 cookie

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

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

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

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

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

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

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

我正在尝试的事情

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

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

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

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

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

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


有点工作的概念

  1. 查看器请求 Lambda,当 cookie 中不存在 UUID 时,生成 UUID
  2. 查看器请求 Lambda 在请求对象标头的 cookie 中设置 UUID。传入更新的请求对象的回调
  3. UUID cookie 的存在破坏了 Cloudfront 缓存
  4. 源请求 Lambda 在存在 UUID 的情况下触发
  5. 源请求 Lambda 通过http.get设置 UUID cookie再次调用原始请求 URL (40KB 限制使得在查看器请求 …

amazon-web-services amazon-cloudfront aws-lambda aws-lambda-edge

4
推荐指数
1
解决办法
5856
查看次数

如何使用 CLI 更新 cloudfront 分发中的 lambda@edge ARN

我想使用 CLI 使用最新的 lambda@edge 函数更新 cloudfront 发行版。

我看到了此文档,但无法弄清楚如何仅更新 lambda ARN。

有人可以帮忙吗?

amazon-web-services amazon-cloudfront aws-lambda-edge

4
推荐指数
1
解决办法
2870
查看次数

从AWS lambda @ edge访问原始URL

我正在尝试使用AWS Cloudfront上的lambda @ edge对多个网站实施“代理”。

我的设置大致是:

DNS:*。domain.com-> some_uuid.cloudfront.net(Cloudfront发行版)

Cloudfront:some_uuid.cloudfront.net-> S3存储桶来源

s3存储桶:网站/(包含多个网站的文件夹)

lambda @ edge函数:定义为起点请求

我的lambda @ edge函数非常简单:

  1. 检查网站资源是否在s3存储桶中。

  2. 如果是,请将请求uri更改为资源s3 url。

  3. 如果不是,则向后端服务器发送请求以渲染资源,将其存储在s3上并返回。

我在获取网站的原始域时遇到问题。例如,如果我尝试访问“ my_website.domain.com”,则在我的lambda函数中,我没有请求中的该域信息。

我认为我可以实现另一个lambda @ edge函数作为查看器请求,以将域作为标头传递,但是如果可以的话,我宁愿避免这种情况。

还有其他解决方案吗?

谢谢

javascript node.js amazon-cloudfront aws-lambda aws-lambda-edge

3
推荐指数
2
解决办法
1233
查看次数

使用 Lambda@Edge 的单页应用程序

所以我有一个由 AWS Cloudfront 从 AWS S3 提供的 SPA。我已经配置了以下错误页面行为:

404: Not Found->/index.html带有 HTTP 代码200

这是在客户端处理路由所必需的。

现在我有一个 Lambda@Edge 函数,它由viewer-responseCloudfront 中的事件触发并设置一些自定义标头,如 HSTS 和 X-Frame。该函数正在被调用并按预期在除实际/index.html. 我倾向于认为这是因为它由 Cloudfront 中的上述错误页面行为处理,因为对 html 的实际 GET 请求由 Cloudfront 中的错误页面配置处理。

解决这个问题的实用方法是什么?

我不确定为什么重定向不会触发 lambda 函数。有什么方法可以实现与 lambda@edge 中的错误页面配置相同的逻辑吗?

amazon-cloudfront aws-lambda aws-lambda-edge

2
推荐指数
1
解决办法
1888
查看次数

Lambda @ edge没有被Cloudfront触发

我正在使用lambda @ edge使用Cloudfront重定向我的网站。

我已将版本化的lambda arn附加到其所有4个事件的云前端缓存行为中。

当我到达我的cloudfront端点时,它说

502 ERROR
The request could not be satisfied.
The Lambda function returned invalid json: The json output must be an object type. 
Run Code Online (Sandbox Code Playgroud)

当我查看我的lambda日志/调用指标时,我什么都没有看到。

这可能是什么原因?

我尽力找到解决办法,以防止未触发我的lambda?

amazon-cloudfront aws-lambda-edge

2
推荐指数
2
解决办法
1619
查看次数

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

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

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

下面是我的 Lambda 函数。该custom_header是CloudWatch的日志我的LAMBDA可见,但在我的自定义服务器请求头不显示:(。

exports.handler = (event, context, callback) => {
  const request = event.Records[0].cf.request;
  const headers = request.headers;

  headers['custom_header'] = [{ key: 'custom_header', value: 'custom_header' }];

  return callback(null, request);
}
Run Code Online (Sandbox Code Playgroud)

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

amazon-web-services amazon-cloudfront aws-lambda aws-lambda-edge

2
推荐指数
1
解决办法
3291
查看次数

在 AWS Lambda@edge 中获取引用

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

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

referrer amazon-web-services aws-lambda-edge

2
推荐指数
1
解决办法
1342
查看次数

当 AWS Lambda 超时时会发生什么?

据我了解,当 Lambda 超时时,它会返回错误。

不过,一旦 Lambda 超时,我想知道它是否会立即被 AWS 终止,或者它是否可以在后台继续运行任意时间(可以这么说,与原始请求分离)。

我问这个问题是因为在我的情况下,当 Lambda 超时时,该 Lambda 内的所有处理也会立即停止,这一点很重要。如果 AWS 不能保证这一点,那么我将需要实施自己的措施来确保这一点,即定期检查时钟并在超时后手动停止执行。


(ps,如果 Lambda 在超时时立即被杀死,我想知道 AWS 如何实现将 Lambda 保持在温暖的初始化状态以供后续调用。即,它不能简单地在超时时杀死进程,否则 Lambda 将被下次冷了……)

amazon-web-services aws-lambda aws-lambda-edge

2
推荐指数
1
解决办法
4381
查看次数

AWS Lambda @ edge。如何从S3读取HTML文件并将内容放入响应正文

具体来说,在原始响应触发功能(例如,状态为404)中,如何读取S3中存储的HTML文件并将其内容用作响应正文?

(我想像CloudFront一样手动返回自定义错误页面,但要基于cookie选择它)。

注意:S3中的HTML文件存储在我的网站的同一存储桶中。已启用OAI。

非常感谢你!

amazon-s3 custom-error-pages amazon-web-services aws-lambda aws-lambda-edge

1
推荐指数
1
解决办法
1479
查看次数

针对查看器请求和查看器响应的单个 Lambda@Edge 函数调用

我目前有两个 Lambda@Edge 函数:

  • language-redirect:根据查看器请求调用,返回 302 或将请求传递到 CloudFront
  • HSTS:在查看器响应时调用,添加响应标头

目前的流量为:

viewer request -> language-redirect

if 302 -> viewer response
if not 302 -> pass on to CloudFront -> HSTS -> viewer response
Run Code Online (Sandbox Code Playgroud)

是否可以将这两个功能组合到一个函数(组合)中,每个查看器请求仅调用一次?

viewer request -> combined

if 302 -> viewer response
if not 302 -> pass on to CloudFront -> combined -> viewer response
Run Code Online (Sandbox Code Playgroud)

目标是同一函数被调用一次,而不是同一函数被调用两次。

amazon-web-services amazon-cloudfront aws-lambda-edge

1
推荐指数
1
解决办法
1636
查看次数

Lambda@edge 不是由原始请求事件触发的

我正在尝试使用 CloudFormation 配置 Lambda@edge 函数。部署模板后,一切都可以在控制台中找到,但是监听origin-request事件的 lambda 函数没有被触发。奇怪的是,一个viewer-request事件确实设法触发了一个功能。

我究竟做错了什么?我怎样才能让origin-request活动发挥作用?

这是我的模板:

AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: Deployment of Lambda@edge functions

Parameters:
  Stage:
    Type: String
    AllowedValues:
      - staging
      - production
    Default: staging
    Description: Stage that can be added to resource names
  CodeBucket:
    Type: String
    Description: The S3 Bucket name for latest code upload
  CodeKey:
    Type: String
    Description: The S3 Key for latest code upload

# Mappings:
#   AliasMap:
#     staging:
#       Alias: "staging-app.achrafsouk.com"
#     production:
#       Alias: …
Run Code Online (Sandbox Code Playgroud)

amazon-cloudfront aws-lambda-edge

1
推荐指数
1
解决办法
941
查看次数