如何在我的 lambda 代码中使用 AWS 自定义授权程序中生成的权限?

Ane*_*apu 4 amazon-dynamodb amazon-iam aws-lambda serverless lambda-authorizer

我想生成一个自定义策略,该策略提供对 AWS 自定义授权方内的 DynamoDB 表的细粒度访问。这可能吗?

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

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
Run Code Online (Sandbox Code Playgroud)

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

但是,当授权方包含 dynamodb 权限时,例如像 { Effect: "Allow", Action: "dynamodb: ", "Resource": " " }这样的语句

我的 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> 
Run Code Online (Sandbox Code Playgroud)

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

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

最后,我注意到有关如何加载凭据AWS javascript SDK 文档仅说明“执行角色为 Lambda 函数提供运行和调用其他 Web 服务所需的凭据”。即,它没有提到由自定义授权方颁发的动态生成的凭据。

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

无论如何要使用我的自定义授权方在我的 API 处理程序中生成的权限?

Mik*_*scu 5

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

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

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