首页 > 解决方案 > 允许 API 用户使用 Cognito 身份池中的执行角色运行 AWS Lambda

问题描述

我正在使用 AWS amplify 创建一个应用程序,用户可以在其中使用私有或公共文件访问级别上传图像,如文档中所述。除此之外,我还实现了一个 lambda 函数,该函数根据 API 网关的请求修改图像并返回修改后图像的链接。

我想要的是给定的用户应该能够调用 API 并只修改他自己的图像,而不是其他用户的图像;即允许 AWS lambda 函数使用来自 cognito 用户的执行角色。如果我允许 lambda 函数访问 S3 存储桶中的所有数据,那么它工作正常 - 但我不希望用户能够访问其他用户的图像。

我已经有一段时间了,尝试了不同的东西无济于事。

现在我已将 API 与用户池集成,如下所述: https ://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-enable-cognito-user-pool.html

然后我尝试遵循本指南: https ://aws.amazon.com/premiumsupport/knowledge-center/cognito-user-pool-group/

哪个不起作用,因为 lambda_handler 的事件变量中不存在“cognito:roles”(大概是因为没有用户池组?)。

在 AWS Amplify 应用程序中执行此操作的正确方法是什么?首先,我遵循了本指南: https ://aws.amazon.com/premiumsupport/knowledge-center/cognito-user-pool-group/

标签: amazon-s3aws-lambdaamazon-cognitoaws-amplify

解决方案


使用 API Gateway 请求映射并检查 Lambda 本身的权限

  1. 使用 API Gateway 请求映射将context.identity.cognitoIdentityId传递给 Lambda。只是它应该是与映射的 Lambda 集成(而不是代理集成)。另一个限制是 API 请求应该是 POST,对于 GET,如果您将 cognitoIdentityId 映射到查询字符串也是可能的。

  2. Lambda 可以访问 S3 中的所有文件

  3. 在 Lambda 本身中实施访问控制检查。Lambda 可以读取 S3 中文件的所有权限。然后查看所有者是否是 Cognito 用户。


推荐阅读