

# API Gateway 中针对 REST API 的 API 端点类型
<a name="api-gateway-api-endpoint-types"></a>

*[API 端点](api-gateway-basic-concept.md#apigateway-definition-api-endpoints)* 类型指的是 API 的主机名。API 端点类型可以是*边缘优化的*、*区域性的*或*私有的*，具体取决于大部分 API 流量源自何处。

## 边缘优化的 API 端点
<a name="api-gateway-api-endpoint-types-edge-optimized"></a>

*[边缘优化的 API 端点](api-gateway-basic-concept.md#apigateway-definition-edge-optimized-api-endpoint)*通常将请求路由至最近的 CloudFront 入网点（PoP），这在您的客户呈地理分布的情况下可能会有所帮助。这是 API Gateway REST API 的默认端点类型。

边缘优化 API 利用 [HTTP 标头](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)的名称（例如，`Cookie`）。

CloudFront 在转发请求到源之前以自然顺序按 Cookie 名称对 HTTP Cookie 进行排序。有关 CloudFront 如何处理 Cookie 的更多信息，请参阅[基于 Cookie 缓存内容](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Cookies.html)。

您用于边缘优化 API 的任何自定义域名都适用于所有区域。

## 区域 API 端点
<a name="api-gateway-api-endpoint-types-regional"></a>

*[区域 API 端点](api-gateway-basic-concept.md#apigateway-definition-regional-api-endpoint)*适用于同一区域中的客户端。当在 EC2 实例上运行的客户端调用同一区域中的 API，或 API 用于为具有高需求的少数客户端提供服务时，区域 API 可以降低连接开销。

对于区域 API，您使用的任何自定义域名都特定于部署了该 API 的区域。如果在多个区域中部署区域 API，则它可以在所有区域中具有相同的自定义域名。您可以将自定义域与 Amazon Route 53 一起使用来执行诸如[基于延迟的路由](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy.html#routing-policy-latency)之类的任务。有关更多信息，请参阅 [在 API Gateway 中设置区域自定义域名](apigateway-regional-api-custom-domain-create.md) 和 [为 API Gateway API 设置边缘优化的自定义域名](how-to-edge-optimized-custom-domain-name.md)。

区域 API 端点按原样传递所有标头名称。

**注意**  
在 API 客户端在地理上分散的案例中，使用区域 API 端点以及您自己的 Amazon CloudFront 分配可能仍然有意义，这可确保 API Gateway 不会将 API 与服务控制的 CloudFront 分配关联。有关此使用案例的更多信息，请参阅[如何使用我自己的 CloudFront 分配设置 API Gateway？](https://repost.aws/knowledge-center/api-gateway-cloudfront-distribution)

## 私有 API 端点
<a name="api-gateway-api-endpoint-types-private"></a>

*[私有 API 端点](api-gateway-basic-concept.md#apigateway-definition-private-api-endpoint)* 是一个只能使用接口 VPC 端点从 Amazon Virtual Private Cloud (VPC) 访问的 API 端点，该接口是您在 VPC 中创建的端点网络接口 (ENI)。有关更多信息，请参阅 [API Gateway 中的私有 REST API](apigateway-private-apis.md)。

私有 API 端点按原样传递所有标头名称。

# 在 API Gateway 中更改公有或私有 API 端点类型
<a name="apigateway-api-migration"></a>

更改 API 端点类型要求您更新 API 的配置。您可以使用 API Gateway 控制台、AWS CLI 或适用于 API Gateway 的AWS开发工具包更改现有 API 类型。端点类型无法再次进行更改，直到当前更改完成，但您的 API 将可用。

支持以下端点类型更改：
+ 从边缘优化到区域或私有
+ 从区域到边缘优化或私有
+ 从私有到区域

您不能将私有 API 更改为边缘优化的 API。

如果您正在将公有 API 从边缘优化更改为区域（或反之），请注意边缘优化 API 可能与区域 API 具有不同的行为。例如，边缘优化的 API 删除 `Content-MD5` 标头。传递到后端的任意 MD5 哈希值可以表示在请求字符串参数或正文属性中。但是，区域 API 会传递此标头映射，虽然它可能会将标头名称重新映射到某个其它名称。了解区别有助于您决定如何将边缘优化的 API 更新为区域 API，或者从区域 API 更新为边缘优化的 API。

**Topics**
+ [使用 API Gateway 控制台更改 API 端点类型](#migrate-api-using-console)
+ [使用 AWS CLI 更改 API 端点类型](#migrate-api-using-aws-cli)

## 使用 API Gateway 控制台更改 API 端点类型
<a name="migrate-api-using-console"></a>

要更改 API 的 API 端点类型，请执行以下步骤：

**将一个公有端点从区域转换为边缘优化（以及反之）**

1. 通过以下网址登录到 Amazon API Gateway 控制台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 选择一个 REST API。

1. 选择 **API 设置**。

1. 在 **API 详细信息**部分中，选择**编辑**。

1. 对于 **API 端点类型**，选择**边缘优化**或**区域**。

1. 选择**保存更改**。

1. 重新部署您的 API，以使更改生效。

**将私有端点转换为区域端点**

1. 通过以下网址登录到 Amazon API Gateway 控制台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 选择一个 REST API。

1. 编辑 API 的资源策略以删除对 VPC 或 VPC 端点的任何提及，以便 API 从您的 VPC 之外以及在您的 VPC 之内进行的调用成功。

1. 选择 **API 设置**。

1. 在 **API 详细信息**部分中，选择**编辑**。

1. 对于 **API 端点类型**，选择**区域**。

1. 选择**保存更改**。

1. 从 API 中删除资源策略。

1. 重新部署您的 API，以使更改生效。

   由于您要将端点类型从私有迁移到区域，因此 API Gateway 会将 IP 地址类型更改为 IPv4。有关更多信息，请参阅 [API Gateway 中 REST API 的 IP 地址类型](api-gateway-ip-address-type.md)。

**将区域端点转换为私有端点**

1. 通过以下网址登录到 Amazon API Gateway 控制台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 选择一个 REST API。

1. 创建资源策略来授予对您的 VPC 或 VPC 端点的访问权限。有关更多信息，请参阅 [步骤 3：为私有 API 设置资源策略](apigateway-private-api-create.md#apigateway-private-api-set-up-resource-policy)。

1. 选择 **API 设置**。

1. 在 **API 详细信息**部分中，选择**编辑**。

1. 对于 **API 端点类型**，选择**私有**。

1. （可选）对于 **VPC 端点 ID**，选择您要与私有 API 关联的 VPC 端点 ID。

1. 选择**保存更改**。

1. 重新部署您的 API，以使更改生效。

   由于您要将端点类型从区域迁移到私有，因此 API Gateway 会将 IP 地址类型更改为双堆栈。有关更多信息，请参阅 [API Gateway 中 REST API 的 IP 地址类型](api-gateway-ip-address-type.md)。

## 使用 AWS CLI 更改 API 端点类型
<a name="migrate-api-using-aws-cli"></a>

使用以下 [update-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) 命令将边缘优化的 API 更新为区域 API：

```
aws apigateway update-rest-api \
    --rest-api-id a1b2c3 \
    --patch-operations op=replace,path=/endpointConfiguration/types/EDGE,value=REGIONAL
```

成功的响应包含 `200 OK` 状态代码以及与以下类似的负载：

```
{
    "createdDate": "2017-10-16T04:09:31Z",
    "description": "Your first API with Amazon API Gateway. This is a sample API that integrates via HTTP with our demo Pet Store endpoints",
    "endpointConfiguration": {
        "types": "REGIONAL"
    },
    "id": "a1b2c3",
    "name": "PetStore imported as edge-optimized"
}
```

使用以下 [update-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) 命令将区域 API 更新为边缘优化的 API：

```
aws apigateway update-rest-api \
    --rest-api-id a1b2c3 \
    --patch-operations op=replace,path=/endpointConfiguration/types/REGIONAL,value=EDGE
```

由于 [put-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-rest-api.html) 用于更新 API 定义，因此它不适用于更新 API 端点类型。