如何使用无服务器创建 API 密钥并将其分配给创建的阶段 API?

Posted

技术标签:

【中文标题】如何使用无服务器创建 API 密钥并将其分配给创建的阶段 API?【英文标题】:How to create and assign API Key to a created stage-API using serverless? 【发布时间】:2016-08-21 00:46:48 【问题描述】:

我想使用无服务器创建一个安全的 APIG,在我当前的“s-fction.json”中我已经有了:

"apiKeyRequired": true,

在我的“s-resources-cf.json”中我已经有了:

"AWSApiKey": 
  "Type": "AWS::ApiGateway::ApiKey",
  "Properties" : 
    "Description" : "ApiKey for secure the connections to the xxx API",
    "Enabled" : true
  

它正确地创建了所有,一个 Lambda,一个用于该 lambda(包括 CORS)的 APIG 和 API 密钥,但我需要手动将密钥“分配”到生成的 APIG-Stage,你有什么想法可以我使用无服务器自动执行此操作?

我从这里阅读了有关我想要的功能的 AWS 文档(而且似乎是可能的):AWS CloudFormation API Key

文档显示可以通过以下方式完成:

"ApiKey": 
  "Type": "AWS::ApiGateway::ApiKey",
  "DependsOn": ["TestAPIDeployment", "Test"],
  "Properties": 
    "Name": "TestApiKey",
    "Description": "CloudFormation API Key V1",
    "Enabled": "true",
    "StageKeys": [
      "RestApiId":  "Ref": "RestApi" ,
      "StageName": "Test"
    ]
  

但我不知道如何添加对serverless自动创建的APIG的引用以及如何等待该APIG被创建。

【问题讨论】:

研究后的一些附加信息:Serverless 0.5 在 Lambda 函数和 API 网关 API 之前创建 cloudformation 堆栈。因此,提前知道 RestApiId 似乎非常困难(阅读:不可能)。 api key 需要在 API 存在后创建。 Serverless 不使用 Cloudformation 来部署 API 或 Lambda,因此这些不能用作依赖项或引用。在无服务器部署之后,可以通过提供名称、阶段和 api id 作为参数,使用 Cloudformation 创建 api 密钥。一个适当的解决方案会很好。 这个问题是指无服务器框架的一个过时和停产的版本。在最新版本中,可以轻松创建 API 密钥,请参阅:serverless.com/framework/docs/providers/aws/events/apigateway/… 【参考方案1】:

您可以通过将 apiKeys 数组属性添加到 serverless.yml 中的提供程序对象来指定要由服务 Rest API 使用的 API 密钥列表。您还需要明确指定哪些端点是私有的,并通过将私有布尔属性添加到要设置为私有的 http 事件对象来要求将其中一个 api 密钥包含在请求中。 API 密钥是全局创建的,因此如果您想将服务部署到不同的阶段,请确保您的 API 密钥包含如下定义的阶段变量。使用 API 密钥时,您可以选择使用 usagePlan 对象定义使用计划配额和限制。

这是为您的服务 Rest API 设置 API 密钥的示例配置:

service: my-service
provider:
  name: aws
  apiKeys:
    - myFirstKey
    - $opt:stage-myFirstKey
    - $env:MY_API_KEY # you can hide it in a serverless variable
  usagePlan:
    quota:
      limit: 5000
      offset: 2
      period: MONTH
    throttle:
      burstLimit: 200
      rateLimit: 100
functions:
  hello:
    events:
      - http:
          path: user/create
          method: get
          private: true

有关更多信息,请阅读以下文档: https://serverless.com/framework/docs/providers/aws/events/apigateway

【讨论】:

以上是关于如何使用无服务器创建 API 密钥并将其分配给创建的阶段 API?的主要内容,如果未能解决你的问题,请参考以下文章

为我的 API 实现 API 密钥

创建新的 NSManagedObject 并将其分配给新的 NSManagedObject *有时*会失败

在 for 循环中创建 CGRect 并将其分配给 UIView

如何以编程方式将按钮添加到 gridview 并将其分配给特定的代码隐藏函数?

从 API 接收数据并将其分配给模型的问题

以编程方式获取 Office 2013 产品密钥