6.7 KiB
Raw Permalink Blame History

slug title description keywords category order
cloudfrout 使用 CloudFront 实现 Web 服务在不同区域的访问限制 本文介绍了如何使用 AWS CloudFront 配合 Lambda@Edge 功能,根据客户端的地理位置信息(国家/地区)实现对 Web 服务的访问限制或重定向,从而优化用户体验并提高安全性。 云计算, cdn, CloudFront Amazon Web Services 4

使用 CloudFront 实现 Web 服务在不同区域的访问限制

1. 准备工作

在对接之前,确保以下条件满足:

  • Web 服务器可访问Web 服务器必须能够通过公网访问HTTP/HTTPS。如果 Web 服务器位于私有网络(如 VPC需要配置公网访问如通过 NAT 网关或负载均衡器)。

2. 创建 CloudFront 分发

  1. 进入 AWS 控制台,选择 CloudFront 服务。
  2. 点击 Create Distribution(创建分发)。
  3. 配置源站Origin为您的 Web 服务器地址。
  4. 根据需要选择是否启用 WAFWeb Application Firewall注意 WAF 会产生额外费用。 示例图片 示例图片 示例图片
    示例图片
    示例图片

3. 配置 CloudFront 的源站请求策略

1. 创建策略

  1. 在新建的页面,输入策略名称(如 client-ip-and-country),并填写备注。

2. 配置选项

配置以下选项:

a. Headers

选择 All viewer headers and the following CloudFront headers,表示转发所有客户端请求的 Header并额外追加 CloudFront 的 Header包括

  • CloudFront-Viewer-Address:客户端 IP 地址。
  • CloudFront-Viewer-Country:客户端国家代码。
  • CloudFront-Viewer-Country-Name:客户端国家名称。
  • CloudFront-Viewer-Country-Region:客户端区域代码。
  • CloudFront-Viewer-Country-Region-Name:客户端区域名称。

b. Query strings

选择 All,表示转发所有请求字符串。

c. Cookies

选择 All,表示转发所有请求的 Cookie。

示例图片 示例图片 示例图片

4. 修改现有发布点的策略

1. 进入 CloudFront 分发界面

进入 CloudFront 分发界面,点击 Behaviors行为 标签页。

2. 找到并编辑源站

找到目标源站并选中,点击 Edit编辑

3. 确保配置生效

确保配置的源站请求策略已生效。

示例图片 示例图片

5. 创建 Lambda 函数

1. 进入 AWS Lambda 控制台

进入 AWS Lambda 控制台,点击 Create Function创建函数示例图片

2. 使用蓝图创建

选择 Use a blueprint使用蓝图,并在蓝图列表中选择 getting-started-with-lambda-http

示例图片

3. 创建函数时,取消添加触发器

在创建函数的过程中,选择 Cancel取消 添加触发器。

示例图片 示例图片

4. 输入以下代码

在 Lambda 函数的代码编辑器中,输入以下代码: 示例图片

'use strict';

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    const headers = request.headers;

    let url = 'https://example.com/';

    if (headers['cloudfront-viewer-country']) {
        const countryCode = headers['cloudfront-viewer-country'][0].value;

        if (countryCode === 'US') {
            url = 'https://www.google.com/'; // 替换为美国用户的 Web 服务器地址
        } else if (countryCode === 'KR') {
            url = 'https://www.bilibili.com/'; // 替换为韩国用户的 Web 服务器地址
        } else if (countryCode === 'SG') {
            url = 'https://www.AWS.com/'; // 替换为新加坡用户的 Web 服务器地址
        }
    }

    const response = {
        status: '302',
        statusDescription: 'Found',
        headers: {
            location: [{
                key: 'Location',
                value: url,
            }],
        },
    };

    callback(null, response);
};

选择保存

6. 配置 IAM 角色

1. 进入 IAM 控制台

进入 IAM 控制台,找到 Lambda 函数的执行角色。

2. 添加信任关系策略

信任关系 中,添加以下策略: 示例图片

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

7. 添加触发器

1. 在 Lambda 函数页面,点击 Add Trigger添加触发器

示例图片

2. 选择 CloudFront 作为触发器

示例图片

3. 配置触发器并部署

示例图片

8. 测试与验证

1. 进入 CloudFront 分发界面,获取分配的域名

示例图片

2. 使用不同区域的客户端访问该域名,验证是否根据国家/地区重定向到不同的 Web 服务器

示例图片