amazon-s3 - 允许 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/
解决方案
使用 API Gateway 请求映射并检查 Lambda 本身的权限:
使用 API Gateway 请求映射将context.identity.cognitoIdentityId传递给 Lambda。只是它应该是与映射的 Lambda 集成(而不是代理集成)。另一个限制是 API 请求应该是 POST,对于 GET,如果您将 cognitoIdentityId 映射到查询字符串也是可能的。
Lambda 可以访问 S3 中的所有文件
在 Lambda 本身中实施访问控制检查。Lambda 可以读取 S3 中文件的所有权限。然后查看所有者是否是 Cognito 用户。
推荐阅读
- laravel - Ratched Websocket 连接关闭
- javascript - 使用 Javascript 从 URL 中获取查询字符串值
- javascript - 声明的第一个类属性中的 ESLint 解析错误
- javascript - 在 javascript 中实现 drop it 功能但需要的答案没有得到它
- google-apps-script - 有什么方法可以为 Gmail 帐户创建的每个 Google 表单做一个吗?
- android - 如何在 Jetpack Compose 中将触摸事件分派给父可组合项
- macos - MacOs OpenGL 向前兼容性?
- c++ - 如何复制向量中的字符串
> 到矢量 ? - c# - .NET 5如何构建netcoreapp3.1?
- css - 在 useEffect 挂钩中使用 addEventListener 更新 classNames