AWS Lambda:第一次成功访问后,Sequelize access denied 错误
AWS Lambda: Sequelize acess denied error after accessing successfully the first time
我有一个 AWS Lambda
使用 Sequelize ORM
与 AWS 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 被调用得足够频繁而不会杀死容器,时间将简单地 运行出来。
我有一个 AWS Lambda
使用 Sequelize ORM
与 AWS 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 被调用得足够频繁而不会杀死容器,时间将简单地 运行出来。