在 AWS 中使用现有的 API 密钥和无服务器框架
Using an existing API key with the Serverless Framework in AWS
在 serverless.yml
文件中,您可以指定 API 密钥的名称,以与部署的 API 中的函数一起使用。您列出 API 密钥名称,然后将您希望使用它保护的方法标记为私有。例如:
provider:
name: aws
runtime: nodejs4.3
cfLogs: true
apiKeys:
- MyAPIKey
部署后,框架 生成 API 密钥 并将其分配给函数。即使环境中已存在同名密钥,它也会生成密钥。
有没有办法指定现有的 API 密钥,而不是让框架生成它?我们真的希望继续生成与部署分开的密钥。
我知道这已经过时了,但我最近遇到了这个问题并解决了它,所以我想我应该把我找到的东西放在这里。
此答案基于此论坛 post,我需要一些上下文才能开始工作:
https://forum.serverless.com/t/using-an-existing-api-key/770
使用资源部分可以将自定义 CloudFormation 配置添加到您的部署中。这包括添加启用特定 api 键的自定义使用计划:
https://serverless.com/framework/docs/providers/aws/guide/resources/
结构大致如下,附有说明:
resources:
Resources:
MyServiceUsagePlan:
Type: "AWS::ApiGateway::UsagePlan"
DependsOn: ApiGatewayRestApi
Properties:
UsagePlanName: ${self:service}-${self:provider.stage}-usagePlan
Quota:
Limit: 10000
Offset: 0
Period: DAY
Throttle:
BurstLimit: 20
RateLimit: 10
ApiStages:
-
ApiId:
Ref: ApiGatewayRestApi
Stage: ${self:provider.stage}
MyServiceKey:
Type: "AWS::ApiGateway::UsagePlanKey"
DependsOn: MyServiceUsagePlan
Properties :
KeyId: ${file(./conf/${self:provider.stage}.yml):MyServiceKeyId}
KeyType: API_KEY
UsagePlanId:
Ref: MyServiceUsagePlan
这些资源中的每一个都以您提供的密钥命名。无服务器为您提供无服务器生成的资源名称的名称,以防您希望覆盖它们的一部分或引用它们。不过,只要符合 CloudFormation 命名要求,您几乎可以为它们命名。
Serverless 确实添加了一些变量,但是:
- DependsOn:这意味着具有引用的资源是按名称命名的。上面的无服务器文档 link 列出了在您想要引用非自定义资源时使用的标准命名约定。例如,"ApiGatewayRestApi" 是无服务器在所有具有 http 事件的部署中创建的标准 api。
- Ref:对堆栈中另一个对象的引用。在上面的示例中,它取代了显式传递 ApiId 或 UsagePlanId(将在堆栈创建时生成或检索)的需要。这意味着您可以在堆栈中设置对事物的依赖关系,而无需记录 ID。
- Quota 和 Throttle:可选。将这些排除在外将避免更新引用的使用计划。
此外,关于使用计划和使用计划密钥的一些行为:
- 使用计划一旦生成,将在部署之间保留其 UsagePlanId,即使您更改计划名称(通过 UsagePlanName)也是如此。我的测试是,在无服务器部署之外创建的 UsagePlanKeys 不会在更新时被删除,但我还没有对此进行足够广泛的测试以确保 100% 确定。
- 可以在 API 部署范围之外创建使用计划,并在使用 UsagePlanId 变量时进行引用。
您可能有兴趣在任何 api 部署之外创建您的身份验证结构,并使用 CloudFormation 的(通过无服务器)输出服务来获取您的每个资源的 ARN and/or ID已创建:
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html
Outputs 使用与 Resources 相同的格式,可以在示例 aws serverless.yml 中看到示例。这将允许您独立于 api 本身更改使用计划并单独维护。您可以保存这些输出供您的 api 使用,使用 javascript 变量引用仅添加应在每个阶段、每个 api 基础上启用的计划。
tl;dr - 使用资源结构来制作原始 CloudFormation 配置。
- 资源使您能够引用现有密钥、计划和其他资源。
- 除其他外,Outputs 可让您接收并保存您可能希望跨部署使用的对象的标识符。
- 更新对象不会删除在堆栈外部建立的关联(我已经能够看到),因此将外部键添加到您以这种方式创建的使用计划是安全的。
在 serverless.yml
文件中,您可以指定 API 密钥的名称,以与部署的 API 中的函数一起使用。您列出 API 密钥名称,然后将您希望使用它保护的方法标记为私有。例如:
provider:
name: aws
runtime: nodejs4.3
cfLogs: true
apiKeys:
- MyAPIKey
部署后,框架 生成 API 密钥 并将其分配给函数。即使环境中已存在同名密钥,它也会生成密钥。
有没有办法指定现有的 API 密钥,而不是让框架生成它?我们真的希望继续生成与部署分开的密钥。
我知道这已经过时了,但我最近遇到了这个问题并解决了它,所以我想我应该把我找到的东西放在这里。
此答案基于此论坛 post,我需要一些上下文才能开始工作: https://forum.serverless.com/t/using-an-existing-api-key/770
使用资源部分可以将自定义 CloudFormation 配置添加到您的部署中。这包括添加启用特定 api 键的自定义使用计划:
https://serverless.com/framework/docs/providers/aws/guide/resources/
结构大致如下,附有说明:
resources:
Resources:
MyServiceUsagePlan:
Type: "AWS::ApiGateway::UsagePlan"
DependsOn: ApiGatewayRestApi
Properties:
UsagePlanName: ${self:service}-${self:provider.stage}-usagePlan
Quota:
Limit: 10000
Offset: 0
Period: DAY
Throttle:
BurstLimit: 20
RateLimit: 10
ApiStages:
-
ApiId:
Ref: ApiGatewayRestApi
Stage: ${self:provider.stage}
MyServiceKey:
Type: "AWS::ApiGateway::UsagePlanKey"
DependsOn: MyServiceUsagePlan
Properties :
KeyId: ${file(./conf/${self:provider.stage}.yml):MyServiceKeyId}
KeyType: API_KEY
UsagePlanId:
Ref: MyServiceUsagePlan
这些资源中的每一个都以您提供的密钥命名。无服务器为您提供无服务器生成的资源名称的名称,以防您希望覆盖它们的一部分或引用它们。不过,只要符合 CloudFormation 命名要求,您几乎可以为它们命名。
Serverless 确实添加了一些变量,但是:
- DependsOn:这意味着具有引用的资源是按名称命名的。上面的无服务器文档 link 列出了在您想要引用非自定义资源时使用的标准命名约定。例如,"ApiGatewayRestApi" 是无服务器在所有具有 http 事件的部署中创建的标准 api。
- Ref:对堆栈中另一个对象的引用。在上面的示例中,它取代了显式传递 ApiId 或 UsagePlanId(将在堆栈创建时生成或检索)的需要。这意味着您可以在堆栈中设置对事物的依赖关系,而无需记录 ID。
- Quota 和 Throttle:可选。将这些排除在外将避免更新引用的使用计划。
此外,关于使用计划和使用计划密钥的一些行为:
- 使用计划一旦生成,将在部署之间保留其 UsagePlanId,即使您更改计划名称(通过 UsagePlanName)也是如此。我的测试是,在无服务器部署之外创建的 UsagePlanKeys 不会在更新时被删除,但我还没有对此进行足够广泛的测试以确保 100% 确定。
- 可以在 API 部署范围之外创建使用计划,并在使用 UsagePlanId 变量时进行引用。
您可能有兴趣在任何 api 部署之外创建您的身份验证结构,并使用 CloudFormation 的(通过无服务器)输出服务来获取您的每个资源的 ARN and/or ID已创建:
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html
Outputs 使用与 Resources 相同的格式,可以在示例 aws serverless.yml 中看到示例。这将允许您独立于 api 本身更改使用计划并单独维护。您可以保存这些输出供您的 api 使用,使用 javascript 变量引用仅添加应在每个阶段、每个 api 基础上启用的计划。
tl;dr - 使用资源结构来制作原始 CloudFormation 配置。
- 资源使您能够引用现有密钥、计划和其他资源。
- 除其他外,Outputs 可让您接收并保存您可能希望跨部署使用的对象的标识符。
- 更新对象不会删除在堆栈外部建立的关联(我已经能够看到),因此将外部键添加到您以这种方式创建的使用计划是安全的。