代码之家  ›  专栏  ›  技术社区  ›  Aneil Mallavarapu

如何在lambda代码中使用AWS Custom Authorizer中生成的权限?

  •  4
  • Aneil Mallavarapu  · 技术社区  · 6 年前

    我想生成一个自定义策略,该策略提供 fine grained access 到AWS自定义授权器中的DynamoDB表。这可能吗?

    在serverless中,我的配置如下所示:

    functions:
      APIAuthorizer:
        handler: src/services/auth/handlers.apiAuthorizer
        cors: true
      GraphQLAPI:
        handler: src/services/graphql/handlers.apiHandler
        events:
          - http:
              path: "/api"
              method: post
              cors: true
              authorizer:
                name: APIAuthorizer
                type: request
                resultTtlInSeconds: 0
    

    我已经验证了正在调用我的自定义授权程序,以及它生成的各种权限( sts:AssumeRole ,则, lambda:InvokeFunction ,则, execute-api:Invoke ,以及其他)是成功调用API处理程序所必需的。因此,我的自定义授权器正在工作,它提供的结果是必要的。

    但是,当授权人包括dynamodb权限时,例如 {效果:“允许”,动作:“发电机B: “,”资源“:” “}

    我的API处理程序(GraphQLAPI函数)失败,消息如下

    User: arn:aws:sts::<myaccountid>:assumed-role/<mydefaultrole>/myservice-mystage-GraphQLAPI is not authorized to perform: dynamodb:Query on resource: arn:aws:dynamodb:us-east-1:<myaccountId>:table/<mytable>/index/<someIndex> 
    

    (我注意到投诉是关于索引权限的,所以也尝试为该索引和/或所有索引添加特定权限,但这没有效果。)

    经过多次尝试后,底线是完全忽略了自定义授权者颁发的dynamodb权限。我的lambda节点。js代码正在使用AWS节点SDK,它应该从实例环境中获取权限。我假设这将包括自定义授权人生成的权限。

    最后,我注意到 AWS javascript SDK documentation on how credentials are loaded 仅表示“执行角色为Lambda函数提供运行和调用其他web服务所需的凭据”。一、 例如,它没有提到由自定义授权者发布的动态生成的凭据。

    这似乎可以解释我看到的行为。我的API处理程序仅具有静态定义的执行角色的权限(错误消息也表明了这一点),并且没有授予自定义授权者生成的权限。

    是否仍然可以使用自定义授权人在API处理程序中生成的权限?

    1 回复  |  直到 6 年前
        1
  •  5
  •   Mike Dinescu    6 年前

    我认为您误解了Lambda授权人的IAM策略输出。授权人的IAM策略输出旨在反映API网关在继续处理请求方面的结果。

    返回的策略不一定应用于调用的函数,而是应用于 调用 函数的。它只告诉API网关请求用户有权访问哪些API。

    如果希望为被调用的API函数提供对资源(如DynamoDB表)或任何其他AWS资源的特定访问权限,则必须在分配给Lambda函数的角色中配置这些资源。否则,您可以指定一个角色,要调用的Lambda函数将假定该角色授予它额外的权限。可以通过授权者的上下文参数传递此角色。