Lambda执行角色vs AWS IAM:Cognito联合用户权限配置疑问
嘿,这个问题其实是很多刚接触Cognito+Lambda+API Gateway架构的开发者都会踩的坑,我来帮你把这两个角色的职责掰扯清楚——完全不需要两个权限相同的角色,它们干的是完全不同的活儿!
Lambda执行角色:Lambda函数的"身份卡"
这个角色是给Lambda函数本身用的,说白了就是Lambda运行时的"身份凭证"。不管你的请求是来自Cognito用户、其他服务还是手动触发,Lambda要访问任何AWS资源(比如读DynamoDB、写S3、调用另一个Lambda),都得靠这个角色的权限。
举个例子:如果你的Lambda需要从DynamoDB里取用户数据,那Lambda执行角色必须要有dynamodb:GetItem的权限,哪怕调用API的用户是超级管理员,只要Lambda执行角色没这个权限,照样会报错。
Cognito联合角色:控制用户能不能调用你的API
这个角色是给客户端用户用的!当用户通过Cognito完成认证后,客户端会拿到这个角色对应的临时AWS凭证,然后用这些凭证去调用你的API Gateway(因为你用了AWS_IAM授权,API Gateway会先校验这些凭证的权限)。
它的核心意义是做API访问的细粒度控制:比如你可以给普通用户组的Cognito角色只开放/user/*路径的API权限,给管理员组开放/admin/*的权限,这样不同用户能调用的API就不一样了。它管的是"用户能不能发起请求",而不是"请求到了Lambda之后能做什么"。
正确的权限配置姿势
1. Cognito角色的权限配置
只需要给它配置允许调用目标API Gateway的权限就行,不用管后端资源。比如:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:us-east-1:123456789012:abc123/*/*/*" } ] }
你还可以根据API的路径、HTTP方法进一步缩小范围,比如只允许调用/user/profile的GET请求,实现更精准的控制。
2. Lambda执行角色的权限配置
只需要配置Lambda运行时需要访问的后端资源权限,比如读取DynamoDB、发送SNS通知等,完全不需要包含API Gateway的调用权限。
为啥你会觉得需要相同权限?
应该是混淆了两个独立的权限校验环节:
- 第一关:API Gateway会校验用户的Cognito角色权限,确认这个用户有没有资格调用这个API;
- 第二关:Lambda运行时会用自己的执行角色去访问后端资源,确认Lambda有没有权限做这些操作。
这俩环节互不干扰,各司其职,所以根本不需要权限一致。
内容的提问来源于stack exchange,提问作者Kamil.H

