【问题标题】:Cognito Lambda trigger socket timeout [duplicate]Cognito Lambda 触发器套接字超时 [重复]
【发布时间】:2019-06-14 09:19:14
【问题描述】:

我的 cognito 资源上有一个用于预注册触发器的 Lambda 触发器。

我正在关注这个例子 https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-sign-up.html#aws-lambda-triggers-pre-registration-example

我遇到了套接字超时,但没有找到太多关于此的文档

{
    "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);
        }
    });
});

知道是什么原因造成的吗?

【问题讨论】:

  • 发布触发代码
  • 复制示例中的意大利面。
  • @BrianWinant 更新了问题并提供了源代码。你认为我的 lambda 函数正在执行外部请求吗?当我设置 lambda 以连接到我的 RDS 时,我必须配置一个 IAM 角色。这样做时,它说如果我发出外部请求,我需要通过网关来完成这些请求?虽然 cognito 注册功能有效...
  • 事实证明,这是因为此确认函数具有阻止网络请求的 aws 资源的 IAM 角色。我不需要此功能的 IAM 角色。删除后,它可以完美运行。如果您确实需要资源访问,那么您必须使用 nat 网关

标签: amazon-web-services aws-lambda amazon-cognito amazon-cognito-triggers


【解决方案1】:

事实证明,这是因为 confirm 函数具有用于阻止网络请求的 aws 资源的 IAM 角色。我不需要此功能的 IAM 角色。删除后,它可以完美运行。如果确实需要资源访问,则必须使用 nat 网关

在这里查看更多:

AWS Lambda can't call Cognito Identity - IAM Role

https://gist.github.com/reggi/dc5f2620b7b4f515e68e46255ac042a7

【讨论】:

    【解决方案2】:

    您可以将函数的超时时间增加到 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 返回响应。

    【讨论】:

    • 我用我的 lambda 源代码更新了我的问题,我正在使用回调。你认为 Lambda 在我的 vpc 之外执行请求吗?当我设置我的 RDS 实例时,我必须向我的 lambda 函数添​​加一个 IAM 角色以访问 RDS 实例,并且它说要执行外部请求,它需要通过网关来完成。
    • 是的,这绝对是一个问题,我以前也遇到过,但它会是您的 RDS 安全组阻止连接,而不是 IAM 角色。查看您的日志和 Lambda 代码以进一步提供帮助会很有帮助,尤其是因为您正在遵循的示例教程似乎没有调用 RDS 资源。
    • 如果您没有正确处理 Lambda 代码中的错误,那么日志不会告诉我们太多
    • 我认为这是因为我添加了我的 lambda vpc 角色。这看起来很有希望:stackoverflow.com/questions/36067080/…。我稍后会尝试这个,如果它修复它,我会关闭这篇文章作为副本。感谢您的回答
    猜你喜欢
    • 2020-03-05
    • 1970-01-01
    • 2023-01-01
    • 2018-03-11
    • 2023-03-06
    • 2021-05-20
    • 2019-06-12
    • 2020-08-15
    • 2018-03-10
    相关资源
    最近更新 更多