Amazon web services Cognito Lambda触发器套接字超时
我的cognito资源中有一个Lambda触发器用于预签名触发器 我遵循这个例子 我得到了一个套接字超时,没有找到关于这个的很多文档Amazon web services Cognito Lambda触发器套接字超时,amazon-web-services,aws-lambda,amazon-cognito,amazon-cognito-triggers,Amazon Web Services,Aws Lambda,Amazon Cognito,Amazon Cognito Triggers,我的cognito资源中有一个Lambda触发器用于预签名触发器 我遵循这个例子 我得到了一个套接字超时,没有找到关于这个的很多文档 { "err": { "code": "UnexpectedLambdaException", "name": "UnexpectedLambdaException", "message": "arn:aws:lambda:region-arn:function:confirm failed with er
{
"err": {
"code": "UnexpectedLambdaException",
"name": "UnexpectedLambdaException",
"message": "arn:aws:lambda:region-arn:function:confirm failed with error Socket timeout while invoking Lambda function."
}
}
我的资源定义如下:
"ConfirmPermission" : {
"Type" : "AWS::Lambda::Permission",
"Properties" : {
"Action" : "lambda:InvokeFunction",
"FunctionName" : { "Fn::GetAtt" : [ "confirm", "Arn" ] },
"Principal" : "cognito-idp.amazonaws.com",
"SourceArn" : { "Fn::GetAtt" : [ "Auth", "Arn" ] }
}
},
"confirm" : {
"Type": "AWS::Serverless::Function",
"Properties": {
"Handler": "index.confirm",
"Runtime": "nodejs8.10",
"CodeUri": "./src",
"FunctionName": "confirm",
"ReservedConcurrentExecutions" : 15,
"Timeout": 50,
"Role": "arn:aws:iam::arn:role/lambda-vpc-role"
}
},
"AuthApp" : {
"Type" : "AWS::Cognito::UserPoolClient",
"Properties" : {
"UserPoolId" : {"Ref" : "Auth"}
}
},
"Auth" : {
"Type" : "AWS::Cognito::UserPool",
"Properties": {
"LambdaConfig" : {
"PreSignUp" : { "Fn::GetAtt" : [ "confirm", "Arn" ] }
},
"Schema" : [
{
"AttributeDataType": "String",
"Name": "email",
"Mutable": true,
"Required": true
},
{
"AttributeDataType": "String",
"Name": "family_name",
"Mutable": true,
"Required": true
},
{
"AttributeDataType": "String",
"Name": "given_name",
"Mutable": true,
"Required": true
}
],
"UsernameAttributes": ["email"]
}
}
Lambda函数:
index.js
let signIn = require('Auth/Auth.js');
exports.signIn = signIn.signIn;
exports.signUp = signIn.signUp;
exports.confirm = signIn.confirm;
注册/确认
exports.signUp = async (event, context) => {
var body = JSON.parse(event.body);
var emailAttribute = {
Name : 'email',
Value: body.email
};
var firstNameAttribute = {
Name: 'given_name',
Value: body.firstName
};
var lastNameAttribute = {
Name: 'family_name',
Value: body.lastName
};
var attributeList = [emailAttribute, firstNameAttribute, lastNameAttribute];
try {
var cognitoUser = await cognitoSignUp(body, attributeList);
return {
statusCode : 200,
body : JSON.stringify({res : cognitoUser})
};
} catch(e) {
return {
statusCode : 500,
body : JSON.stringify({err : e})
};
}
}
exports.confirm = (event, context, callback) => {
event.response.autoConfirmUser = true;
callback(null, event);
return;
}
var cognitoSignUp = (body, attributeList) => new Promise((acc, rej) => {
userPool.signUp(body.email, body.password, attributeList, null, function(err, res) {
if (err) {
console.log('ERROR');
console.log(err);
rej(err);
} else {
console.log('SUCCSSS');
acc(res);
}
});
});
你知道这是什么原因吗 您可以将函数的超时时间增加到15分900秒,如下所示
"confirm" : {
"Type": "AWS::Serverless::Function",
"Properties": {
"Handler": "index.confirm",
"Runtime": "nodejs8.10",
"CodeUri": "./src",
"FunctionName": "confirm",
"ReservedConcurrentExecutions" : 15,
"Timeout": 900,
"Role": "arn:aws:iam::arn:role/lambda-vpc-role"
}
},
除非你正在编码一些运行长时间分析的东西,否则你甚至不需要50秒,更不用说15分钟了。您应该检查日志中的某个地方是否有错误,并确保您正在呼叫
callback(null, event);
从Lambda返回响应。事实证明,这是因为confirm函数对aws资源具有IAM角色,用于阻止网络请求。我不需要在这个函数中使用IAM角色。拆下后,它工作得非常好。如果您确实需要访问资源,那么您必须使用nat网关 请参阅此处的更多信息:
发布示例中的触发器代码副本。@BrianWinant更新了问题并提供了源代码。您认为我的lambda函数正在执行外部请求吗?当我将lambda设置为连接到我的RDS时,我必须配置IAM角色。当这样做时,它说如果我发出外部请求,我需要通过网关来执行这些请求?虽然cognito注册功能可以工作……事实证明,这是因为该确认功能对aws资源具有IAM角色,可阻止网络请求。我不需要在这个函数中使用IAM角色。拆下后,它工作得非常好。如果您确实需要访问资源,那么您必须使用nat网关。我用lambda源代码更新了我的问题,我正在使用回调。你认为Lambda在我的专有网络之外执行请求吗?当我设置我的RDS实例时,我必须向lambda函数添加一个IAM角色来访问RDS实例,它说执行外部请求需要通过网关完成。是的,这肯定是一个问题,我以前也遇到过,但阻止连接的是您的RDS安全组,而不是IAM角色。查看您的日志和Lambda代码将非常有帮助,尤其是因为“您所遵循的示例教程似乎没有调用RDS资源。如果您;”我们没有正确处理Lambda代码中的错误,日志不会告诉我们,我想这是因为我添加了Lambda vpc角色。这看起来很有希望。我稍后会尝试这个,如果它修复了它,我将以副本的形式结束这篇文章。谢谢你的回答