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

时间:2018-05-01 22:13:30

标签: aws-lambda amazon-dynamodb amazon-iam serverless lambda-authorizer

我想生成一个自定义策略,为AWS自定义授权程序内的DynamoDB表提供fine grained access。这可能吗?

在无服务器中,我的配置如下所示:

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

我已经验证我的自定义授权程序正在被调用,并且成功调用API需要它生成的各种权限(sts:AssumeRolelambda:InvokeFunctionexecute-api:Invoke和其他权限)处理程序。所以我的自定义授权器正在运行,它提供的结果是必要的。

然而,当授权者包括dynamodb权限时,例如,像     {效果:“允许”,动作:“dynamodb:”,“资源”:“”}

我的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 node.js代码正在使用AWS节点SDK,它应该从实例环境中获取权限。我假设这将包括自定义授权程序生成的权限。

最后,我注意到AWS javascript SDK documentation on how credentials are loaded只说“执行角色为Lambda函数提供了运行和调用其他Web服务所需的凭据”。即,它没有提到自定义授权者发布的动态生成的凭证。

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

是否有使用我的自定义授权程序在我的API处理程序中生成的权限?

1 个答案:

答案 0 :(得分:3)

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

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

如果您希望为API函数调用对DynamoDB表或任何其他AWS资源等资源的特定访问权限,则必须在分配给Lambda函数的角色中配置这些资源。否则,您可以指定要调用的Lambda函数将赋予其授予其附加权限的角色。可以通过授权程序的上下文参数传递此角色。