【问题标题】:Using an existing API key with the Serverless Framework in AWS将现有 API 密钥与 AWS 中的无服务器框架结合使用
【发布时间】:2017-03-28 12:42:16
【问题描述】:

serverless.yml 文件中,您可以指定 API 密钥的名称,以与已部署 API 中的函数一起使用。您列出 API 密钥名称,然后将您希望使用它保护的方法标记为私有。例如:

provider:
  name: aws
  runtime: nodejs4.3
  cfLogs: true
  apiKeys:
    - MyAPIKey

在部署时,框架生成 API 密钥并将其分配给函数。即使环境中已经存在同名密钥,它也会生成密钥。

有没有办法指定现有的 API 密钥,而不是让框架生成它?我们真的希望继续生成与部署分开的密钥。

【问题讨论】:

    标签: amazon-web-services aws-lambda serverless-framework


    【解决方案1】:

    我知道这是旧的,但我最近遇到了这个问题并解决了它,所以我想我会把我找到的东西放在这里。

    此答案基于此论坛帖子,我需要一些背景信息才能开始工作: 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 命名要求,您几乎可以为它们命名。

    无服务器确实添加了一些变量,但是:

    • DependsOn:这意味着具有引用的资源是按名称命名的。上面的无服务器文档链接列出了在您想要引用非自定义资源时使用的标准命名约定。例如,“ApiGatewayRestApi”是 serverless 在所有带有 http 事件的部署中创建的标准 api。
    • Ref:对堆栈中另一个对象的引用。在上面的示例中,它取代了显式传递 ApiId 或 UsagePlanId(将在堆栈创建时生成或检索)的需要。这意味着您可以在堆栈中设置对事物的依赖关系,而无需记录 Id。
    • 配额限制:可选。忽略这些将避免更新引用的使用计划。

    另外,关于使用计划和使用计划密钥的一些行为:

    • 使用计划一旦生成一次,将在部署之间保留其 UsagePlanId,即使您更改了计划的名称(通过 UsagePlanName)。我的测试是,在无服务器部署之外创建的 UsagePlanKeys 不会在更新时被删除,但我还没有进行足够广泛的测试以确保 100% 确定。
    • 可以在 API 部署范围之外创建使用计划,并使用 UsagePlanId 变量进行引用。

    您可能有兴趣在任何一个 api 部署之外创建您的身份验证结构,并使用 CloudFormation 的(通过无服务器)输出服务来获取您创建的每个资源的 ARN 和/或 ID:

    http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html

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

    tl;dr - 使用资源结构来制作原始 CloudFormation 配置。

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

    【讨论】:

    • 接受这个,因为它看起来非常有用(谢谢!),但我必须警告我没有尝试过。
    • 这似乎只有在创建堆栈后添加它才有效,否则它会给出以下内容:API Stage not found,参见。 @ 987654324@,我依靠错误的事情解决了这个问题(但这发生在稍后在 CF 中的 APIGateway::Deployment 之后。APIGateway::Deployment 有一个随机名称,所以你不能直接引用它)对我来说这是AppLambdaPermissionApiGateway
    猜你喜欢
    • 1970-01-01
    • 2018-07-29
    • 2019-07-04
    • 2021-12-09
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多