在这篇文章之后,我尝试从 AWS 内的多个区域(在同一域下)提供我的静态内容。
到目前为止,我有:
此时,一切正常。如果我在浏览器中输入域名,我可以看到静态内容。现在是时候让它成为多区域的了:
Event type: origin-request, Include body: No, Path pattern: *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) 更新:更好地收集我的想法
我正在为查看器请求 Lambda 中的每个用户生成一个唯一标识符 (UUID),然后根据该 UUID 选择要返回的缓存页面。这有效。
理想情况下,此用户将始终具有相同的 UUID。
如果该 UUID不存在于该查看器请求的 cookie 中,我必须在该查看器请求中生成该 UUID。我还需要将该 UUID 设置为 cookie,这当然发生在响应而不是请求中。
在没有缓存的情况下,我的服务器只需处理一个自定义标头并在响应标头中创建一个 Set-Cookie。
如果我想缓存页面,我找不到处理这个问题的方法。我可以忽略缓存的请求标头并提供正确的缓存页面,但是用户不会保留该 UUID,因为在他们的下一个请求中没有设置要使用的 cookie。
有没有人完成过这样的事情?
我正在尝试的事情
我正在处理几个角度,但还没有开始工作:
我不知道 Cloudfront 中的某种设置处理从查看器请求到查看器响应的标头或其他数据传递,这可以在 Cloudfront 中的第二个 lambda 中使用。
在查看器请求中抢先修改响应对象标头。我认为这是不可能的,因为它们返回的标头尚未创建,除非我缺少一些内置的 Cloudfront 方法。
某种现有的传递标头,我不知道这是否是一件事,因为我对请求-响应处理的这方面不是很熟悉,但值得一试。
可能(虽然还没有尝试过)我可以在客户端请求 lambda 中创建整个响应对象,并以某种方式从那里提供缓存页面,修改响应标头,然后将其传递到回调方法中。
托宾的答案实际上有效,但不是一个可靠的解决方案。如果用户没有存储或提供他们的 cookie,它就会变成一个无限循环,而且如果我可以避免它,我宁愿不在我的所有页面前面抛出一个重定向
有点工作的概念
http.get设置 UUID cookie再次调用原始请求 URL (40KB 限制使得在查看器请求 …amazon-web-services amazon-cloudfront aws-lambda aws-lambda-edge
我正在尝试使用AWS Cloudfront上的lambda @ edge对多个网站实施“代理”。
我的设置大致是:
DNS:*。domain.com-> some_uuid.cloudfront.net(Cloudfront发行版)
Cloudfront:some_uuid.cloudfront.net-> S3存储桶来源
s3存储桶:网站/(包含多个网站的文件夹)
lambda @ edge函数:定义为起点请求
我的lambda @ edge函数非常简单:
检查网站资源是否在s3存储桶中。
如果是,请将请求uri更改为资源s3 url。
如果不是,则向后端服务器发送请求以渲染资源,将其存储在s3上并返回。
我在获取网站的原始域时遇到问题。例如,如果我尝试访问“ my_website.domain.com”,则在我的lambda函数中,我没有请求中的该域信息。
我认为我可以实现另一个lambda @ edge函数作为查看器请求,以将域作为标头传递,但是如果可以的话,我宁愿避免这种情况。
还有其他解决方案吗?
谢谢
javascript node.js amazon-cloudfront aws-lambda aws-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 中的错误页面配置相同的逻辑吗?
我正在使用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?
我有一个自定义来源的 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
在记录的事件结构中没有看到引用者,并且我在测试 lambda 的对象中没有看到任何东西 - 但这不一定是实时请求的准确表示。
有没有办法确定 lambda@edge 内请求中的引用者。具体来说,我在 ClientRequest 中工作。
据我了解,当 Lambda 超时时,它会返回错误。
不过,一旦 Lambda 超时,我想知道它是否会立即被 AWS 终止,或者它是否可以在后台继续运行任意时间(可以这么说,与原始请求分离)。
我问这个问题是因为在我的情况下,当 Lambda 超时时,该 Lambda 内的所有处理也会立即停止,这一点很重要。如果 AWS 不能保证这一点,那么我将需要实施自己的措施来确保这一点,即定期检查时钟并在超时后手动停止执行。
(ps,如果 Lambda 在超时时立即被杀死,我想知道 AWS 如何实现将 Lambda 保持在温暖的初始化状态以供后续调用。即,它不能简单地在超时时杀死进程,否则 Lambda 将被下次冷了……)
具体来说,在原始响应触发功能(例如,状态为404)中,如何读取S3中存储的HTML文件并将其内容用作响应正文?
(我想像CloudFront一样手动返回自定义错误页面,但要基于cookie选择它)。
注意:S3中的HTML文件存储在我的网站的同一存储桶中。已启用OAI。
非常感谢你!
amazon-s3 custom-error-pages amazon-web-services aws-lambda aws-lambda-edge
我目前有两个 Lambda@Edge 函数:
目前的流量为:
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)
目标是同一函数被调用一次,而不是同一函数被调用两次。
我正在尝试使用 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)