标签: aws-lambda-edge

用 lambda@edge 重写 cloudfront 源主机,如何?

我看到人们在谈论如何根据各种信息重写 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,因为很明显它不是我的内容)。

最终,我试图规范化请求而不进行重定向,而是在命中命中源之前重写请求。

url-rewriting amazon-cloudfront aws-lambda-edge

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

AWS Lambda@edge 将 cookie 设置为原始响应

我的目标是保护 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

5
推荐指数
0
解决办法
2530
查看次数

从 Lambda@Edge 触发另一个 Lambda 函数

我想从 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

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

Lambda@Edge 中的 DynamoDB 访问

需要您的帮助来理解一些概念。我有一个在 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

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

难道我们不应该从 API 网关 + Lambda 堆栈迁移到 Lambda@Edge 以提供 API 服务吗?

如果我的理解正确的话,从堆栈中提供 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

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

从 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

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

如何使用 Lambda@Edge 在 Amplify 上部署 NextJs SSR 应用程序(503 错误)

我目前能够在 Amplify 上构建和部署 Next.js 应用程序,它会自动检测根目录中的 .yml 文件并自动创建资源(默认 Edge Lambda、Cloudfront Distribution、S3 存储桶)以促进托管和部署。然后,我使用现有的 CloudFront 触发器将该函数部署到 LambdaEdge,确保在此分配关联的服务角色上打开所有管理员权限。让我知道我在这里缺少什么。

错误: 与 CloudFront 分配关联的 Lambda 函数无效或不具有所需的权限。更新:这是一个一般错误,查看 Cloud watch 日志,您将看到初始化 firebase 凭据的尝试失败,并且错误就在那里。Lambda@Edge 函数不支持环境变量。

CloudFront 错误 503在此输入图像描述在此输入图像描述在此输入图像描述在此输入图像描述

amazon-cloudfront next.js aws-amplify aws-lambda-edge

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

SNS 到 SQS 与直接 SQS 放入 Lambda@Edge 应用程序

我正在研究使用 Lambda@Edge 将从外部源生成的事件放入内部 SQS 队列中。lambda 只需要在必要时对其进行转换,进行交接,然后离开。我希望速度尽可能快,所以我的问题是,除了 SQS 之外,使用 SNS 是否有好处,或者我应该只使用 SQS?

换句话说,考虑到这两种配置,其中一种对最终用户来说性能会更好吗?

A) 请求进入 Lambda@Edge,Lambda 转换请求并将事件发送到 SNS,SNS 将事件发送到 SQS。

B) 请求进入 Lambds@Edge,lambda 转换请求并将事件直接放入 SQS。

编辑:

我说的是跨区域。

amazon-sqs amazon-sns aws-lambda aws-lambda-edge

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

在 Lambda@Edge 源请求函数中替换正文时出现验证错误

我在提供 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)

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

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

ERROR 验证错误:Lambda 函数结果验证失败,该函数尝试删除只读标头, headerName : Content-Length

每当我尝试添加响应标头时,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)

有人可以让我知道我在这里做错了什么吗?顺便说一句,我正在使用观众响应事件

amazon-cloudfront aws-lambda-edge

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