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
相关产品推荐
相关产品推荐

