如何使用资源策略允许某些 IP 地址以访问我的 API Gateway REST API?

上次更新日期:2020-12-08

我想允许某些 IP 地址访问我的 Amazon API Gateway REST API,并限制其他地址访问。该如何操作?

简短描述

为您的 REST API 创建资源策略,使用该策略来拒绝任何未被明确允许的 IP 地址的访问。从指定的 IP 地址(被允许的用户)调用 REST API 的用户可以访问 REST API。从任何其他 IP 地址进行调用的用户都无法访问并会收到“HTTP 403 Forbidden”错误。

分辨率

注意:对于以下说明,请使用现有的 API Gateway REST API,或创建示例 REST API 来进行测试。如果您使用示例 API (PetStore) 进行此设置,请跳至创建并附加资源策略

设置 API 方法

  1. 打开 API 网关控制台,然后选择您的 REST API。
  2. Resources(资源)窗格中,依次选择 Actions(操作)Create Method(创建方法)
  3. /资源节点下的下拉列表中,选择 ANY,然后选中复选标记图标。
  4. / - ANY - Setup(设置)窗格中,为 Integration type(集成类型)选择 Mock(模拟),然后选择 Save(保存)

注意:模拟集成会响应任何到达它的请求,这有助于以后进行测试。

创建并附加资源策略

  1. API Gateway 控制台的左侧导航窗格中,选择Resource Policy(资源策略)
  2. 复制此示例资源策略并将其粘贴到 Resource Policy(资源策略)文本框中。

资源策略示例

{
  "Version": "2012-10-17",
  "Statement": [{
      "Effect": "Allow",
      "Principal": "*",
      "Action": "execute-api:Invoke",
      "Resource": "execute-api:/*/*/*"
    },
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "execute-api:Invoke",
      "Resource": "execute-api:/*/*/*",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": ["sourceIpOrCIDRBlock", "sourceIpOrCIDRBlock"]
        }
      }
    }
  ]
}

注意:要阻止某些 IP 地址的访问,并允许其他地址访问,请参阅示例:基于源 IP 地址或范围拒绝 API 流量中的资源策略。

3.    对于 aws:SourceIp,请将 sourceIpOrCIDRBlock 替换为您要允许的特定 IP 地址。您也可以使用 CIDR 表示法指定 IP 地址的范围。例如:

["10.0.0.0/8", "192.168.0.0/16", "172.16.0.1/32"]

注意aws:SourceIp 仅适用于公有 IP 地址范围。要允许访问私有 IP 范围,请使用 aws:VpcSourceIp。此条件对私有 API 有效。有关更多信息,请参阅 aws:VpcSourceIp

4.    选择保存

部署您的 API

  1. API Gateway 控制台Resources(资源)窗格中,依次选择 Actions(操作)Deploy API(部署 API)
  2. 对于 Deployment stage(部署阶段),选择 [New Stage]([新阶段])
  3. 对于阶段名称,输入一个名称。例如,v1 或演示。
  4. 选择Deploy(部署)

注意:如果在此之后更改资源策略,请确保重新部署 API。

测试资源策略

  1. API Gateway 控制台Stages(阶段)窗格中,复制 Invoke URL(调用 URL)
  2. 通过具有允许的 IP 地址的环境和没有允许的 IP 地址的环境,测试是否能收到 HTTP 200 响应。从命令行界面使用 curl,或使用 Postman 应用程序。有关 curl 的更多信息,请参阅 curl project website

注意:如果您还没有使用多个环境进行测试的权限,则可以设置 Amazon Elastic Compute Cloud (Amazon EC2) 实例。请务必在 API 的资源策略中指定要允许访问的所有实例的 IP 地址。然后,重新部署 API。

要使用 curl,请运行以下某项命令,将 https://yourInvokeUrl/ 替换为您的 REST API 的调用 URL

在 Linux/Unix/macOS 环境中:

curl -IX GET https://yourInvokeUrl/

在 Windows PowerShell 中:

curl https://yourInvokeUrl/

允许的环境会收到 HTTP 200 响应。被拒绝的环境会收到 HTTP 403 禁止错误。