AWS Lambda:第一次成功访问后,Sequelize access denied 错误

AWS Lambda: Sequelize acess denied error after accessing successfully the first time

我有一个 AWS Lambda 使用 Sequelize ORMAWS Aurora 交谈。它在第一次访问时工作正常,但在未知的几分钟后,Lambda 出错并出现 Sequelize 错误 access denied for user@ip.address

async function connect() {
    const signer = new AWS.RDS.Signer({
        'region': region,
        'username': dbUsername,
        'hostname': dbEndpoint,
        'port': dbPort
    });

    let token;
    await signer.getAuthToken((error, result) => {
        if (error) {
            throw error;
        }

        token = result;
    });

    return token;
};

const sequelizeOptions = {
    'host': dbEndpoint,
    'port': dbPort,
    'ssl': true,
    'dialect': 'mysql',
    'dialectOptions': {
        'ssl': 'Amazon RDS',
        'authSwitchHandler': (data, callback) => {
            if (data.pluginName === 'mysql_clear_password') {
                const password = token + '[=10=]';
                const buffer = Buffer.from(password);
                callback(null, buffer);
            }
        }
    },
    pool: {
        max: 5,
        min: 0,
        acquire: 30000,
        idle: 10000
    }
};

let token;

exports.create = async () => {
    token = await connect();
    return new Sequelize(dbName, dbUsername, token, sequelizeOptions);
}

exports.buildResponse = resultsArray => {
    return {
        "statusCode": 200,
        headers: {
            "Access-Control-Allow-Origin": "*",
            "Access-Control-Allow-Credentials": true
        },
        "body": JSON.stringify(resultsArray),

        "isBase64Encoded": false
    };
};

参考:article

作为比我之前的评论更明确的答案发布。

简答

当您重用在 lambda 处理程序之外创建的令牌和数据库连接时,其中一个或两个超时。

更长的答案

容器中的 Lambdas 运行,这些容器将被重新使用,直到由于不活动或代码更改而被杀死,但是一旦容器 运行ning 只有处理函数内部的代码是运行 在后续调用中。

这意味着处理函数外的代码运行仅在启动新容器时运行(因为没有运行ning容器或接收到并发调用).

如果处理程序之外的代码创建了一些有时间限制的东西,比如创建一个数据库连接或接收一个有时间限制的令牌,并且 lambda 被调用得足够频繁而不会杀死容器,时间将简单地 运行出来。