Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/vb6/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 在AWS的无服务器框架中使用现有API密钥_Amazon Web Services_Aws Lambda_Serverless Framework - Fatal编程技术网

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部署之外创建身份验证结构,并使用CloudFormation的(通过无服务器)输出服务获取您创建的每个资源的ARN和/或ID:

输出使用与资源相同的格式,可以在示例aws serverless.yml中看到一个示例。这将允许您独立于API本身更改使用计划并单独维护。您可以保存这些输出以供api使用,使用javascript变量引用仅添加应在每个阶段、每个api的基础上启用的计划

tl;dr-使用资源结构进行原始云信息配置

  • 资源使您能够引用现有的键、计划和其他资源
  • 输出允许您接收和保存可能要在部署中使用的对象的标识符
  • 更新对象不会删除堆栈外部的关联(我已经看到),因此可以安全地将外部键添加到以这种方式创建的使用计划中

接受这一点是因为它看起来非常有用(谢谢!),但我必须提出警告,我没有尝试过它。只有在创建堆栈后添加它,这似乎才起作用,否则它会给出以下结果:
API阶段未找到
,cf.,我依靠错误的东西绕过了这一点(但这发生在后面的CF.APIGateway::Deployment中的APIGateway::Deployment有一个随机名称,因此您无法直接引用它)对我来说,这是
applambdapigateway