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

AWS Lambda调用Amazon Cognito创建用户超时且失败问题求助

Lambda调用Cognito signUp超时且未创建用户排查方案

问题背景

在Amazon Cognito用户池中,通过Node.js Lambda函数创建用户时出现超时,未生成用户。代码执行到await cognito.signUp(params).promise()时超时,移除.promise()后超时消失但仍无用户创建。相关信息如下:

Lambda代码

async function createUserInCognito (email) {
  const userPoolId = 'eu-north-1_...';
  const clientId = '...';
  const cognito = new AWS.CognitoIdentityServiceProvider();

  // Additional attributes for user registration
  const userAttributes = [
    {
      Name: 'email',
      Value: email,
    },
  ];

  const params = {
    ClientId: clientId,
    Username: email, // Use email as the username
    UserAttributes: userAttributes,
    Password: 'tempPass123'; // 语法错误:此处应为逗号而非分号
  };


  try {
    const result = await cognito.signUp(params).promise();
    console.log('User registration successful:', result);

    // Optionally, confirm the user's email address
    await cognito.adminUpdateUserAttributes({
      UserAttributes: [
        {
          Name: 'email_verified',
          Value: 'true',
        },
      ],
      UserPoolId: userPoolId,
      Username: email,
    }).promise(); 
    console.log('Attribute updated')

    return {
      statusCode: 200,
      body: JSON.stringify({
        message: 'User registered successfully',
      }),
    };
  } catch (error) {
    console.error('Error registering user:', error);
    return {
      statusCode: 500,
      body: JSON.stringify({
        error: 'Error registering user',
      }),
    };
  }
  
};

IAM角色策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cognito-idp:AdminCreateUser",
                "cognito-idp:AdminUpdateUserAttributes",
                "cognito-idp:AdminInitiateAuth",
                "cognito-idp:AdminRespondToAuthChallenge",
                "cognito-idp:AdminSetUserPassword"
                // Add other necessary actions here
            ],
            "Resource": "*"
        }
    ]
}

CloudWatch日志

INFO Calling createUserInCognito...
INFO createUserInCognito
INFO AWS.CognitoIdentityServiceProvider() called
INFO params set
Task timed out after 3.01 seconds

核心问题解答

1. 首先需要解决的问题

(1)IAM权限缺失

当前Lambda使用signUp方法创建用户,但IAM策略中未包含cognito-idp:SignUp权限。权限不足会导致请求被拒绝,而Lambda在VPC内时,可能因网络配置问题无法及时收到错误响应,进而引发超时。

修复方法:在IAM策略的Action列表中添加"cognito-idp:SignUp":

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cognito-idp:SignUp", // 新增此权限
                "cognito-idp:AdminCreateUser",
                "cognito-idp:AdminUpdateUserAttributes",
                "cognito-idp:AdminInitiateAuth",
                "cognito-idp:AdminRespondToAuthChallenge",
                "cognito-idp:AdminSetUserPassword"
            ],
            "Resource": "*"
        }
    ]
}

(2)VPC网络访问问题

Lambda关联VPC后,需确保能正常访问Cognito服务端点:

  • 若通过公网访问:检查Lambda所在子网是否关联NAT网关,且安全组允许出站访问HTTPS(443端口)到公网。
  • 若使用VPC端点:创建Cognito Identity Provider的VPC接口端点(服务名称为com.amazonaws.eu-north-1.cognito-idp),并确保Lambda所在子网和安全组允许访问该端点。

(3)代码语法错误

代码中params对象的Password行末尾使用了分号(;),这会导致JavaScript语法错误,阻止代码正常执行。需改为逗号(,):

const params = {
  ClientId: clientId,
  Username: email,
  UserAttributes: userAttributes,
  Password: 'tempPass123' // 替换分号为逗号
};

2. .promise()是否必需?

是的,必须使用.promise()。

AWS SDK的signUp方法默认是回调模式,在async/await函数中,如果不调用.promise(),await无法等待异步操作完成,代码会直接跳过signUp请求继续执行后续逻辑——这就是移除.promise()后超时消失但用户未创建的原因:实际并未发起创建用户的请求。

只有调用.promise()后,才能将回调式方法转换为Promise,让await等待请求完成,确保用户创建逻辑被执行。

内容的提问来源于stack exchange,提问作者Peter Horvath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:52:11