跨账号Lambda获取Cognito用户池创建用户权限失败排查
跨账号Lambda访问Cognito用户池的权限配置方案
问题核心
报错提示无基于身份的策略允许cognito-idp:AdminCreateUser操作,本质是你在Cognito所在账号(账号A)创建的跨账号角色未被Lambda所在账号(账号B)的Lambda正确调用——Lambda默认使用自身执行角色发起请求,而非Assume你在账号A创建的授权角色,导致权限不足。
正确配置步骤
1. 在Cognito所在账号(账号A)创建授权角色
创建仅允许账号B指定Lambda执行角色Assume的角色,并赋予Cognito创建用户的权限:
const accountBId = getEnvVars(this).THE_OTHER_ACCOUNT; // 替换为账号B中Lambda执行角色的ARN const accountBLambdaRoleArn = `arn:aws:iam::${accountBId}:role/your-lambda-execution-role-name`; const crossAccountCognitoRole = new Role(this, `${getEnvWithApp(this)}-cross-account-cognito-role`, { roleName: `${getEnvWithApp(this)}-cross-account-cognito-role`, assumedBy: new ArnPrincipal(accountBLambdaRoleArn), inlinePolicies: { CognitoAdminPolicy: new PolicyDocument({ statements: [ new PolicyStatement({ effect: Effect.ALLOW, actions: ["cognito-idp:AdminCreateUser"], resources: [this.userPool.userPoolArn], }), ], }), }, });
也可使用grant方法简化权限配置:
this.userPool.grant(crossAccountCognitoRole, "cognito-idp:AdminCreateUser");
2. 在Lambda所在账号(账号B)配置执行角色
给Lambda的执行角色添加Assume账号A授权角色的权限:
const lambdaExecutionRole = new Role(this, "LambdaExecutionRole", { assumedBy: new ServicePrincipal("lambda.amazonaws.com"), inlinePolicies: { AssumeCrossAccountRole: new PolicyDocument({ statements: [ new PolicyStatement({ effect: Effect.ALLOW, actions: ["sts:AssumeRole"], resources: ["arn:aws:iam::账号AID:role/cross-account-cognito-role"], // 替换为账号A授权角色的ARN }), ], }), }, });
3. 修改账号B的Lambda代码,显式Assume角色调用Cognito
Lambda需先通过STS服务获取账号A授权角色的临时凭证,再用该凭证调用Cognito接口:
const AWS = require('aws-sdk'); const sts = new AWS.STS(); exports.handler = async (event) => { // Assume账号A的授权角色 const assumeRoleParams = { RoleArn: 'arn:aws:iam::账号AID:role/cross-account-cognito-role', RoleSessionName: 'CognitoAdminSession' }; const { Credentials } = await sts.assumeRole(assumeRoleParams).promise(); // 使用临时凭证初始化Cognito客户端 const cognito = new AWS.CognitoIdentityServiceProvider({ accessKeyId: Credentials.AccessKeyId, secretAccessKey: Credentials.SecretAccessKey, sessionToken: Credentials.SessionToken, region: 'us-west-1' }); // 调用AdminCreateUser接口 const createUserParams = { UserPoolId: '你的用户池ID', Username: '目标用户名' // 按需添加其他参数(如临时密码、用户属性等) }; await cognito.adminCreateUser(createUserParams).promise(); return { statusCode: 200, body: '用户创建成功' }; };
常见排查点
- 信任策略范围错误:避免用
AccountPrincipal开放整个账号B的权限,限定为指定Lambda执行角色更安全。 - 未显式Assume角色:Lambda默认用自身执行角色发起请求,必须通过STS获取临时凭证才能使用跨账号权限。
- ARN匹配问题:检查Cognito用户池ARN、角色ARN的账号ID、区域、名称是否完全正确。
内容的提问来源于stack exchange,提问作者EeroLe
相关产品推荐
相关产品推荐

