Amazon web services 在AWS的无服务器框架中使用现有API密钥
在Amazon web services 在AWS的无服务器框架中使用现有API密钥,amazon-web-services,aws-lambda,serverless-framework,Amazon Web Services,Aws Lambda,Serverless Framework,在serverless.yml文件中,可以指定要与部署的API中的函数一起使用的API键的名称。列出API密钥名称,然后将希望使用它保护的方法标记为私有。例如: provider: name: aws runtime: nodejs4.3 cfLogs: true apiKeys: - MyAPIKey 部署时,框架生成API密钥并将其分配给函数。即使环境中已经存在同名的密钥,它也会生成密钥 有没有办法指定一个现有的API密钥,而不是让框架生成它?我们真的希望继续生成独
serverless.yml
文件中,可以指定要与部署的API中的函数一起使用的API键的名称。列出API密钥名称,然后将希望使用它保护的方法标记为私有。例如:
provider:
name: aws
runtime: nodejs4.3
cfLogs: true
apiKeys:
- MyAPIKey
部署时,框架生成API密钥并将其分配给函数。即使环境中已经存在同名的密钥,它也会生成密钥
有没有办法指定一个现有的API密钥,而不是让框架生成它?我们真的希望继续生成独立于部署的密钥。我知道这很旧,但我最近遇到了这个问题并解决了它,所以我想我应该把我发现的放在这里 这个答案是基于这个论坛的帖子,这需要一点背景让我开始工作: 使用参考资料部分,可以将自定义CloudFormation配置添加到部署中。这包括在启用特定api键的情况下添加自定义使用计划: 结构大致如下,说明如下:
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
这些资源中的每一个都是根据您给它们的密钥命名的。Serverless为您提供无服务器生成的资源名称的名称,以防您希望覆盖部分资源名称或引用它们。不过,只要符合CloudFormation命名要求,您几乎可以为它们命名任何东西
Serverless确实添加了一些变量,不过:
- DependsOn:这意味着带有引用的资源是按名称命名的。上面的无服务器文档链接列出了在引用非自定义资源时使用的标准命名约定。例如,“ApiGatewayRestApi”是serverless在所有具有http事件的部署中创建的标准api
- Ref:对堆栈中另一个对象的引用。在上面的示例中,它取代了显式传递APID或UsagePlanId(将在堆栈创建时生成或检索)的需要。这意味着您可以在不需要记录ID的情况下对堆栈中的内容设置依赖关系
- 配额和油门:可选。忽略这些将避免更新引用的使用计划
- 使用计划一旦生成一次,将在部署之间保留其UsagePlanId,即使您更改了计划的名称(通过UsagePlanName)。我的测试是,在无服务器部署之外创建的UsagePlanKeys不会在更新时删除,但我还没有对其进行足够广泛的测试,以100%确定
- 可以在API部署范围之外创建使用计划,并使用UsagePlanId变量在中引用
- 资源使您能够引用现有的键、计划和其他资源李>
- 输出允许您接收和保存可能要在部署中使用的对象的标识符
- 更新对象不会删除堆栈外部的关联(我已经看到),因此可以安全地将外部键添加到以这种方式创建的使用计划中
API阶段未找到
,cf.,我依靠错误的东西绕过了这一点(但这发生在后面的CF.APIGateway::Deployment中的APIGateway::Deployment有一个随机名称,因此您无法直接引用它)对我来说,这是applambdapigateway