我的应用程序使用Cognito用户池限制访问权限,以便每个用户可以在“私有”存储桶中访问自己的个人文件夹读/写。在“公共”存储桶中它是相同的,除了每个人都具有对所有内容的读访问权限并且只能访问他们自己的文件夹。当通过JavaScript S3 SDK访问时,一切正常。
我现在正尝试通过API网关实现访问权限,与访问S3的Lambda函数进行通信。
问题是看起来Lambda函数没有使用Cognito Userpool身份。如果我赋予Lambda函数角色全部S3访问权限,那么该函数可以访问S3并且该函数可以正常工作。但是,如果我有适当的角色策略来限制Cognito Userpool ID,如上所述,我将拒绝访问。
在我看来,Userpool Cognito Identity不是Lambda函数正在使用的。
有人可以为此设置建议正确的配置吗?
感谢
答案 0 :(得分:0)
API Gateway和Lambda不会自动支持此用例。
Lambda函数使用其执行角色的标识运行,因此其上下文将不包含Cognito用户池中的标识属性。 (Lambda函数中的上下文对象包含Lambda视角的上下文。)
API Gateway通过API Gateway中的$ context.authorizer.claims变量公开Cognito用户池标识信息。要从Lambda函数中访问此信息,您必须修改API网关中的正文映射模板,以通过请求正文将所需数据从$ context.authorizer.claims传递到Lambda函数。你是Lambda函数,然后像任何其他字段一样从请求体中读取这些信息。
在此方案中,没有机制根据Cognito用户自动限制对S3存储桶/对象的权限。您可以在Lambda函数中实现逻辑,以使用自定义代码强制执行它。