node.js - AWS Lambda : Sequelize acess denied error after accessing successfully the first time

标签 node.js amazon-web-services aws-lambda sequelize.js amazon-aurora

我有一个 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 + '\0';
                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 处理程序外部创建的 token 和数据库连接时,其中之一或两者都超时了。

更长的答案

Lambdas 在容器中运行,这些容器将被重用,直到由于不事件或代码更改而被终止,但是一旦容器运行,只有处理程序函数内部的代码在后续调用中运行。

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

如果处理程序之外的代码创建了一些有时间限制的东西,比如创建一个 db 连接或接收一个有时间限制的 token ,并且 lambda 被频繁调用而不会杀死容器,那么时间就会耗尽。

关于node.js - AWS Lambda : Sequelize acess denied error after accessing successfully the first time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51425143/

相关文章:

javascript - 当函数返回对象数组时如何使用 Promise

javascript - Node.js 支持 =>(箭头函数)

amazon-web-services - AWS 是否在其 amazonaws.com 子域(如 GAE 和 appspot.com)上为您提供默认 ssl 证书?

node.js - 无服务器框架 : Chrome "Error: spawn ETXTBSY",

python - 以时间间隔自动将日志从 CloudWatch 导出到 S3 存储桶

node.js - lodash 的 _.map 和 _.pluck 有什么区别?

node.js - fatal error : JS Allocation failed - process out of memory Aborted (core dumped) - Node. js

amazon-web-services - 具有 HTTPS 和仅限 VPN 访问的 AWS S3 静态站点

amazon-web-services - Dockerrun aws 硬编码内存

python - 无法在 AWS Lambda 上安装 Pandas