

# 教程：创建私有 REST API
<a name="private-api-tutorial"></a>

在本教程中，您将创建一个私有 REST API。客户端只能从您的 Amazon VPC 内访问 API。API 与公共互联网隔离，这是一项常见的安全要求。

完成本教程需要大约 30 分钟。首先，您要使用 CloudFormation 模板创建 Amazon VPC、VPC 端点、AWS Lambda 函数，然后启动用于测试 API 的 Amazon EC2 实例。接下来，您可以使用AWS 管理控制台创建私有 API 并附加仅允许从 VPC 端点访问的资源策略。最后，测试您的 API。

![\[您在本教程中创建的私有 API 的概述。\]](http://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/images/private-api-tutorial-diagram.png)


要完成本教程，您需要一个AWS账户以及一位具有控制台访问权限的 AWS Identity and Access Management 用户。有关更多信息，请参阅 [设置为使用 API Gateway](setting-up.md)。

在本教程中，您将使用 AWS 管理控制台。如需创建此 API 和所有相关资源的 ‭CloudFormation 模板，请参阅 ‭[‬template.yaml‭](samples/private-api-full-template.zip)。

**Topics**
+ [步骤 1：创建依赖关系](#private-api-tutorial-create-dependencies)
+ [步骤 2：创建私有密钥](#private-api-tutorial-create-api)
+ [步骤 3：创建方法和集成](#private-api-tutorial-create-method)
+ [步骤 4：附加资源策略](#private-api-tutorial-attach-resource-policy)
+ [步骤 5：部署您的 API](#private-api-tutorial-deploy-api)
+ [步骤 6：验证您的 API 是否不可公开访问](#private-api-tutorial-test-private-api)
+ [步骤 7：连接到 VPC 中的实例并调用 API](#private-api-tutorial-connect-to-instance)
+ [步骤 8：清除](#private-api-tutorial-cleanup)
+ [接下来的步骤：通过 实现自动化CloudFormation](#private-api-tutorial-next-steps)

## 步骤 1：创建依赖关系
<a name="private-api-tutorial-create-dependencies"></a>

下载并解压缩[此 CloudFormation 模板](samples/private-api-starter-template.zip)。您可以使用模板为私有 API 创建所有依赖项，包括 Amazon VPC、VPC 端点和作为 API 后端的 Lambda 函数。您稍后创建私有 API。

**创建 CloudFormation 堆栈**

1. 打开 CloudFormation 控制台，地址：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 选择**创建堆栈**，然后选择**使用新资源(标准)**。

1. 对于**指定模板**，选择**上传模板文件**。

1. 选择您下载的模板。

1. 选择**下一步**。

1. 对于**堆栈名称**，输入 **private-api-tutorial**，然后选择**下一步**。

1. 对于**配置堆栈选项**，请选择**下一步**。

1. 对于**功能**，请确认 CloudFormation 可以在您的账户中创建 IAM 资源。

1. 选择**下一步**，然后选择**提交**。

CloudFormation 为 API 配置依赖项，这可能需要几分钟的时间。当 CloudFormation 堆栈的状态为 **CREATE\$1COMPLETE** 时，请选择**输出**。记下您的 VPC 端点 ID。在本教程的后续步骤中，您需要使用该信息。

## 步骤 2：创建私有密钥
<a name="private-api-tutorial-create-api"></a>

您可以创建一个私有 API，以便只允许 VPC 中的客户端可以访问。

**要创建私有 API**

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

1. 选择**创建 API**，然后为 **REST API** 选择**构建**。

1. 对于 **API Name (API 名称)**，请输入 **private-api-tutorial**。

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

1. 对于 **VPC 端点 ID**，请输入 CloudFormation 堆栈的**输出**中的 VPC 端点 ID。

1. 对于 **IP 地址类型**，选择**双堆栈**。

1. 选择**创建 API**。

## 步骤 3：创建方法和集成
<a name="private-api-tutorial-create-method"></a>

您可以创建 `GET` 方法和 Lambda 集成来处理对 API 的 `GET` 请求。当客户端调用 API 时，API Gateway 会将请求发送到您在步骤 1 中创建的 Lambda 函数，然后向客户端返回响应。

**要创建方法和集成**

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

1. 选择 API。

1. 选择**创建方法**。

1. 对于**方法类型**，选择 `GET`。

1. 对于**集成类型**，选择 **Lambda 函数**。

1. 打开 **Lambda 代理集成**。通过 Lambda 代理集成，API Gateway 将具有定义结构的事件发送到 Lambda，并将响应从您的 Lambda 函数转换为 HTTP 响应。

1. 对于 **Lambda 函数**，请选择您在步骤 1 中使用 CloudFormation 模板创建的函数。函数的名称以 **private-api-tutorial** 为开头。

1. 选择**创建方法**。

## 步骤 4：附加资源策略
<a name="private-api-tutorial-attach-resource-policy"></a>

您将[资源策略](apigateway-resource-policies.md)附加到 API，该策略允许客户端仅通过 VPC 端点调用您的 API。要进一步限制对 API 的访问，您还可以为 VPC 端点配置 [VPC 端点策略](apigateway-vpc-endpoint-policies.md)，但这对于本教程并不是必需的。

**要附加资源策略**

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

1. 选择 API。

1. 选择**资源策略**，然后选择**创建策略**。

1. 输入以下策略。使用来自您 ‭CloudFormation 堆栈的 ‭**输出**‭ 中的 VPC 端点 ID 替换 *vpceID*‬。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Principal": "*",
               "Action": "execute-api:Invoke",
               "Resource": "execute-api:/*",
               "Condition": {
                   "StringNotEquals": {
                       "aws:sourceVpce": "vpce-abcd1234"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Principal": "*",
               "Action": "execute-api:Invoke",
               "Resource": "execute-api:/*"
           }
       ]
   }
   ```

------

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

## 步骤 5：部署您的 API
<a name="private-api-tutorial-deploy-api"></a>

接下来，您部署 API 以使其可供 Amazon VPC 中的客户端使用。

**要部署 API**

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

1. 选择 API。

1. 选择**部署 API**。

1. 对于**阶段**，选择**新建阶段**。

1. 对于**阶段名称**，输入 **test**。

1. （可选）对于**描述**，输入描述。

1. 选择 **Deploy (部署)**。

现在您已经准备好测试 API 了。

## 步骤 6：验证您的 API 是否不可公开访问
<a name="private-api-tutorial-test-private-api"></a>

用 `curl` 于验证您是否无法从 Amazon VPC 之外调用 API。

**要测试您的 API**

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

1. 选择 API。

1. 在主导航窗格中，选择**阶段**，然后选择**测试**阶段。

1. 在**阶段详细信息**下，选择复制图标以复制您 API 的调用 URL。URL 类似于 `https://abcdef123.execute-api.us-west-2.amazonaws.com/test`。您在步骤 1 中创建的 VPC 端点启用了私有 DNS，因此您可以使用提供的 URL 调用 API。

1. 使用 curl 尝试从 VPC 外部调用 API。

   ```
   curl https://abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

   Curl 表示您的 API 的端点无法解析。如果您收到其他响应，请返回步骤 2，并确保为 API 的端点类型选择**私有**。

   ```
   curl: (6) Could not resolve host: abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

接下来，您连接到 VPC 中的 Amazon EC2 实例以调用 API。

## 步骤 7：连接到 VPC 中的实例并调用 API
<a name="private-api-tutorial-connect-to-instance"></a>

接下来，您可以从 Amazon VPC 内测试 API。要访问您的私有 API，您需要连接到 VPC 中的 Amazon EC2 实例，然后使用 curl 调用 API。您可以使用 Systems Manager 会话管理器在浏览器中连接到实例。

**要测试您的 API**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 选择**实例**。

1. 选择您在步骤 1 中使用 CloudFormation 模板创建的名为 **private-api-tutorial** 的实例。

1. 选择**连接**，然后选择**会话管理器**。

1. 选择**连接**可启动与实例的基于浏览器的会话。

1. 在会话管理器会话中，使用 curl 调用 API。您可以调用 API，因为您在 Amazon VPC 中使用的是实例。

   ```
   curl https://abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

   验证您得到了回复 `Hello from Lambda!`。

![\[您可以使用会话管理器从 Amazon VPC 中调用 API。\]](http://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/images/private-api-tutorial-invoke.png)


您成功创建了只能从 Amazon VPC 内访问的 API，然后验证其是否有效。

## 步骤 8：清除
<a name="private-api-tutorial-cleanup"></a>

为避免不必要的成本，请删除作为本教程的一部分而创建的资源。以下步骤将删除您的 REST API 和 CloudFormation 堆栈。

**要删除 REST API**

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

1. 在 **API** 页面上，选择一个 API。选择 **API 操作**，选择**删除 API**，然后确认您的选择。

**删除 CloudFormation 堆栈**

1. 打开 CloudFormation 控制台，地址：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 选择您的 CloudFormation 堆栈。

1. 选择**删除**，然后确认您的选择。

## 接下来的步骤：通过 实现自动化CloudFormation
<a name="private-api-tutorial-next-steps"></a>

您可以自动创建和清理本教程中涉及的所有AWS资源。如需完整的示例 CloudFormation 模板，请参阅 [template.yaml](samples/private-api-full-template.zip)。