引入多功能打包器,允许在 Amazon CloudFront 上触发每个事件的多个函数

在这篇文章中,你将了解处理离散 Edge 函数的组装和执行的 “多功能打包器” 框架。

Amazon CloudFront 是一项内容分发网络 (CDN) 服务,可提高应用程序的性能、可用性和安全性,使您能够为全球观众提供一致的体验。 Lambda @Edge CloudFront 函数 是 CloudFront 的两个 边缘函数 功能,它们可以与 CloudFront 发出的不同 事件触发器 相关联。 这使开发人员能够在更接近查看者的地方编程业务逻辑,并自定义 CloudFront 的响应方式。将业务逻辑迁移到边缘可以减少延迟,并减轻来自源服务器的请求。

随着业务需求随着时间的推移而增长,您可能需要在请求/响应流中执行多项操作。例如,您想要标准化请求属性以提高缓存性能,执行 A/B 测试,重写或重定向 URL,或者智能地切换请求的来源。下图显示了一些常见用例及其最合适的事件触发器。

Figure 1 CloudFront event triggers and common use cases

图 1 CloudFront 事件触发器和常见用例

每个用例本身都是一个不同的操作,您可以将它们作为 CloudFront 函数或 Lambda @Edge 函数来实现。但是,要在同一个事件触发器中应用这些操作,您需要将代码及其依赖关系复制到单个 monolith 函数中,然后将其与事件触发器相关联。对于 Lambda @Edge 函数,除了复制代码工件外,您还需要组合每个函数的 亚马逊云科技 身份和访问管理 (IAM) 角色和策略,然后重新评估内存和超时要求。

此外,这些操作之间在执行顺序方面可能存在依赖关系,因为下游组件可能期望由上游操作设置的某些属性。例如,你想在后续模块检查预定义的重定向列表中是否有匹配项之前对 URL 进行标准化。

以下是多个操作的示例:传入请求 → 标准化 → 检查重定向 → 重写 URI → CloudFront 缓存。

与这些离散用例相关的代码可以很好地组织成某种形式的库,但仍需要进行工程和重构工作才能对它们进行组合、测试和维护。

在这篇文章中,你将使用 “多功能打包器” 框架探索这样一种方法,该框架可以按原样处理离散的 Edge 函数逻辑的组装和执行,并返回所需的输出。

组装后的函数可以与所需的 CloudFront 事件触发器相关联,就像关联任何其他 Lambda @Edge 或 CloudFront 函数一样。这将使您可以混合和匹配现有的功能实现,重复使用代码,同时随着单个功能逻辑随着时间的推移而发展,实现更好的可维护性。

先决条件

这篇文章需要满足以下先决条件:

1。如今,该框架仅支持 Lambda @Edge 函数的 Node.js 运行时和用于 CloudFront 函数的 JavaScript。

2。你必须在 亚马逊云科技 账户中定义 Lambda @Edge 和 CloudFront 函数。

在本文的其余部分中,您将介绍该框架的部署和使用。

部署

1。在 亚马逊云科技 北弗吉尼亚区域(美国东部 1)克隆并部署 CDK 解决方案。来自终端

git clone https://github.com/aws-samples/amazon-cloudfront-multi-function-packager.git
cd amazon-cloudfront-multi-function-package
npm audit fix
cdk bootstrap
cdk deploy

2。该堆栈创建了一个 Amazon Simple Storage Service ( Amazon S3) 存储桶来保存汇编后的代码工件和三个 亚马逊云科技 Lambda 函数,如下所述:

  • {stackName}-LambdaFunctionPackager {uniqueID}:主要的 Lambda 多功能打包器
  • {stackName}-lambdaFunctionAssembly {uniqueID} :组装 Lambda @Edge 函数 的辅助函数
  • {stackName}-CloudfrontFunctionAssembly {uniqueID} :组装 CloudFront
Figure 2 Multi-function packager helper functions

图 2 多功能打包器辅助函数

链接 Lambda @Edge 函数的程序

1。 要组合 Lambda @Edge 函数,请导航到位于美国东部 1 亚马逊云科技 区域的 亚马逊云科技 Lambda 控制台上的 {stackName}-LambdaFunctionAssem bly 函数。

2. 我们将使用 亚马逊云科技 的 “ 测试 ” 功能 Lambda 服务来构建我们的组合函数工件。切换到 “ 测试 ” 选项卡到 “ 创建新事件 ”,然后为其命名。

Figure 3 Procedure to chain Lambda@Edge functions

图 3 链接 Lambda @Edge 函数的程序

对于 “Event JSON”,请使用以下 JSON 结构将 Lambda @Edge 函数与其 ARN 组合在一起。

{
"viewer-request":[
    {
    "function_arn":"Lambda Function ARN1:Version1"
    },
    {
    "function_arn":"Lambda Function ARN2:Version2"
    }
 ]
}

以下是组合 Lambda @Edge 函数并将其附加到多个事件触发器的示例。

{
"origin-request":[
    {
        "function_arn":"arn:aws:lambda:us-east-1:123456789012:function:RedirectionFunction:1"
    },
    {
        "function_arn":"arn:aws:lambda:us-east-1:123456789012:function:ABTestingCookieFunction:1"
    },
    {
        "function_arn":"arn:aws:lambda:us-east-1:123456789012:function:DeviceDetectionFunction:1"
    }
    
 ],
"origin-response":[
    {
        "function_arn":"arn:aws:lambda:us-east-1:123456789012:function:CacheControlFunction:$LATEST"
    },
    {
        "function_arn":"arn:aws:lambda:us-east-1:123456789012:function:HSTSInsertionFunction:2"
    }
 ]
}

请注意,您应该更改 Lambda 函数 ARN 以匹配您的环境。

3。JSON 结构定义了三个 Lambda @Edge 函数 ARN,它们将(按指定顺序)合并为一个新的 Lambda 函数并关联到 “原始请求” 触发器。新的组合函数还将有两个 Lambda @Edge 函数,它们将在 “Origin Response” 事件触发器上调用。当同一个函数必须对多个事件触发器进行操作时,将多个事件触发器组合起来可能很有用。此外,它还有助于减少冷启动和跨事件类型的 Lambda 容器的重复使用。

Lambda 函数 ARN 可能指向特定的 Lambda 版本或 $LATEST,并且每个函数可能有不同的入口点处理程序。该框架将从相关的函数元数据中推断出所有这些信息。

4。 保存 对事件的更改 ,然后 在 Lambda 控制台中选择 测试 以生成组合函数和 IAM 角色。有关详细说明 ,请参阅 GitHub 存储库

您可以为每个事件触发器生成组合封装函数,也可以组合多个触发器。多功能打包器框架与事件触发器无关,仅调用与当前触发的事件类型相关的函数。

5。发布版本并关联到您的 CloudFront 发行版的行为。

6。然后测试它是否有效。

链接 CloudFront 函数的程序

1。 要组合 CloudFront 函数,请导航到位于美国东部 1 亚马逊云科技 区域的 亚马逊云科技 Lambda 控制台 上的 {stackN ame}-CloudfrontFunctionAssemb ly 函数

2。切换到 “测试” 选项卡以创建测试事件。

Figure 4 Procedure to chain CloudFront Functions

图 4 链接 CloudFront 函数的过程

使用以下 JSON 结构定义 “新事件”,使用函数名称及其部署阶段将 CloudFront 函数组合在一起。

{
  "viewer-request": [
    {
      "function_name": "Function Name",
      "stage": "DEVELOPMENT || LIVE"
    },
    {
      "function_name": "CanaryFunction",
      "stage": "DEVELOPMENT || LIVE"
    },
    {
        "function_name":"AddIndexHtml",
        "stage":"DEVELOPMENT || LIVE"
    }
  ]
}

以下是组合 CloudFront 函数并将其附加到单个事件触发器的示例。

{
  "viewer-request": [
    {
      "function_name": "TrueClientIP",
      "stage": "DEVELOPMENT"
    },
    {
      "function_name": "CanaryFunction",
      "stage": "LIVE"
    },
    {
        "function_name":"AddIndexHtml",
        "stage":"DEVELOPMENT"
    }
  ]
}

请注意,您应该更改 function_name 和阶段以匹配您的环境。

保存 对事件的更改

3。在 CloudFront 函数控制台 中选择 “ 测试 ” 以生成新的组合式 CloudFront 函数。

4。在 CloudFront 函数控制台 上查看新创建的组合函数。研究代码结构。

5。测试它是否有效。

尽管此框架经过调整,可将边缘功能与 CloudFront 作为事件源相结合,但可以通过相应地修改事件结构的处理方式将其扩展为支持其他 亚马逊云科技 服务。

结论

总而言之,您学习了如何使用 “多功能打包器” 框架来组合多个 Lambda @Edge CloudFront 函数,使用 CloudFront 在边 缘构建复杂的请求/响应处理。根据您的部署方案,我们希望这篇文章对您有所帮助。

Jaiganesh Girinathan

Jaiganesh Girinathan

Jaiganesh Girinathan 是一名高级边缘专家解决方案架构师,专注于使用 亚马逊云科技 开发内容交付网络和边缘计算能力。在过去的二十年中,他曾与全球多家媒体客户合作,帮助组织实现平台现代化和扩展。他热衷于构建解决方案以满足关键客户需求。工作之余,你通常可以找到 Jaiganesh 在凝视星星!


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。