教程:构建私有 REST API - Amazon API Gateway
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

教程:构建私有 REST API

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

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

要完成本教程,您需要一个Amazon账户以及一位具有控制台访问权限的 Amazon Identity and Access Management 用户。有关更多信息,请参阅 开始使用 API Gateway 的先决条件

在本教程中,您将使用 Amazon Web Services Management Console。如需创建此 API 和所有相关资源的 ‭Amazon CloudFormation 模板,请参阅 ‭‬template.yaml‭

步骤 1:创建依赖关系

下载并解压缩此 Amazon CloudFormation 模板。您可以使用模板为私有 API 创建所有依赖项,包括 Amazon VPC、VPC 终端节点和作为 API 后端的 Lambda 函数。您稍后创建私有 API。

创建 Amazon CloudFormation 堆栈

  1. 打开 Amazon CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation

  2. 选择 Create stack (创建堆栈),然后选择 With new resources (standard) (使用新资源(标准))

  3. 对于 Specify template (指定模板),选择 Upload a template file (上传模板文件)

  4. 选择您下载的模板。

  5. 选择 Next (下一步)

  6. 对于 Stack name (堆栈名称),输入 private-api-tutorial,然后选择 Next (下一步)

  7. 对于配置堆栈选项,请选择下一步

  8. 对于 Capabilities (功能),请确认 Amazon CloudFormation 可以在您的账户中创建 IAM 资源。

  9. 选择创建堆栈

Amazon CloudFormation 为 API 配置依赖项,这可能需要几分钟的时间。当 Amazon CloudFormation 堆栈的状态为 CREATE_COMPLETE 时,请选择 Outputs (输出)。记下您的 VPC 终端节点 ID。在本教程的后续步骤中,您需要使用该信息。

步骤 2:创建私有密钥

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

要创建私有 API

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

  2. 选择 Create API(创建 API),然后为 REST API 选择 Build(构建)。

  3. 对于 API Name (API 名称),请输入 private-api-tutorial

  4. 对于终端节点类型,请选择私有

  5. 对于 VPC Endpoint IDs (VPC 终端节点 ID),请在 Amazon CloudFormation 堆栈的 Outputs (输出) 中输入 VPC 终端节点 ID。

  6. 选择创建

步骤 3:创建方法和集成

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

要创建方法和集成

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

  2. 选择 API。

  3. 选择操作,然后选择创建方法

  4. 选择 GET,然后选择复选标记以确认您的选择。

  5. 对于 Integration type(集成类型),选择 Lambda Function(Lambda 函数)。

  6. 选择使用 Lambda 代理集成。通过 Lambda 代理集成,API Gateway 将具有定义结构的事件发送到 Lambda,并将响应从您的 Lambda 函数转换为 HTTP 响应。

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

  8. 选择保存,然后选择确定以确认您已授予 API Gateway 调用 Lambda 函数的权限。

步骤 4:附加资源策略

您将资源策略附加到 API,该策略允许客户端仅通过 VPC 终端节点调用您的 API。要进一步限制对 API 的访问,您还可以为 VPC 终端节点配置 VPC 终端节点策略,但这对于本教程并不是必需的。

要附加资源策略

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

  2. 选择 API。

  3. 选择资源策略

  4. 输入以下策略。使用来自您 ‭Amazon CloudFormation 堆栈的 ‭ Outputs (输出)‭‬ 中的 VPC 终端节点 ID 替换 vpceID

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "execute-api:/*", "Condition": { "StringNotEquals": { "aws:sourceVpce": "vpceID" } } }, { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "execute-api:/*" } ] }
  5. 选择 Save

步骤 5:部署您的 API

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

要部署 API

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

  2. 选择 API。

  3. 选择操作,然后选择部署 API

  4. 对于部署阶段,选择新阶段

  5. 对于阶段名称,输入测试

  6. 选择 Deploy (部署)

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

步骤 6:验证您的 API 是否不可公开访问

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

要测试您的 API

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

  2. 选择 API。

  3. 选择阶段,然后选择测试阶段。

  4. 复制 API 的 URL。URL 类似于 https://abcdef123.execute-api.us-west-2.amazonaws.com/test。您在步骤 1 中创建的 VPC 终端节点启用了私有 DNS,因此您可以使用提供的 URL 调用 API。

  5. 使用 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

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

要测试您的 API

  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 选择 Instances

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

  4. 选择连接,然后选择会话管理器

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

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

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

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

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

步骤 8:清除

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

要删除 REST API

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

  2. API 页面上,选择一个 API。选择操作,选择删除,然后确认您的选择。

删除 Amazon CloudFormation 堆栈

  1. 打开 Amazon CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation

  2. 选择您的 Amazon CloudFormation 堆栈。

  3. 选择删除,然后确认您的选择。

接下来的步骤:通过 实现自动化Amazon CloudFormation

您可以自动创建和清理本教程中涉及的所有Amazon资源。如需完整的示例 Amazon CloudFormation 模板,请参阅 template.yaml