无服务器框架中的共享 Lambda 授权方设置

2024-02-04

我正在尝试创建一个自定义 Lambda 授权方,该授权方将在几个不同的服务/无服务器堆栈之间共享。如果我理解这里的文档https://serverless.com/framework/docs/providers/aws/events/apigateway/#note-while-using-authorizers-with-shared-api-gateway https://serverless.com/framework/docs/providers/aws/events/apigateway/#note-while-using-authorizers-with-shared-api-gateway,这意味着我需要在“公共资源”服务/无服务器堆栈中创建共享授权者资源,然后从其他服务引用该共享授权者。首先:我的理解正确吗?

如果我的理解是正确的,我的下一个问题就变成:我该怎么做?该文档没有为 lambda 授权者提供清晰的示例,因此我尝试自定义它:

functions:
authorizerFunc:
handler: authorizer/authorizer.handler
runtime: nodejs8.10

resources:
Resources:
authorizer:
Type: AWS::ApiGateway::Authorizer
Properties:
AuthorizerResultTtlInSeconds: 0
Name: Authorizer
Type: REQUEST
AuthorizerUri: ???
RestApiId:
Fn::ImportValue: myRestApiId

我不明白 AuthorizerUri 的语法应该是什么。我尝试过“Ref:authorizerFunc”、“Fn::GetAtt:[authorizerFunc, Arn]”等,但无济于事。

当我让authorizerUri 工作时,我是否只需为我的授权者资源添加一个输出,然后从包含我的 API Lambda 的服务中添加 Fn::ImportValue ?

链接到我在无服务器论坛上为后代提出的问题:https://forum.serverless.com/t/shared-lambda-authorizer/6447 https://forum.serverless.com/t/shared-lambda-authorizer/6447


编辑:显然我的答案现在已经过时了。对于较新版本的无服务器,请参阅其他答案。我不知道哪个答案是最好/最新的,但如果有人让我知道,我会更改该答案所接受的答案。

我最终让它工作起来,所以这是我设置我的autherizer的serverless.yml的方法:

service: user-admin-authorizer

custom:
  region: ${file(serverless.env.yml):${opt:stage}.REGION}

provider:
  name: aws
  region: ${self:custom.region}

functions:
  authorizer:
    handler: src/authorizer.handler
    runtime: nodejs8.10

resources:
  Resources:
    Authorizer:
      Type: AWS::ApiGateway::Authorizer
      Properties:
        Name: Authorizer
        Type: REQUEST
        AuthorizerUri:
          Fn::Join: [ "",
            [
              "arn:aws:apigateway:",
              "${self:custom.region}",
              ":lambda:path/",
              "2015-03-31/functions/",
              Fn::GetAtt: ["AuthorizerLambdaFunction", "Arn" ],
              "/invocations"
            ]]
        RestApiId:
          Fn::ImportValue: api-gateway:${opt:stage}:rest-api-id
    apiGatewayLambdaPermissions:
      Type: AWS::Lambda::Permission
      Properties:
        FunctionName:
          Fn::GetAtt: [ AuthorizerLambdaFunction, Arn]
        Action: lambda:InvokeFunction
        Principal:
          Fn::Join: [ "",
          [
            "apigateway.",
            Ref: AWS::URLSuffix
          ]]

  Outputs:
    AuthorizerRef:
      Value:
        Ref: Authorizer
      Export:
        Name: authorizer-ref:${opt:stage}

需要注意的是:尽管授权者函数名为“authorizer”,但与 GetAtt 一起使用时,需要将首字母大写并在其名称后附加“LambdaFunction”,因此“authorizer”由于某种原因变成了“AuthorizerLambdaFunction”。我还必须添加 lambda 权限资源。

API 网关资源还需要两个输出,即其 API ID 和 API 根资源 ID。以下是我的 API 网关的 serverless.yml 的设置方式:

resources:
  Resources:
    ApiGateway:
      Type: AWS::ApiGateway::RestApi
      Properties:
        Name: ApiGateway
  
  Outputs:
    ApiGatewayRestApiId:
      Value:
        Ref: ApiGateway
      Export:
        Name: api-gateway:${opt:stage}:rest-api-id
    ApiGatewayRestApiRootResourceId:
      Value:
        Fn::GetAtt:
          - ApiGateway
          - RootResourceId
      Export:
        Name: api-gateway:${opt:stage}:root-resource-id

现在您只需向其他服务指定它们应该使用此 API 网关(导入的值是 API 网关的输出):

provider:
  name: aws
  apiGateway:
    restApiId:
      Fn::ImportValue: api-gateway:${opt:stage}:rest-api-id
    restApiRootResourceId:
      Fn::ImportValue: api-gateway:${opt:stage}:root-resource-id

之后,可以将授权者添加到该服务中的各个功能中,如下所示:

          authorizer:
            type: CUSTOM
            authorizerId:
              Fn::ImportValue: authorizer-ref:${opt:stage}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无服务器框架中的共享 Lambda 授权方设置 的相关文章

随机推荐

  • 使用“expo build:android”构建 Android 应用程序后出现“应用程序未安装”错误

    我跑后expo build android我成功构建了 apk 文件 但是当我尝试在许多设备上安装它时 它没有被安装 并且显示 应用程序未安装 错误 image https res cloudinary com dqueufbs7 imag
  • 覆盖android中的文件删除

    是否可以重写 File delete 函数 每当我从其他应用程序 不由我的应用程序使用 删除 SD 卡中的任何文件时 我需要一个通知 例如该文件将被删除 我尝试过的示例代码片段是 public class ExtendFile extend
  • 主线程和UI线程一样吗?

    Android 文档说 与活动和其他组件一样 服务在应用程序进程的主线程中运行 这里的主线程和UI线程是同一个东西吗 看起来是这样 引自http android developers blogspot com 2009 05 painles
  • 在列中显示 php-cli 输出

    我想在 php cli 脚本的列中输出可变长度的数据 Example pepole Array Mirco Dellarovere gt Artista Nino Pepe gt Attore Zoe Yan gt Futurista Mi
  • 我在 GitHub 上的目录发生了什么?

    我在 git 存储库中添加了一个新的子目录 git add feeds 然后提交了这个并将其推送到 GitHub 但似乎我提交了一个符号链接 快捷方式 但没有提交其中的实际目录和文件 看这里 http github com G4EGK RS
  • 在 Core Data 中按属性获取对象

    在我的 iPhone 项目中 我想编写一个函数来检查我的 Core Data ManagedObjectContext 中是否存在具有特定属性给定值的对象 例如some property 如果已经有一个对象some property 12
  • 使用 pci_enable_msi_block

    我正在尝试在内核模块中启用多个 MSI irq 线 我正在 RC 模式下操作 问题是当我打电话时pci enable msi block 它不会分配超过 1 个 MSI 如果我打电话pci enable msi block dev 32 它
  • 为什么绑定不能与转换一起使用

    我有一个Circle和它的centerX财产绑定到text标签的属性 这是为了查看屏幕上对象的位置 每当我在圆圈上应用过渡时 绑定似乎就会停止工作 这是代码片段 ERRONEOUS PART OF CODE Circle circle ne
  • “系列对象是可变的,无法进行散列”错误

    我正在尝试让以下脚本正常工作 输入文件由 3 列组成 基因关联类型 基因名称和疾病名称 cols Gene type Gene name Disorder name no headers pd read csv orphanet infon
  • Rspec - 将输出格式化为进度/文档/HTML

    使用 Rspec 我希望能够看到标准进度条 and输出到包含生成的文档格式规格表的文件 and还生成了一个 html 文件 无需多次运行测试 如何分配多种格式以及这些格式的文件目标 我想出了如何做到这一点 您可以将以下内容添加到您的 rsp
  • Crosswalk WebView 中启用了 Chrome 的流量节省功能吗?

    在 Chrome 版本 45 0 2454 85 中 开发人员工具在窗口顶部显示黄色警告 并显示文本 考虑禁用Chrome 数据保护程序 https support google com chrome answer 2392284 hl e
  • 在 OSX 上安装了 GNU grep,但无法使用

    我尝试在 OSX 上安装 GNU grep 它似乎已安装 但我无法使用它 我已经使用自制程序完成了此操作 Macports 目前遇到了一些问题 所以我无法使用它 安装 brew tap homebrew dupes brew install
  • tomcat-dbcp 与 commons-dbcp

    这两个连接池库之间似乎存在很多混淆 我想知道哪一个更好 如果有的话 以下是我想提出的一些要点 有人可以验证吗 Tomcat DBCP 使用默认的 tomcat dbcp jar 该jar 将出现在 tomcat lib 目录中 你do no
  • 如何重新启动我自己的qt应用程序?

    我只是问自己如何重新启动我自己的qt应用程序 有人可以给我举个例子吗 要重新启动应用程序 请尝试 include
  • Matplotlib Savefig 不会覆盖旧文件

    这看起来一定是我的机器上的权限问题 在 Windows 10 上进行系统更新后 当我运行 import matplotlib pyplot as plt make figure plt plot 1 2 3 4 plt ylabel som
  • python 处理无尽的 XML

    我正在开发一个应用程序 我的工作只是为该应用程序开发一个示例 Python 接口 应用程序可以提供基于XML的文档 我可以通过HTTP Get方法获取文档 但问题是基于XML的文档是无限的 这意味着不会有结束元素 我知道文件应该由SAX来处
  • 在 JSX 中拥有变量属性的最佳方式是什么?

    希望我的问题很清楚 我主要是在寻找一种将属性动态附加到 JSX 输入的方法
  • Python 人们使用哪个路径模块或类来代替 os.path?

    只是想知道有多少人在 Python 中使用路径模块 例如 Jason Orendorff 的路径模块 而不是使用os path用于连接和分割路径 您是否使用过 Jason 的路径模块 http wiki python org moin Pa
  • 决策树中特定类的 Sklearn 决策规则

    我正在创建决策树 我的数据属于以下类型 X1 X2 X3 X50 Y 1 5 7 0 1 1 5 34 81 0 1 4 21 21 1 0 65 34 23 1 1 我正在尝试执行以下代码 X train data iloc 0 51 Y
  • 无服务器框架中的共享 Lambda 授权方设置

    我正在尝试创建一个自定义 Lambda 授权方 该授权方将在几个不同的服务 无服务器堆栈之间共享 如果我理解这里的文档https serverless com framework docs providers aws events apig