Lambda无cognito-idp:AdminCreateUser权限,求正确serverless.yml配置
问题原因
你之前的配置错误将Cognito操作权限放在了AssumeRolePolicyDocument节点下,该节点仅用于声明允许哪些服务扮演对应IAM角色,实际的资源操作权限需要定义在IAM角色的Policies节点内。
正确配置方案
方案1:使用Serverless Framework内置IAM配置(推荐,更简洁)
不需要手动定义完整IAM角色,直接在provider节点下添加权限声明即可:
service: your-service-name # 替换为你自己的服务名 provider: name: aws runtime: nodejs18.x # 替换为你实际使用的运行时 region: ap-southeast-1 # 替换为你实际的区域 # 新增IAM权限声明 iamRoleStatements: - Effect: Allow Action: cognito-idp:AdminCreateUser # 替换为你实际的Cognito用户池ARN,生产环境不建议直接使用*通配符 Resource: arn:aws:cognito-idp:<aws-region>:<aws-account-id>:userpool/<userpool-id> # 保留Lambda默认执行权限,用于输出日志 - Effect: Allow Action: - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents Resource: arn:aws:logs:*:*:* functions: orderSubmission: handler: api/order.create events: - http: path: /orders method: post
方案2:自定义IAM角色的正确写法
如果你需要完全自定义IAM角色,正确配置如下:
service: your-service-name # 替换为你自己的服务名 provider: name: aws runtime: nodejs18.x # 替换为你实际使用的运行时 region: ap-southeast-1 # 替换为你实际的区域 functions: orderSubmission: role: myCustRole0 handler: api/order.create events: - http: path: /orders method: post resources: Resources: myCustRole0: Type: AWS::IAM::Role Properties: RoleName: MyCustRole0 # AssumeRolePolicyDocument仅定义允许扮演角色的主体 AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: sts:AssumeRole # 实际操作权限定义在Policies节点下 Policies: - PolicyName: CognitoCreateUserPolicy PolicyDocument: Version: "2012-10-17" Statement: # Cognito用户创建权限 - Effect: Allow Action: cognito-idp:AdminCreateUser Resource: arn:aws:cognito-idp:<aws-region>:<aws-account-id>:userpool/<userpool-id> # Lambda基础日志权限 - Effect: Allow Action: - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents Resource: arn:aws:logs:*:*:*
注意事项
- 请将配置中的
<aws-region>、<aws-account-id>、<userpool-id>替换为你实际的AWS区域、账号ID、Cognito用户池ID - 生产环境建议避免使用
*通配符作为Resource值,尽量按最小权限原则限制权限范围 - 必须保留Lambda的日志相关权限,否则函数执行日志无法正常上报到CloudWatch,不利于问题排查
内容的提问来源于stack exchange,提问作者sasikt
相关产品推荐
相关产品推荐

