You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨账号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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:17:21