

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 AWS 上从 F5 迁移到应用程序负载均衡器时修改 HTTP 标头
<a name="modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws"></a>

*Sachin Trivedi，Amazon Web Services*

## Summary
<a name="modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws-summary"></a>

当您将使用 F5 负载均衡器的应用程序迁移到 Amazon Web Services (AWS) 并希望在 AWS 上使用应用程序负载均衡器时，迁移用于标头修改的 F5 规则是一个常见问题。Application Load Balancer 不支持修改标头，但你可以使用亚马逊 CloudFront 作为内容分发网络 (CDN)，使用 Lambda @Edge 来修改标头。

此模式描述了所需的集成，并提供了使用 AWS CloudFront 和 Lambda @Edge 修改标头的示例代码。

## 先决条件和限制
<a name="modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws-prereqs"></a>

**先决条件**
+ 使用 F5 负载均衡器的本地应用程序，其配置使用 `if, else` 替换 HTTP 标头值。有关此配置的详细信息，请参阅 F5 产品文档中的 [HTTP::header](https://clouddocs.f5.com/api/irules/HTTP__header.html)。 

**限制**
+ 此模式适用于 F5 负载均衡器标头自定义。对于其他第三方负载均衡器，请查看负载均衡器文档以获取支持信息。
+ 用于 Lambda@Edge 的 Lambda 函数必须位于美国东部(弗吉尼亚州北部)区域。

## 架构
<a name="modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws-architecture"></a>

下图显示了 AWS 上的架构，包括 CDN 与其他 AWS 组件之间的集成流程。

![\[使用亚马逊 CloudFront 和 Lambda 修改标题的架构 @Edge\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/00abbe3c-2453-4291-9b24-b488dced4868/images/4ee9a19e-6da2-4c5a-a8bc-19d3918a166e.png)


## 工具
<a name="modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws-tools"></a>

**Amazon Web Services**
+ [应用程序负载均衡器](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) - 应用程序负载均衡器是一项 AWS 完全托管的负载均衡服务，在开放系统互连 (OSI) 模型的第七层运行。它可以在多个目标之间平衡流量，并支持基于 HTTP 标头和方法、查询字符串以及基于主机或基于路径的路由的高级路由请求。
+ [亚马逊 CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html) — Amazon CloudFront 是一项网络服务，可加快向用户分发静态和动态网页内容（例如.html、.css、.js 和图像文件）的速度。 CloudFront 通过名为边缘位置的全球数据中心网络提供内容，以降低延迟并提高性能。
+ [Lambda @Edge ─](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html) Lambda @Edge 是 AWS Lambda 的扩展，它允许你运行函数来自定义所交付的内容。 CloudFront 您可以在美国东部（弗吉尼亚北部）区域创作函数，然后将该函数与 CloudFront 发行版相关联，以便在不预配置或管理服务器的情况下自动在全球范围内复制您的代码。如此便可减少延迟并改善用户体验。

**代码**

以下示例代码提供了修改 CloudFront 响应标头的蓝图。按照*操作说明*部分中的说明部署代码。

```
exports.handler = async (event, context) => {
    const response = event.Records[0].cf.response;
    const headers = response.headers;


    const headerNameSrc = 'content-security-policy';
    const headerNameValue = '*.xyz.com';


    if (headers[headerNameSrc.toLowerCase()]) {
        headers[headerNameSrc.toLowerCase()] = [{
            key: headerNameSrc,
            value: headerNameValue,
        }];
        console.log(`Response header "${headerNameSrc}" was set to ` +
                    `"${headers[headerNameSrc.toLowerCase()][0].value}"`);
    }
    else {
            headers[headerNameSrc.toLowerCase()] = [{
            key: headerNameSrc,
            value: headerNameValue,
            }];
    }
    return response;
};
```

## 操作说明
<a name="modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws-epics"></a>

### 创建 CDN 分配
<a name="create-a-cdn-distribution"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 CloudFront Web 分发。 | 在此步骤中，您将创建一个 CloudFront 分发，以告知您要从 CloudFront 哪里交付内容，以及有关如何跟踪和管理内容交付的详细信息。要使用控制台创建分配，请登录 AWS 管理控制台，打开[CloudFront 控制台](https://console.aws.amazon.com/cloudfront/v3/home)，然后按照[CloudFront 文档](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-creating-console.html)中的步骤操作。 | 云管理员 | 

### 创建并部署 Lambda@Edge 函数
<a name="create-and-deploy-the-lambda-edge-function"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建并部署 Lambda@Edge 函数。 | 您可以使用修改 CloudFront 响应标头的蓝图来创建 Lambda @Edge 函数。（其他蓝图可用于不同的用例；有关更多信息，请参阅文档中的 [ CloudFront Lambda @Edge 示例](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-examples.html)函数。） 若要创建 Lambda@Edge 函数：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws.html) | AWS 管理员 | 
| 部署 Lambda@Edge 函数。 | 按照亚马逊 CloudFront 文档中*教程：创建简单的 Lambda @Edge 函数*的[第 4 步](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-edge-how-it-works-tutorial.html#lambda-edge-how-it-works-tutorial-add-trigger)中的说明配置 CloudFront 触发器并部署该函数。 | AWS 管理员 | 

## 相关资源
<a name="modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws-resources"></a>

**CloudFront 文档**
+ [自定义源的请求和响应行为](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html) 
+ [使用分配](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-working-with.html) 
+ [Lambda@Edge 示例函数](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-examples.html) 
+ [使用 Lambda@Edge 在边缘进行自定义](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html)
+ [教程：创建简单的 Lambda@Edge 函数](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-edge-how-it-works-tutorial.html)