在 AWS API Gateway 中,我可以在不附加 API 密钥的情况下使用使用计划吗?

Posted

技术标签:

【中文标题】在 AWS API Gateway 中,我可以在不附加 API 密钥的情况下使用使用计划吗?【英文标题】:In AWS API Gateway, can I use a Usage Plan without attaching an API Key? 【发布时间】:2020-02-13 18:19:19 【问题描述】:

有关 API Gateway 使用计划的 AWS 文档都暗示它们是使用 API 密钥创建/附加到 API 密钥的,但没有说明没有 API 密钥将如何运行。我有一个未经授权的 API,我想对其应用限制。我可以创建使用计划,将其附加到资源,而不将 API 密钥关联到它吗?它会起作用吗?

上下文:我正在尝试使用 CloudFormation 的 Java SDK 来定义堆栈,但我无法弄清楚如何以编程方式指定特定于资源的限制。我也会接受一个答案,告诉我如何在不使用控制台的情况下执行此操作。

【问题讨论】:

我也想知道这个,我被这个弄糊涂了。我有一个应用程序,我想为所有用户应用油门设置(burstlimit、ratelimit)。为什么我需要一个 api 密钥? 【参考方案1】:

我可以创建一个使用计划,将其附加到资源,而无需 将 API 密钥与它相关联?它会起作用吗?

不,但根据您的用例,我认为您需要服务器端限制而不是每个客户端限制。 The docs概述区别:

Amazon API Gateway 提供两种与节流相关的基本类型 设置:

服务器端节流限制适用于所有客户端。这些限制设置的存在是为了防止您的 API(以及您的帐户)被 被太多的请求淹没了。

每客户端限制适用于使用与您的使用策略关联的 API 密钥作为客户端标识符的客户端。

在 AWS 控制台中设置服务器端方法限制

您可以为每个阶段的所有方法设置默认速率和突发限制。在 AWS 控制台中,这可以通过转到 Stages > your_stage > Settings > Default Method Throttling 来完成。

在 Cloudformation 模板中设置服务器端方法限制

我不知道如何指定特定于资源的限制 以编程方式。

请参阅下面的 Cloudformation 模板 sn-p 以使用方法设置创建阶段,来自 here:

Resources:
  Prod:
    Type: AWS::ApiGateway::Stage
    Properties:
      StageName: Prod
      Description: Prod Stage
      RestApiId: !Ref MyRestApi
      DeploymentId: !Ref TestDeployment
      DocumentationVersion: !Ref MyDocumentationVersion
      ClientCertificateId: !Ref ClientCertificate
      Variables:
        Stack: Prod
      MethodSettings:
        - ResourcePath: /
          HttpMethod: GET
          MetricsEnabled: 'true'
          DataTraceEnabled: 'false'
        - ResourcePath: /stack
          HttpMethod: POST
          MetricsEnabled: 'true'
          DataTraceEnabled: 'false'
          ThrottlingBurstLimit: '999'
        - ResourcePath: /stack
          HttpMethod: GET
          MetricsEnabled: 'true'
          DataTraceEnabled: 'false'
          ThrottlingBurstLimit: '555'

【讨论】:

【参考方案2】:

很遗憾,如果没有 api 密钥,使用计划将无法运行。来自官方documentation。

使用计划指定谁可以访问一个或多个已部署的 API 阶段和方法,以及他们可以访问它们的数量和速度。该计划使用 API 密钥来识别 API 客户端并计量对每个密钥的相关 API 阶段的访问。它还允许您配置对单个客户端 API 密钥强制执行的节流限制和配额限制。

【讨论】:

【参考方案3】:

你可以像这样配置你的ThrottleSettings in AWS::ApiGateway::UsagePlan

Resources:
  UsagePlan:
    Type: AWS::ApiGateway::UsagePlan
    Properties:
      ThrottleSettings:
        BurstLimit:
        RateLimit:

来自 API Gateway 在Throttling API Requests for Better Throughput 上的文档:

Amazon API Gateway 提供两种与节流相关的基本类型 设置:

服务器端限制适用于所有客户端。这些限制设置的存在是为了防止您的 API 和您的帐户 被太多的请求淹没了。

每客户端限制适用于使用与您的使用策略关联的 API 密钥作为客户端标识符的客户端。

【讨论】:

这不是我要问的。使用计划文档没有说明如果您不附加任何 API 密钥,它将如何表现。它会阻止所有访问吗?它是否对所有呼叫者强制执行?它什么都不做吗?或者,也可以通过 CloudFormation 以编程方式设置方法级限制,而不使用使用计划。

以上是关于在 AWS API Gateway 中,我可以在不附加 API 密钥的情况下使用使用计划吗?的主要内容,如果未能解决你的问题,请参考以下文章

AWS API Gateway 集成请求正文映射模板

从AWS API-Gateway中找出lambda名称

在 API Gateway 中使用 AWS Lambda 授权方

AWS Api Gateway 是不是支持 OData?

AWS API Gateway + AWS Lambda 中的 CORS

在 AWS API Gateway iOS SDK 中传递查询字符串参数