我看到人们在谈论如何根据各种信息重写 URI。但我想规范化请求的域名。这是我尝试过的:
exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
if (request.method.toUpperCase() != 'GET') {
callback(null, request);
return;
}
request.origin = {
custom: {
domainName: 'slashdot.org',
port: 443,
protocol: 'https',
path: request.uri
}
};
request.headers.host = {
"key": "Host",
"value": request.origin.custom.domainName
};
console.log("returning req:", request);
callback(null, request);
}
Run Code Online (Sandbox Code Playgroud)
我希望这会拉起请求,然后 Cloudfront 会针对我的规范化域发出请求。(对于示例和测试,我使用的是 slashdot,因为很明显它不是我的内容)。
最终,我试图规范化请求而不进行重定向,而是在命中命中源之前重写请求。
我的目标是保护 aws s3 存储桶链接,我试图通过使用 cloudfront 作为可访问 s3 存储桶的链接来解决这个问题,因此,当用户尝试访问 cloudfront 链接时,如果有的话,就会有一个基本的身份验证他们的浏览器中没有 cookie,但如果有 cookie,则会检查该 cookie 中的身份验证值并授予用户访问权限。PS:这不是一个网站,我的任务是保护 s3 存储桶链接。
这是我的尝试,使用 lambda@edge,根据查看者的请求,如果用户未登录,则有身份验证页面,否则,他们被允许访问,它可以工作,但我无法设置 cookie,因为在 aws 文档、cloudfront 中的某处删除标头文件中的 set-cookie:CloudFront 从转发到您的源的请求中删除 Cookie 标头,并从返回给您的查看者的响应中删除 Set-Cookie 标头
这是我的代码:
'use strict';
// returns a response error
const responseError = {
status: '401',
statusDescription: 'Unauthorized',
headers: {
'www-authenticate': [{key: 'WWW-Authenticate', value:'Basic'}]
}
};
exports.handler = (event, context, callback) => {
// Get request and request headers
console.log(event.Records[0]);
const request = event.Records[0].cf.request;
const response = event.Records[0].cf.response;
const headers = request.headers;
// …Run Code Online (Sandbox Code Playgroud) cookies amazon-s3 amazon-web-services amazon-cloudfront aws-lambda-edge
我想从 Lambda@Edge 卸载一些功能以加快响应时间。这意味着在我的 Lambda@Edge 中触发另一个 Lambda 函数。
Lambda@Edge 将应用程序分布在所有区域,因此当发出请求时,它将在距离请求者最近的区域执行应用程序。
我当前的解决方案是在所有区域创建一个具有相同主题名称的 SNS,让 us-east-1 中的 SQS 监听所有这些 SNS 主题,并使用 Lambda 函数监听 SQS。
然而,在每个地区创建一个SNS 维护起来相当麻烦。
关于如何在 Lambda@Edge 中触发另一个 Lambda 函数,还有其他建议吗?
谢谢!
amazon-sqs amazon-web-services amazon-sns aws-lambda aws-lambda-edge
需要您的帮助来理解一些概念。我有一个在 CloudFront 上使用 Lambda@Edge 的 Web 应用程序。此 lambda 函数访问 DynamoDB - 进行大约 10 个独立查询。这偶尔会产生错误,尽管当我单独测试 lambda 函数时它工作得很好。我无法从 Cloudfront 日志中获得太多意义,并且 Lambda@Edge 没有显示在 CloudWatch 中。
我感觉 DynamoDB 查询是罪魁祸首。(因为这就是我在 Lambda 函数中所做的全部事情)为了确保这一点,我在所有区域复制了数据。但这并没有解决问题。我增加了分配给 lambda 函数的超时和内存。但这没有任何帮助。但是,减少数据库查询的数量似乎有所帮助。
你能帮我理解这一点吗?在 Lambda@Edge 中进行数据库查询是否错误?有没有办法获取 Lambda@Edge 的详细日志?
amazon-web-services amazon-dynamodb aws-lambda aws-lambda-edge
如果我的理解正确的话,从堆栈中提供 APILambda@Edge比从堆栈中提供 API 提供更多的延迟优势API-Gateway + Lambda。
另外,API-Gateway 的成本(3.5 美元/百万次调用)+ Lambda(0.2 美元/百万次调用)== 3.7 美元/百万次调用似乎比Lambda@Edge(0.6 美元/百万次调用)更昂贵。
如果上述两个观察结果都是正确的,那么我们不应该将我们的 API-Gateway + Lambda (对于那些使用此堆栈的人)迁移到 lambda@edge 堆栈吗?
amazon-web-services amazon-cloudfront aws-lambda aws-api-gateway aws-lambda-edge
我正在尝试对 HTTP 301 重定向执行如下操作,以便网络用户将重定向到不同的新闻页面。
if ((request.uri == "/news") || (request.uri == "/news/") && (request.origin.domainName == "sub.mydomain.com")) {
const redirectResponse = {
status: '301',
statusDescription: 'Moved Permanently',
headers: {
'location': [{
key: 'Location',
value: '/local-news/',
}],
'cache-control': [{
key: 'Cache-Control',
value: "max-age=3600"
}],
},
};
callback(null, redirectResponse);
}Run Code Online (Sandbox Code Playgroud)
但是,似乎这个request.origin.domainName == "mydomain.com"部分在我的函数中不起作用。这是选择客户端来自的域名的正确方法吗?
我认为此request.origin.domainName方法将无法作为仅适用于Origin 请求的Origin对象支持。我是否有可能获得查看者请求的客户端的域名?
我需要这个的原因是,我有多个域,用户访问相同的 CloudFront 发行版。因此,当用户来自不同域时,必须将用户重定向到不同的新闻网站。
有人可以支持我吗?
javascript node.js amazon-cloudfront aws-lambda aws-lambda-edge
我目前能够在 Amplify 上构建和部署 Next.js 应用程序,它会自动检测根目录中的 .yml 文件并自动创建资源(默认 Edge Lambda、Cloudfront Distribution、S3 存储桶)以促进托管和部署。然后,我使用现有的 CloudFront 触发器将该函数部署到 LambdaEdge,确保在此分配关联的服务角色上打开所有管理员权限。让我知道我在这里缺少什么。
错误: 与 CloudFront 分配关联的 Lambda 函数无效或不具有所需的权限。更新:这是一个一般错误,查看 Cloud watch 日志,您将看到初始化 firebase 凭据的尝试失败,并且错误就在那里。Lambda@Edge 函数不支持环境变量。
我正在研究使用 Lambda@Edge 将从外部源生成的事件放入内部 SQS 队列中。lambda 只需要在必要时对其进行转换,进行交接,然后离开。我希望速度尽可能快,所以我的问题是,除了 SQS 之外,使用 SNS 是否有好处,或者我应该只使用 SQS?
换句话说,考虑到这两种配置,其中一种对最终用户来说性能会更好吗?
A) 请求进入 Lambda@Edge,Lambda 转换请求并将事件发送到 SNS,SNS 将事件发送到 SQS。
B) 请求进入 Lambds@Edge,lambda 转换请求并将事件直接放入 SQS。
编辑:
我说的是跨区域。
我在提供 HLS 视频的 s3 存储桶前面有 Cloudfront。我正在尝试动态修改清单文件以向其中的段添加身份验证令牌。
我真正想做的是修改我在查看器响应函数中发送回客户端的正文,但由于这是不可能的,我尝试使用源请求函数从 S3 手动获取对象,修改它,并返回一个带有新正文的 Cloudfront 请求。我收到“Lambda 函数结果验证失败:主体不是字符串、不是对象或超出最大大小”的 503 错误
我的身体小于 8kb(1MB 是文档中的限制)。据我所知,我生成的 cloudfront 请求对象看起来不错,并且 base64 数据解码为我想要的。我也尝试过使用文本而不是 base64。我在 Cloudfront 中启用了“包含正文”。
const fs = require('fs');
const querystring = require('querystring');
const AWS = require('aws-sdk');
const S3 = new AWS.S3();
exports.handler = async (event) => {
const cfrequest = event.Records[0].cf.request;
const queryString = querystring.parse(event.Records[0].cf.request.querystring);
const jwtToken = queryString.token;
if (cfrequest.uri.match(/\.m3u8?$/mi)) {
const s3Response = await (new Promise((resolve, reject) => {
S3.getObject({
Bucket: 'bucket',
Key: cfrequest.uri.substring(1)
}, (err, data) => …Run Code Online (Sandbox Code Playgroud) 每当我尝试添加响应标头时,CloudFront 都会向我抛出
ERROR 验证错误:Lambda 函数结果验证失败,该函数尝试删除只读标头 headerName : Content-Length。
ERROR 验证错误:Lambda 函数结果验证失败,该函数尝试删除只读标头 headerName :Content-Encoding。
const response = {
status: '302',
statusDescription: 'Found',
headers: {
'location': [{
key: 'location',
value: 'https://abc.test.io'
}],
'set-cookie': [{
key: 'set-cookie',
value: 'sessiontoken='+sessionObjectData.session.sessionId+'; Secure; HttpOnly'
}]
}
}
callback(null, response)
Run Code Online (Sandbox Code Playgroud)
有人可以让我知道我在这里做错了什么吗?顺便说一句,我正在使用观众响应事件
aws-lambda-edge ×10
aws-lambda ×6
amazon-sns ×2
amazon-sqs ×2
amazon-s3 ×1
aws-amplify ×1
cookies ×1
javascript ×1
next.js ×1
node.js ×1